【问题标题】:PHP store an anonymous function in an array (class context)PHP 将匿名函数存储在数组中(类上下文)
【发布时间】:2017-10-29 19:25:31
【问题描述】:

我知道在 PHP 中可以将匿名函数存储为数组值,但为什么它在类上下文中返回 NULL?

class firstClass {

    public static $functions = array();

    function __construct()
    {

        self::$functions += array( "echo" => function( $text ) { echo $text; }, "fruit" => "apple" );

    }

}

class secondClass {

    function __construct()
    {

        var_dump( firstClass::$functions ); // returns array(1){ ["fruit"] => string(5) => "apple" )
        var_dump( firstClass::$functions["echo"] ); // returns NULL

    }

}


$class = new firstClass;

【问题讨论】:

  • 第一个类的构造函数永远不会被调用。

标签: php arrays function class anonymous


【解决方案1】:

firstClass 构造函数永远不会调用,你使用的是静态变量

【讨论】:

  • 我忘了添加初始化,抱歉。但是正常值确实有效,这很奇怪..
【解决方案2】:

你得到 NULL 很有趣——当我测试你的代码时,我得到了预期的结果(即不是 NULL)。 试试下面的代码,也许这可以工作:(如果没有,尝试升级你的 PHP 版本?)

// ----------------------------------------------------
// First try with a simple array, outside a class
// ----------------------------------------------------

$test_array = array(
    "string" => "some string" ,
    "function" => function() {
        echo 'i am an anonymous function outside a Class';
    }
);

var_dump($test_array);



// ----------------------------------------------------
// Now try in a Class context
// ----------------------------------------------------

class classContext {

    public static $functions = array();

    public function __construct() {
        self::$functions += array(
            "string" => "some string in classContext" ,
            "function" => function() {
                echo 'i am an anonymous function inside a Class';
            }
        );
    }

}

class secondClass {

    public function __construct() {
        var_dump(classContext::$functions);
        var_dump(classContext::$functions['function']);
    }
}

new classContext;
new secondClass;

结果应该如下:

array(2) {
    ["string"]=>
      string(11) "some string"

    ["function"]=>
      object(Closure)#1 (0) {}
}

array(2) {
    ["string"]=>
      string(27) "some string in classContext"

    ["function"]=>
      object(Closure)#3 (1) {
          ["this"]=> object(classContext)#2 (0) {}
      }
}

object(Closure)#3 (1) {
    ["this"]=> object(classContext)#2 (0) {}
}

【讨论】:

  • 我很高兴@Ralph :)
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 2011-06-21
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2012-10-28
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多