理论 - 我们可以将可调用 PHP 视为可运行吗?
Theory - Can we consider a callable PHP being a runnable?
来自Java世界,Runnable函数式接口用于表示一段可运行(可执行)代码。
然而,在 PHP 中,有 callable 类型提示 http://php.net/manual/it/language.types.callable.php 可用于 类型提示 匿名函数(闭包),函数名称(以字符串形式给出),静态方法 class 或实例(以数组("Class","staticMethod")或数组($instance,'instanceMethod')形式给出)。
当然 Java 的 Runnable 不能 return 值(它的 run()
方法签名具有 void
作为 return 类型),但是作为在 PHP 闭包中,函数或方法实际上是 "ran"、"executed",可以随意调用它,我们可以断言我们可以考虑一个 Java Runnable(尽管 return 值和内部实现,它实际上是如何执行的)一个 PHP 可调用?
P.S:Java 也有一个 Callable 接口,http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html,其文档说明:
The Callable interface is similar to Runnable, in that both are
designed for classes whose instances are potentially executed by
another thread. A Runnable, however, does not return a result and
cannot throw a checked exception.
因此,如果重复游览,Runnable 类似于 Java 中的 Callable,因为它们都表示可运行代码,在 PHP 中没有 Runnable 或 Callable 接口,但有一个可调用类型提示它代表闭包、函数和方法,理论上我们可以认为它是可运行的,因为它也代表可执行代码吗?
感谢关注
据我了解,可调用对象代表某种形式的数据,php 解释为方法调用。这并不意味着可调用具有立即可执行代码,java 有。
PHP 然后将获取它所具有的参数并找到代码并执行它。我认为这是最大的区别。有时有立即可执行的代码,有时它必须查找代码在哪里 "\someclass::somestaticmethod"
我的想法。
PHP的callable在反射上更类似于Java的Method
class。您可以在 callable 上调用 call_user_func()
,在 Method
对象上调用 invoke()
,两者都带有参数。两者都返回值。最重要的是,在 Runnable
不同的地方,它被设计为在同一线程中 运行。
请记住,Runnable
实现 class 是普通的 POJO,没有什么特别之处。该接口只能传递给 Thread
构造函数。
Java的Runnable
是纯接口,可以配合一些类包括Thread
.
PHP的callable
是一个用于类型提示的伪类型。这是一个 "magic" 合约,确保将参数变量作为函数调用是安全的。
如果要使用 OOP 接口,请使用 Closure
。一些框架也使用 Closure
而不是 callable
.
例如,参见 Laravel Routing。
此外,一个主要区别是 Runnable
只能在没有参数的情况下调用,而 callable
参数可以是具有任意数量参数的任何函子。 Java 更严格,但是您可以定义或多或少通用的可调用类型:
public interface Callable {
public Object call(Object... parameters);
}
当然,对于强类型语言,这没有多大意义。
来自Java世界,Runnable函数式接口用于表示一段可运行(可执行)代码。
然而,在 PHP 中,有 callable 类型提示 http://php.net/manual/it/language.types.callable.php 可用于 类型提示 匿名函数(闭包),函数名称(以字符串形式给出),静态方法 class 或实例(以数组("Class","staticMethod")或数组($instance,'instanceMethod')形式给出)。
当然 Java 的 Runnable 不能 return 值(它的 run()
方法签名具有 void
作为 return 类型),但是作为在 PHP 闭包中,函数或方法实际上是 "ran"、"executed",可以随意调用它,我们可以断言我们可以考虑一个 Java Runnable(尽管 return 值和内部实现,它实际上是如何执行的)一个 PHP 可调用?
P.S:Java 也有一个 Callable 接口,http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html,其文档说明:
The Callable interface is similar to Runnable, in that both are designed for classes whose instances are potentially executed by another thread. A Runnable, however, does not return a result and cannot throw a checked exception.
因此,如果重复游览,Runnable 类似于 Java 中的 Callable,因为它们都表示可运行代码,在 PHP 中没有 Runnable 或 Callable 接口,但有一个可调用类型提示它代表闭包、函数和方法,理论上我们可以认为它是可运行的,因为它也代表可执行代码吗?
感谢关注
据我了解,可调用对象代表某种形式的数据,php 解释为方法调用。这并不意味着可调用具有立即可执行代码,java 有。
PHP 然后将获取它所具有的参数并找到代码并执行它。我认为这是最大的区别。有时有立即可执行的代码,有时它必须查找代码在哪里 "\someclass::somestaticmethod"
我的想法。
PHP的callable在反射上更类似于Java的Method
class。您可以在 callable 上调用 call_user_func()
,在 Method
对象上调用 invoke()
,两者都带有参数。两者都返回值。最重要的是,在 Runnable
不同的地方,它被设计为在同一线程中 运行。
请记住,Runnable
实现 class 是普通的 POJO,没有什么特别之处。该接口只能传递给 Thread
构造函数。
Java的Runnable
是纯接口,可以配合一些类包括Thread
.
PHP的callable
是一个用于类型提示的伪类型。这是一个 "magic" 合约,确保将参数变量作为函数调用是安全的。
如果要使用 OOP 接口,请使用 Closure
。一些框架也使用 Closure
而不是 callable
.
例如,参见 Laravel Routing。
此外,一个主要区别是 Runnable
只能在没有参数的情况下调用,而 callable
参数可以是具有任意数量参数的任何函子。 Java 更严格,但是您可以定义或多或少通用的可调用类型:
public interface Callable {
public Object call(Object... parameters);
}
当然,对于强类型语言,这没有多大意义。