为什么将新对象分配给PHP数组值会导致语法错误?

为什么将新对象分配给PHP数组值会导致语法错误?,php,arrays,key-value,Php,Arrays,Key Value,我试图定义一个私有静态数组,因为我使用的是PHP5.4,不能按以下方式使用常量数组: private static $regions = array( 'NA' => new Region('NA', 'North America'), 'EUW' => new Region('EUW', 'Europe West'), // etc... ); 不幸的是,这会导致语法错误。如果我改变新的区域。。。代码仅为测试目的的字符串,不再存在解析错误。这似乎意味着我无法将对象指

我试图定义一个私有静态数组,因为我使用的是PHP5.4,不能按以下方式使用常量数组:

private static $regions = array(
  'NA'  => new Region('NA', 'North America'),
  'EUW' => new Region('EUW', 'Europe West'),
  // etc...
);
不幸的是,这会导致语法错误。如果我改变新的区域。。。代码仅为测试目的的字符串,不再存在解析错误。这似乎意味着我无法将对象指定为PHP数组值,尽管声明它是可行的:

该值可以是任何类型


那么这里的问题是什么呢?

您不能这样做,因为数组是静态的,在类定义中不能使用对象或函数之类的动态值

举个例子,什么不起作用

这里我使用了一个函数,但正如我所说的,不能在类定义中将“动态”值指定给属性

class A {

    private $basename = basename(__FILE__);

}
下面的一个是对它有效的,因为我们在构造函数中赋值

class A {

    private $basename = "";

    public function __construct() {

        $this->basename = basename(__FILE__);

    }

}
因为这将是第一个可能的例子,你从这个类中创建的每个对象都可能是不同的!类定义就像是一个构建对象的计划,但是如果你可以在一个计划中使用函数,你每次都可以有一个不同的计划来构建对象,所以OOP就是这样工作的,它不允许你这么做

因此,您的示例不起作用,因为您不能在类定义中使用对象。上面例子的解决方案对你的也不起作用,因为数组也是静态的

因此,必须使数组为“非静态”,并在构造函数中将对象分配给数组,如下所示:

class A {

    private $regions = array(
      'NA'  => "",
      'EUW' => ""
      // etc...
    );

    public function __construct() {

        $this->regions["NA"] = new B();
        $this->regions["EUW"] = new B();

    }

}
因此,要想让您从官方渠道了解一些有趣的内容,请参见:

引用自:

它们的属性是通过使用关键字public、protected或private中的一个来定义的,后跟一个普通变量声明。此声明可能包括初始化,但此初始化必须是一个常量值,也就是说,它必须能够在编译时进行计算,并且必须不依赖于运行时信息才能进行计算


不能这样做,因为数组是静态的,在类定义中不能使用对象或函数之类的动态值

举个例子,什么不起作用

这里我使用了一个函数,但正如我所说的,不能在类定义中将“动态”值指定给属性

class A {

    private $basename = basename(__FILE__);

}
下面的一个是对它有效的,因为我们在构造函数中赋值

class A {

    private $basename = "";

    public function __construct() {

        $this->basename = basename(__FILE__);

    }

}
因为这将是第一个可能的例子,你从这个类中创建的每个对象都可能是不同的!类定义就像是一个构建对象的计划,但是如果你可以在一个计划中使用函数,你每次都可以有一个不同的计划来构建对象,所以OOP就是这样工作的,它不允许你这么做

因此,您的示例不起作用,因为您不能在类定义中使用对象。上面例子的解决方案对你的也不起作用,因为数组也是静态的

因此,必须使数组为“非静态”,并在构造函数中将对象分配给数组,如下所示:

class A {

    private $regions = array(
      'NA'  => "",
      'EUW' => ""
      // etc...
    );

    public function __construct() {

        $this->regions["NA"] = new B();
        $this->regions["EUW"] = new B();

    }

}
因此,要想让您从官方渠道了解一些有趣的内容,请参见:

引用自:

它们的属性是通过使用关键字public、protected或private中的一个来定义的,后跟一个普通变量声明。此声明可能包括初始化,但此初始化必须是一个常量值,也就是说,它必须能够在编译时进行计算,并且必须不依赖于运行时信息才能进行计算


获取“静态类变量”的一种方法 initialized是运行一个“init”函数,在该函数中,您可以执行任何您喜欢的操作,以在类中设置内部“静态变量”

当你面对“系统”的“限制”时。我认为与“规则”的一些差异是允许的。最简单的方法是在声明类后运行“init”函数

注意:“规则”是“文件”声明“类”,而“单独”文件对类执行“操作”。我认为,这里使用的这个用法,有点“ok”。隐马尔可夫模型。。。没有“一条真正的道路”吗

可以将其视为处理“类初始化”的“限制”

假设我想要一个初始化的“静态”日期类。只是为了表明您可以在“init”函数中执行任何操作

班级:

class A {

    /*
     *  What i want is a date and time object in this static variable
     */
    // private static $when = \DateTime::createFromFormat('Y-m-d H:m:s', '2014-04-01 11:59:00');

    // so i need to initialize it later...
    private static $when = null;

    // show the stored DateTime
    public static function showDateTime($format = \DATE_RFC850)
    {
        if (is_null(self::$when)) {
            return 'Is not set yet...';
        }
        else {
            return self::$when->format($format);
        }

    }

    public static function getWhen()
    {
        return self::$when;
    }

    public static function init($when = '2014-04-01 11:59:00')
    {
        self::$when = \DateTime::createFromFormat('Y-m-d H:i:s', $when);
    }
}

var_dump('Before Init: '. \A::showDateTime());

/*
 * now run the init()
 */
\A::init();

var_dump('After Init: '. \A::showDateTime());
结果:

string 'Before Init: Is not set yet...' (length=30)

string 'After Init: Tuesday, 01-Apr-14 11:59:00 BST' (length=43)

获取“静态类变量”的一种方法 initialized是运行一个“init”函数,在该函数中,您可以执行任何您喜欢的操作,以在类中设置内部“静态变量”

当你面对“系统”的“限制”时。我认为与“规则”的一些差异是允许的。最简单的方法是在声明类后运行“init”函数

注意:“规则”是“文件”声明“类”,而“单独”文件对类执行“操作”。我想是这样的 这里的用法是“ok”。隐马尔可夫模型。。。没有“一条真正的道路”吗

可以将其视为处理“类初始化”的“限制”

假设我想要一个初始化的“静态”日期类。只是为了表明您可以在“init”函数中执行任何操作

班级:

class A {

    /*
     *  What i want is a date and time object in this static variable
     */
    // private static $when = \DateTime::createFromFormat('Y-m-d H:m:s', '2014-04-01 11:59:00');

    // so i need to initialize it later...
    private static $when = null;

    // show the stored DateTime
    public static function showDateTime($format = \DATE_RFC850)
    {
        if (is_null(self::$when)) {
            return 'Is not set yet...';
        }
        else {
            return self::$when->format($format);
        }

    }

    public static function getWhen()
    {
        return self::$when;
    }

    public static function init($when = '2014-04-01 11:59:00')
    {
        self::$when = \DateTime::createFromFormat('Y-m-d H:i:s', $when);
    }
}

var_dump('Before Init: '. \A::showDateTime());

/*
 * now run the init()
 */
\A::init();

var_dump('After Init: '. \A::showDateTime());
结果:

string 'Before Init: Is not set yet...' (length=30)

string 'After Init: Tuesday, 01-Apr-14 11:59:00 BST' (length=43)

你不能这样做,因为数组是静态的,在类定义中你不能使用像对象或函数这样的动态值。那么你怎么做呢?一种方法是让你的“引导程序”调用一个“init”函数。或者在类定义之后,在定义类的同一个文件中调用init函数。@Matthugins写了一个答案并解释了一点,希望它能帮助你。你不能这样做,因为数组是静态的,在类定义中你不能使用像对象或函数这样的动态值。那么你怎么做呢?一种方法是有一个由“引导”调用的“init”函数。或者在类定义之后,在定义类的同一个文件中调用init函数。@Matthugins写了一个答案,并解释了更多希望它能帮助OP添加一些“积极”的方法,让OP的“代码”发挥作用吗?解释它为什么不起作用显然是“好的”。他们现在应该做什么?@RyanVincent看最后一个例子,我做了一个有效的例子。这是否有助于增加一些“积极”的方式,让OP可以让他们的“代码”发挥作用?解释它为什么不起作用显然是“好的”。从现在的位置看,他们应该做什么?@RyanVincent看最后一个例子,我做了一个有效的例子。