【问题标题】:A variable containing an anonymous function is an object and callable包含匿名函数的变量是一个对象并且可以调用
【发布时间】:2017-02-04 19:23:54
【问题描述】:

这让我很困惑,如果我只用一个函数来分配变量,它怎么可能是一个可调用对象。

如果我执行这个 sn-p:

$a = function () {};

if (is_object($a)) {
    echo "is Object\n";
}

if (is_callable($a)) {
    echo "is callable\n";
}

它输出:

is Object
is callable

【问题讨论】:

  • 正是因为你给它分配了一个函数;函数是可调用的,而可调用的分配给变量的机制是 Closure 类型的对象,因此它也是一个对象
  • 那么函数是PHP中的对象吗?哦...我明白了
  • 不,匿名函数,或者closures,是对象;像 strlen() 这样的函数不是闭包,也不是对象

标签: php oop closures anonymous-function


【解决方案1】:

对象可以定义一个magic method __invoke,这使得对象可调用。具有这种方法的对象既是可调用的对象,又是 。匿名函数在后台使用这种机制;匿名函数实际上是Closure 的一个实例,尽管它们有点特别:

除了这里列出的方法,这个类还有一个__invoke 方法。这是为了与其他实现调用魔法的类保持一致,因为此方法不用于调用函数。

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多