什么可能导致PHP值真实和错误?

时间:2013-06-17 10:42:59

标签: php debugging boolean-logic

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

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,这可能与它有什么关系吗?我怎么会调试这个?

2 个答案:

答案 0 :(得分:1)

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

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

或者更好;

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

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

修改此外,与所述评论一样 - 您的变量为$registryKey而非$key

答案 1 :(得分:0)

对象可能有magic method __isset(),如果编码不当,可能会导致一些奇怪的行为。

此外,$registry可能不是一个简单的数组,而是一个实现ArrayAccess接口的对象。然后,您必须查找__isset()魔术方法(如果存在),方法OffsetExists更准确。