2013-06-17 5 views
2

У меня есть класс с помощью этой функции:Что может привести к тому, что значение php будет истинным и ложным?

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

Не думайте, что это вызывает проблему, но должен ли '$ key' быть' $ registryKey'? – Jim

+0

Является ли self :: $ _ реестр определен? это массив? Не то, что ключ $ будет неопределенным, потому что его нет в области –

+0

@ Да, да, это – Benubird

ответ

0

Возможно, что у объекта есть magic method__isset(), что может привести к некоторым странным поведенческим действиям при плохой кодировке.

Также возможно, что $registry - это не простой массив, а объект, который реализует интерфейс ArrayAccess. Затем вы должны искать магический метод __isset(), если он есть, и более точно метод OffsetExists.

+0

Я не знал, что isset можно переопределить! Моя проблема оказалась в том, что метод был перегружен с заменой isset на функцию, которая вернула значение аргумента вместо true при успехе, которое я бы не заметил, если бы я не тестировал магические методы arrayaccess и isset , – Benubird

1

Isset проверяет, была ли инициализирована переменная или индекс и не всегда использует логические значения. Значение может точно также быть пустым и правильным способом проверки этого (поскольку РНР слабосвязанный) будет:

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

Или еще лучше;

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

Я всегда предлагаю использовать array_key_exists вместо isset, так как первый из них является гораздо более надежным для истинных/ложных условий.

Редактировать: Также, как и указано, ваша переменная $registryKey, а не $key.