缺少PHP中数组的基础知识

缺少PHP中数组的基础知识,php,arrays,Php,Arrays,有人能解释为什么这不起作用吗: private static $bundles = array( 'page-builder' => array( 'Freya\\Bundle\\PageBuilder' => self::$baseDir . '/freya-bundle-pagebuilder/Freya/Bundle/PageBuilder' ); ); self::$baseDir是\uuuu DIR\uuuu。我认为在运行时PHP会对此进行

有人能解释为什么这不起作用吗:

private static $bundles = array(
    'page-builder' => array(
        'Freya\\Bundle\\PageBuilder' => self::$baseDir . '/freya-bundle-pagebuilder/Freya/Bundle/PageBuilder'
    );
);
self::$baseDir
\uuuu DIR\uuuu
。我认为在运行时PHP会对此进行评估,并将其保存为
path/to/some/dir/freya-…

确切的错误是:

分析错误:语法错误,第51行的/vagrant/local dev/content/mu plugins/Freya mu/bundles/BundleLoader.php中出现意外的“$baseDir”(T_变量),需要标识符(T_字符串)或类(T_类)

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

所以。。。我遗漏了什么?正确的方法是什么


PHP版本:5.5

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


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

该声明可能包含一个初始化,但该初始化必须是一个常量值——也就是说,它必须能够在编译时进行计算,并且必须不依赖于运行时信息才能进行计算

静态属性
$baseDir
包含的任何值在类定义实际执行(即运行时)之前都不可用

通过使用类常量,可以在一定程度上解决此问题:

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


我建议将
self:::$baseDir
完全从属性中删除,或者在构建过程中或在实际使用属性时将其插入。

除了其他答案之外,PHP 5.5不允许在默认值定义中使用表达式,包括串联,但5.6允许。()


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

如果
var\u dump(self::$baseDir)
,您会得到什么?
<?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;
class AClass {
    const MY_CONSTANT = 42;

    protected $property = self::MY_CONSTANT;
}