3

我想访问私有静态类属性并将值分配给私有静态类属性,并且我想使用“变量变量”的概念进行分配。访问有效,但分配无效。我尝试了以下方法:

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
    }
}

另外:我在想出一个准确而简洁的标题时遇到了一些麻烦。如果你觉得你理解我的问题并能想出一个更好的标题,请提出建议!

4

2 回答 2

2

对于版本 1,

您的数组可能是静态数组的副本,因此分配将仅在本地副本上。自 PHP 5 起,默认情况下,对象是通过引用传递的,但我认为数组仍然是通过副本传递的(除非您使用 & 进行特定引用)- 不能 100% 确定这一点

对于版本 2,

你应该试试self::${$arrayName}[$key]

有一个优先顺序问题,您希望 PHP 在解释 [] 之前评估您的“var 的 var”。如果没有{},PHP 会尝试评估类似

self::${$arrayName[$key]}

代替

self::${$arrayName}[$key]
于 2013-03-29T04:27:17.780 回答
1
<?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();

  ?>
于 2013-03-29T04:23:28.793 回答