将值分配给变量私有静态类属性,该属性是类内定义的数组
问题描述:
我想访问并将值分配给私有静态类属性,并且我想使用“变量变量”的概念进行赋值。访问作品,但分配不起作用。我曾尝试以下内容:将值分配给变量私有静态类属性,该属性是类内定义的数组
class AClass {
private static $testArray = array();
public static function aFunction() {
$key = 'something';
$arrayName = 'testArray';
$array = self::$$arrayName;
// accessing:
$value = $array[$key]; // This works, $value holds what self::testArray['something'] holds.
// assigning:
// version 1:
$array[$key] = $value; // No error, but self::testArray['something'] does not get updated
// version 2:
self::$$arrayName[$key] = $value; // Error
}
}
另外:我有一些麻烦提出了一个精确和简洁的标题。如果你觉得你理解我的问题,并可以想出一个更好的标题,请认为它!
答
对于第1版,
你的数组可能是静态数组的一个副本,因此分配将只在本地副本。 由于PHP 5中,对象是通过引用传递,默认情况下,但我认为阵列仍通过复制传递(除非有&你具体参考) - 不是100%地肯定这一点
对于第2版,
你应该尝试self::${$arrayName}[$key]
有一个优先次序的问题,你想PHP来解释[]之前评估你的“变种的变种”。如果没有{}
,PHP是试图评估类似
self::${$arrayName[$key]}
,而不是
self::${$arrayName}[$key]
答
<?php
class AClass {
private static $testArray = array('something'=>'check');
public static function aFunction() {
$key = 'something';
$arrayName = 'testArray';
$array = self::$$arrayName;
// accessing:
$value = $array[$key]; // This works, $value holds what self::testArray['something'] holds.
// assigning:
// version 1:
$array['something'] = 'now'; // No error, but self::testArray['something'] does not get updated
//updated value;
// need to assgig the value again to get it updated ......
/*
**if $a = '10';
$b = $a;
$b = 20 ; // will it update $a ..?? ANSWER is NO
same logic applies here**
if you use $b = &$a ; then case is different
*/
self::$$arrayName = $array;
print_r(self::$$arrayName);
// version 2:
// since you are using the key also you have to keep arrayName seperate "note {}"
self::${$arrayName}[$key] = $value;
print_r(self::$$arrayName);
}
}
$obj = new AClass();
$obj->aFunction();
?>
+0
希望它可以帮助你.. – alwaysLearn
对于第1版,你的数组可能是静态数组的一个副本,因此分配将只在本地副本。对于第二版,你是否尝试过类似'self :: $ {$ arrayName} [$ key]'?我认为在优先顺序上有失败 – MatRt
@MatRt:我没有尝试过它,它的工作!非常感谢。如果你把它写成一个,我会接受它作为答案。另外:为什么这个工作?我以为我知道php很好,但我从来没有见过类似的东西。 – DudeOnRock
添加了我的评论,你可以标记你的最佳答案。继续... :) – MatRt