为什么将新对象分配给PHP数组值会导致ParseError?

时间:2015-01-03 21:41:13

标签: php arrays key-value

我试图通过以下方式定义私有静态数组(因为我在PHP 5.4上并且不能使用常量数组):

private static $regions = array(
  'NA'  => new Region('NA', 'North America'),
  'EUW' => new Region('EUW', 'Europe West'),
  // etc...
);

不幸的是,这导致了ParseError。如果我将new Region(...)代码更改为仅用于测试目的的字符串,则不再存在解析错误。这似乎意味着我不能将对象分配为PHP数组值,尽管the documentation表明它是可行的:

  

该值可以是任何类型。

那么这里有什么问题?

2 个答案:

答案 0 :(得分:4)

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

作为一个例子,什么不起作用!

(这里我使用了一个函数,但正如我所说,你不能将'动态'值赋给类定义中的属性)

class A {

    private $basename = basename(__FILE__);

}

对此有用的是以下一个,因为我们在构造函数中赋值。

class A {

    private $basename = "";

    public function __construct() {

        $this->basename = basename(__FILE__);

    }

}

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


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

所以你必须使数组'unstatic'并在构造函数中将对象分配给数组,如下所示:

class A {

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

    public function __construct() {

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

    }

}

所以最后给你一些不错的阅读和官方消息来源:http://php.net/manual/en/language.oop5.properties.php

引用来自:

  

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

答案 1 :(得分:0)

获取静态类变量的一种方法'  初始化是运行' init()'功能,您可以随心所欲地设置内部静态变量'在课堂上。

当你正在处理一个“限制”时。 '系统'。与“规则”的一些​​差异'我认为是允许的。最简单的方法是在声明类后运行' init()函数。

注意:'规则'是一个'文件'宣布一个班级'那个分开的'文件做'动作'在课堂上。我认为,这里使用的这种用法是“好的”#。嗯......没有一种真正的方式'

将其视为处理“限制”问题。 '类初始化'。

想象一下,我想要一个初衷的静态'日期类。只是为了表明你可以在' 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)