Php 在类中使用访问静态数组时出现语法错误

Php 在类中使用访问静态数组时出现语法错误,php,Php,我想访问base_url键并将其分配给新的静态属性$app,但它给了我意外的语法错误[ 您希望访问变量,因此必须添加$ 阅读更多关于这方面的内容 不幸的是,您无法将任何变量(甚至静态变量)分配给其他静态属性,正如您在链接的手册页面中所看到的 与任何其他PHP静态变量一样,静态属性只能使用文字或常量进行初始化;不允许使用表达式。因此,虽然可以将静态属性初始化为整数或数组,但不能将其初始化为其他变量、函数返回值或对象 阅读手册: 与任何其他PHP静态变量一样,静态属性只能使用文字或常量进行初始化;不

我想访问base_url键并将其分配给新的静态属性$app,但它给了我意外的语法错误[


您希望访问变量,因此必须添加$

阅读更多关于这方面的内容

不幸的是,您无法将任何变量(甚至静态变量)分配给其他静态属性,正如您在链接的手册页面中所看到的

与任何其他PHP静态变量一样,静态属性只能使用文字或常量进行初始化;不允许使用表达式。因此,虽然可以将静态属性初始化为整数或数组,但不能将其初始化为其他变量、函数返回值或对象

阅读手册:

与任何其他PHP静态变量一样,静态属性只能使用文字或常量进行初始化;不允许使用表达式。因此,虽然可以将静态属性初始化为整数或数组,但不能将其初始化为其他变量、函数返回值或对象

在你认为这是一个严重的限制之前,让我告诉你为什么这是一个幸运的解脱:

self::$config['base_url']
但是,当您介绍我们都喜欢的后期静态绑定时:

class Foo
{
    public static $evil = array('bar' => 123);
    public static $check = self::$evil['bar'];
}
Foo::$check;//all is well

TL;TR:静态有点像超全局变量:您可以用一个常量表达式初始化它们,但它们不需要初始化状态,这将是初始疯狂,您初始化静态属性的方式尚未在PHP中实现 您可以查看此线程的说明:

然而,我在我的项目中是这样做的:

class Foo
{
    public static $evil = array('bar' => 123);
    public static $check = static::$evil['bar'];
}
class Bar extends Foo
{
    public static $evil = 123;
}
Bar::$check;//OOOPS

@RaheelKhan噢,我没注意到你想将其分配给另一个静态属性,而不仅仅是使用。请检查编辑后的答案。噢,该死,我可能需要使用getters来实现这一点:所以根据你的示例,我认为非静态属性的情况也是如此?我们会遇到同样的问题。@RaheelKhan:当然,还有一点:对于非静态属性,你不能初始化使用public$foo=$this->bar;alize/声明它们,因为在创建实例之前$this不存在。您必须使用构造函数使用$this初始化属性感谢您提供了很好的解决方案。
class Foo
{
    public static $evil = array('bar' => 123);
    public static $check = self::$evil['bar'];
}
Foo::$check;//all is well
class Foo
{
    public static $evil = array('bar' => 123);
    public static $check = static::$evil['bar'];
}
class Bar extends Foo
{
    public static $evil = 123;
}
Bar::$check;//OOOPS
<?php
class YourClass {
    public static $config       = NULL;
    public static $app_path     = NULL;
    public static $_INITIALIZED = FALSE;

    public static init() {
        if(!self::$_INITIALIZED) {
            self::$config = array(
                                'base_url' => '',
                                'environment' => '',
                                'database' => array(
                                    'dbdriver' => '',
                                    'dbhost'   => '',
                                    'dbname'   => '',
                                    'dbuser'   => '',
                                    'dbpass'   => ''
                                ));
            self::$app_path = self::config['base_url'];
            self::$_INITIALIZED = TRUE;
        }
    }
    // ....
    // Your Stuf ...
    // ....
}
YourClass::init();