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

最初のものは真/偽の条件に対してはるかに信頼できるため、issetの代わりにarray_key_existsを使用することを常にお勧めします。

編集:また、コメントに記載されているように、変数は is $registryKeyand not$keyです。

于 2013-06-17T10:47:17.837 に答える
0

オブジェクトにマジック メソッド __isset()が含まれている可能性があり、コーディングが不十分な場合、奇妙な動作が発生する可能性があります。

また、$registry単純な配列ではなく、ArrayAccessインターフェイスを実装するオブジェクトである可能性もあります。__isset()次に、存在する場合は魔法のメソッドを探し、メソッドをOffsetExistsより正確に探す必要があります。

于 2013-06-17T15:20:31.583 に答える