周梦康 发表于 2019-01-20 56 次浏览

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

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);

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表