PHP类中的函数字面量

3
请看一下这段代码:
$array = array(
    'action' => function () { echo "this works"; }
);

class Test {
    public $array = array(
        "action" => function () { echo "this doesn't"; }
    );
}

第一个函数文本解析正常,但是第二个——类内的函数——会触发语法错误:

解析错误:语法错误,意外的“function”(T_FUNCTION)...

有人可以解释一下吗?这是一个错误吗?

编辑:这是最新的PHP版本:5.6.6


2
属性声明只能是常量/字面量。匿名函数是表达式。 - mario
1
使用构造函数,它会起作用,你不能在实例化时使用非文字的类变量进行赋值。它们需要在构造函数中设置。 - naththedeveloper
我的错误,似乎是函数字面量不是常量。 - user1813759
只是一点小提示,在PHP7中你会得到另一个警告:致命错误:常量表达式包含无效操作。而且它发生在与当前错误相比的下一行。 - Blaatpraat
https://dev59.com/MYjca4cB1Zd3GeqPv2Po#28835028 - Mateusz Mania
显示剩余3条评论
3个回答

7

从类中,它是一个属性!

属性规则:

声明可以包括初始化,但此初始化必须是常量值 - 也就是说,它必须能够在编译时评估,并且不能依赖于运行时信息以便被评估。

http://php.net/manual/en/language.oop5.properties.php


是的。看起来我应该更仔细地阅读文档 :( 不过...这很烦人。但谢谢! - user1813759
3
这是一个正确的答案,但他们的措辞不太明确:函数 function () { echo "this doesn't"; } 如何“依赖于运行时信息”? - georg
1
@georg 那是完全不同的问题。 - Linus Kleen

4

我没有机会在 PHP 5.6.6 上测试您的代码,但我认为这段代码可以解决您的问题。

class Test{

    public $array;

    function __construct(){

            $this -> array = array(

                'action'    =>  function (){

                    echo 'It works too';
                }
            );
    }
}

$test = new Test();
$test -> array['action']();

0

试试这样做,如果对你有用,请告诉我

<?php
$array = array('action' => function () { echo "this works"; });
class Test {
    public $arr;
    function __construct() {
        $this->arr = array("action" => function () { echo "this works too"; });
    }
    function getArr(){
        var_dump($this->arr);
    }
}

var_dump($array);
$obj = new Test();
$obj->getArr();

1
谢谢!那个方法可以用,但是它并没有让我的代码更容易阅读。我可能会把数据放到全局命名空间中。如果PHP的面向对象编程想要任性,那我也可以这样做。 - user1813759

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接