【问题标题】:Syntax error when accessing static array with in class使用类中访问静态数组时出现语法错误
【发布时间】:2015-09-15 16:47:05
【问题描述】:
public static $config = array(
    'base_url' => '',
    'environment' => '',
    'database' => array(
        'dbdriver' => '',
        'dbhost'   => '',
        'dbname'   => '',
        'dbuser'   => '',
        'dbpass'   => ''
    ),

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

public static $app_path = self::config['base_url']; //unexpected [ error

【问题讨论】:

    标签: php


    【解决方案1】:

    你想访问变量所以你必须添加$

    self::$config['base_url']
    

    阅读更多关于 here 的信息。

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

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

    【讨论】:

    • @RaheelKhan 哦,我错过了您想将其分配给另一个静态属性,而不仅仅是使用。检查编辑的答案。
    • 哦该死的,我可能需要为此使用吸气剂:(
    【解决方案2】:

    阅读手册:

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

    Right here

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

    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
    

    TL;TR:静态变量类似于超级全局变量:您可以使用常量表达式初始化它们,但它们不能要求初始化状态,那将是初始疯狂

    【讨论】:

    • 因此,通过您的示例,我认为非静态属性也是如此?我们会遇到同样的问题。
    • @RaheelKhan:当然,更重要的是:对于非静态属性,您不能使用public $foo = $this->bar; 初始化/声明它们,因为在创建实例之前$this 不存在。您必须使用构造函数来使用 $this 初始化属性
    【解决方案3】:

    您初始化(静态)属性的方式尚未在 PHP 中实现
    你可以查看这个帖子的解释:https://stackoverflow.com/a/1633024/4098311

    但是,这就是我在项目中的做法:

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

    【讨论】:

    • 感谢您的出色解决方案。
    猜你喜欢
    • 2012-05-11
    • 2019-06-28
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2019-05-24
    • 2020-10-14
    相关资源
    最近更新 更多