理论 - 我们可以将可调用 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);

}

当然,对于强类型语言,这没有多大意义。