PHP类中的函数文字

Posted

技术标签:

【中文标题】PHP类中的函数文字【英文标题】:Function literal in PHP class 【发布时间】:2015-05-04 03:46:59 【问题描述】:

请看一下这段代码:

$array = array(
    'action' => function ()  echo "this works"; 
);

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

第一个函数文字解析得很好,但第二个 - 类中的那个 - 触发语法错误:

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

谁能给我解释一下?这是一个错误吗?

编辑:这是最新的 php:5.6.6

【问题讨论】:

这到底是哪个 PHP 版本? 属性声明只能是常量/文字。匿名函数是表达式。 使用构造函数,它会起作用,你不能在实例化时为类变量分配非文字。它们需要在构造函数中设置。 看来是我的错。显然函数字面量不是恒定的。 只是一个旁注,在 PHP7 中你会得到另一个警告:致命错误:常量表达式包含无效操作。与您当前的错误相比,它发生在下一行。 【参考方案1】:

从类中它是一个属性!

属性规则:

声明可能包含初始化,但这 初始化必须是一个常数值——也就是说,它必须能够 在编译时进行评估,并且必须不依赖于运行时 信息以便进行评估。

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

【讨论】:

是的。似乎我应该更彻底地阅读文档:(仍然......这很烦人。但是谢谢! 这是一个正确的答案,但他们的措辞是模棱两可的:function () echo "this doesn't"; “取决于运行时信息”到底是怎么回事? @georg 这完全是另一个问题。【参考方案2】:

我没有机会在 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']();

【讨论】:

【参考方案3】:

试试这个,让我知道这是否适合你

<?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();

【讨论】:

谢谢!这会起作用,但它并不能完全使我的代码更易于阅读。我可能会将数据放入全局命名空间。如果 PHP 的 OOP 想要任性,我也可以。

以上是关于PHP类中的函数文字的主要内容,如果未能解决你的问题,请参考以下文章

如何在PHP中的构造函数类中添加方法?

PHP通过反射方法调用执行类中的私有方法

为啥不能在 PHP 中从抽象类中调用抽象函数?

PHP:每当调用子类中的函数时调用函数

PHP的静态及类中声明的常量

PHP怎么调用其他类的方法