为什么将新对象分配给PHP数组值会导致语法错误?
我试图定义一个私有静态数组,因为我使用的是PHP5.4,不能按以下方式使用常量数组:为什么将新对象分配给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... ); 不幸的是,这会导致语法错误。如果我改变新的区域。。。代码仅为测试目的的字符串,不再存在解析错误。这似乎意味着我无法将对象指
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看最后一个例子,我做了一个有效的例子。