我试图通过以下方式定义私有静态数组(因为我在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表明它是可行的:
该值可以是任何类型。
那么这里有什么问题?
答案 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)