带有显式传递引用的PHP单例类会破坏单例

时间:2017-04-26 18:43:27

标签: php singleton pass-by-reference

我们必须对内部缓存类进行一些修改以修复PHP7的问题。在这个过程中,我们发现了一些奇怪的代码。在下面的示例中(从实际代码中提取),您可以看到实例化新Cache实例的两行。示例中的活动行使缓存行为像单例一样,没问题。

它下面的注释掉的行是我们替换的,每次调用它都会返回一个不同的实例。当新类已作为参考否定引用时,它似乎具有&符号。我想了解原因。

我应该提到" =&" PHP7上的方法错误,这就是我们需要修复它的原因。只是对PHP5.6用它做什么感兴趣。

<?php

class Cache {
    public $prefix;

    public static function &getInstance($prefix = '') {
        static $instance;

        if (!$instance) {
            $instance = new Cache($prefix);
            // $instance =& new Cache($prefix);
        }

        return $instance;
    }

    public function __construct($prefix = '') {
        $this->prefix = $prefix;
    }
}

// Example Runs

// When using just "=", one instance, acts like a singleton
$cache = Cache::getInstance('1000');
$cache2 = Cache::getInstance('2000');
echo $cache->prefix . " | " . $cache2->prefix; // "1000|1000"

// When using "=&", multiple instances, no longer acts like a singleton
$cache = Cache::getInstance('1000');
$cache2 = Cache::getInstance('2000');
echo $cache->prefix . " | " . $cache2->prefix; // "1000|2000"

0 个答案:

没有答案