2

我有一个具有此功能的课程:

public static function getSingleton($modelClass='', array $arguments=array())
{
    $registryKey = '_singleton/'.$modelClass;
    if (!isset(self::$_registry[$registryKey])) {
        if (isset(self::$_registry[$registryKey])) {
            throw new Exception('Mage registry key "'.$registryKey.'" already exists');
        }
        self::$_registry[$registryKey] = self::getModel($modelClass, $arguments);
    }
    return self::$_registry[$registryKey];
}

正在抛出异常。如何抛出异常?我想不出 isset() 和 !isset() 都可以返回 true 的任何方式——但它们确实如此!这怎么可能发生?我正在使用APC,这与它有什么关系吗?我什至该如何调试呢?

4

2 回答 2

1

Isset 测试变量或索引是否已初始化并且并不总是使用布尔值。该值也可以是 null 并且测试它的正确方法(因为 PHP 是松散耦合的)将是:

if (isset(self::$_registry[$key]) === true)

或者更好;

if (array_key_exists($key, self::$_registry))

我总是建议使用array_key_exists而不是isset,因为第一个对于真/假条件更可靠。

编辑:另外,就像评论所说的那样 - 你的变量是$registryKey而不是$key.

于 2013-06-17T10:47:17.837 回答
0

对象可能有魔法方法 __isset(),如果编码不好,可能会导致一些奇怪的行为。

此外,它可能$registry不是一个简单的数组,而是一个实现ArrayAccess接口的对象。那么你必须寻找__isset()神奇的方法,如果存在的话,OffsetExists更准确的方法。

于 2013-06-17T15:20:31.583 回答