周梦康 发表于 2019-01-20 635 次浏览
class HashKey{
    public $realKey;
}

class KeyManager
{
    protected static function f1(string $alias){
        static $res = [];

        if (!isset($res[$alias])) {
            $hashKey = new HashKey();
            $res[$alias] = $hashKey;
        }
        var_dump($res);
        return $res[$alias];
    }

    public static function f2(string $alias,$key)
    {
        $hashKey = self::f1($alias);
        $hashKey->realKey = $key;
        return $hashKey;
    }
}

$res = KeyManager::f2("a",1);
var_dump($res);
$res = KeyManager::f2("a",2);
var_dump($res);

结果

array(1) {
  ["a"]=>
  object(HashKey)#1 (1) {
    ["realKey"]=>
    NULL
  }
}
object(HashKey)#1 (1) {
  ["realKey"]=>
  int(1)
}
array(1) {
  ["a"]=>
  object(HashKey)#1 (1) {
    ["realKey"]=>
    int(1)
  }
}
object(HashKey)#1 (1) {
  ["realKey"]=>
  int(2)
}

虽然每次KeyManager::f2都会对realKey字段重新重新复制,但是修改到KeyManager::f1里面的静态变量$res并非我们的本意。

做如下修改

$hashKey = clone self::f1($alias);

评论列表