2017-05-29 137 views
0

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

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; 
+0

第一类的构造函数是永远调用。 – user3409662

回答

0

这很有趣,你得到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) {} 
} 
+0

这确实有效!谢谢! – Ralph

+0

我的荣幸@Ralph :) – sammysaglam

1

的Firstclass构造函数永远不会调用,您可以使用一个静态变量

+0

我忘了添加initalisation,抱歉。但一个正常的价值确实有效,这是非常奇怪的。 – Ralph