一个类中的闭包数组

时间:2013-10-10 18:49:06

标签: php

看来你不能在类的范围内定义一组可调用方法。为什么不呢?

为什么这是有效的PHP(见http://3v4l.org/1JeQr

$methods = array(
    1 => function($subject, $value){
        return ($subject == $value);
    }
);

var_dump($methods[1]('a', 'a'));

但不是这样(见http://3v4l.org/FL449

class Foo {
    public static $methods = array(
        1 => function($subject, $value){
            return ($subject == $value);
        }
    );
}

var_dump(Foo::$methods[1]('a', 'a'));

2 个答案:

答案 0 :(得分:5)

因为我在手机上工作,所以答案很快(最终可以稍后编辑。

定义闭包实际上会对Closure类型的对象执行实例化。 PHP仅支持本机内部类型作为类的默认值,这意味着构造闭包显然不起作用。

答案 1 :(得分:-1)

这是因为类中的属性定义只允许您指定 简单直接值 。类常量分配更具限制性。 这意味着在属性定义范围中不允许从函数派生任何值,不使用派生值或对象填充的数组或任何算术。

如果要在初始化对象时分配闭包数组,可以在类的构造中自由地执行此操作。像这样:

class Foo {
    public static $methods;

    function __construct() {
        $this->methods = array(
                               1 => function($subject, $value) {
                                       return ($subject == $value);
                                    }
                               );
    }
}