【问题标题】:Missing the fundamentals of arrays in PHP缺少 PHP 中数组的基础知识
【发布时间】:2015-08-19 23:58:14
【问题描述】:

谁能解释一下为什么这不起作用:

private static $bundles = array(
    'page-builder' => array(
        'Freya\\Bundle\\PageBuilder' => self::$baseDir . '/freya-bundle-pagebuilder/Freya/Bundle/PageBuilder'
    );
);

self::$baseDir__DIR__。我认为在运行时 PHP 会评估它并将其保存为 path/to/some/dir/freya- ....

确切的错误是:

解析错误:语法错误,意外的 '$baseDir' (T_VARIABLE),在 /vagrant/local-dev/content/mu-plugins/Freya-MU/bundles 中需要标识符 (T_STRING) 或类 (T_CLASS) /BundleLoader.php 第 51 行

第 51 行,是:'Freya\\Bundle\\PageBuilder' => self::$baseDir . '/freya-bundle-pagebuilder/Freya/Bundle/PageBuilder'

所以...我错过了什么以及正确的方法是什么?

PHP 版本: 5.5

【问题讨论】:

  • var_dump(self::$baseDir) 会得到什么?

标签: php arrays


【解决方案1】:

PHP 不允许这样做。 PHP 属性可以初始化为常量值,但只能使用在编译时可用的常量值。来自manual

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

无论你的静态属性 $baseDir 持有什么值,在类定义实际执行(即运行时)之前都不可用。

您可以通过使用类constant在一定程度上解决这个问题:

class AClass {
    const MY_CONSTANT = 42;

    protected $property = self::MY_CONSTANT;
}

类常量在编译时进行评估,这是您需要做的。但请注意,您不能进行任何其他操作(例如,将 $property 初始化为 self::MY_CONSTANT * 3

我建议将self::$baseDir 完全留在您的财产之外,并在施工期间或实际使用您的财产时将其注入。

【讨论】:

    【解决方案2】:

    在类中声明属性时不能使用变量。查看PHP manual 中的无效属性声明。

    <?php
    class SimpleClass
    {
       // invalid property declarations:
       public $var1 = 'hello ' . 'world';
       public $var2 = <<<EOD
    hello world
    EOD;
       public $var3 = 1+2;
       public $var4 = self::myStaticMethod();
       public $var5 = $myVar;
    

    这是因为 PHP 在解析/编译您的类时不执行任何代码。

    【讨论】:

      【解决方案3】:

      除了其他答案之外:PHP 5.5 不允许在默认值定义中使用表达式,包括连接,但 5.6 允许。 (http://php.net/manual/en/migration56.new-features.php)

      所以,基本上,要么升级你的 PHP 版本,要么从方法中设置 $bundles 的值。否则你的数组没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 2012-05-20
        • 1970-01-01
        • 2014-04-16
        • 2018-05-25
        相关资源
        最近更新 更多