2013-02-23 3 views
0

Проблема, о которой я сейчас думаю, может быть более вопросом стиля или того, что у вас есть. У меня есть одноэлементный класс в PHP. Когда я проверяю, если объект уже создан, я просто сделать:! Isset vs == null PHP, Singleton Класс

if(self::$instance == null) 
    self::$instance = new self(); 

Однако, я видел несколько реализаций одноплодного шаблона в PHP сделать Исеть:

if(!isset(self::$instance)) 
    self::$instance = new self(); 

По Насколько я понимаю, функциональных различий между этими двумя утверждениями нет. Один путь лучше, чем другой? Является ли один из способов более профессиональным, чем другой?

EDIT:

Вот код для всей картины внутри моего одноплодного класса:

private static $instance = null; 

private function __construct() { } 

public static function getInstance() { 
    if(self::$instance == null) { 
     self::$instance = new self(); 
    } 
     return $instance; 
} 

ответ

0

первой плохо; если $ instance не существует, это будет ошибка!

+0

это не плохо, он просто забыл, чтобы показать всю картину ... –

+0

Ну в этом случае $ экземпляр определяется как null в предыдущем коде. Позвольте мне показать вам, что у меня есть: private static $ instance = null; \t \t частная функция __construct() {} \t \t \t общественная статическая функция деЫпзЬапсе() { \t \t если (самостоятельно :: $ экземпляр == NULL) { \t \t \t самостоятельно :: $ Экземпляр = новое самосознание(); \t \t} \t \t return $ instance; \t} Так вы по-прежнему рекомендуете! Isset? –

+0

Хорошо, почему вы этого не сказали? – 2013-02-23 22:41:13

1

При условии, что у вас есть instance, определяемый как статическая переменная с защитой/закрытием, они функционально одинаковы, и на самом деле не имеет значения, какой из них вы используете.

Лично я рассматриваю isset как более в духе PHP и == NULL как ближе к Java, но это проблема стиля.

+0

Один из немногих псевдоопределений PHP имеет ... –

+0

Лично я предпочитаю проверку «null», но мне кажется неаккуратным использовать '==' вместо '===' - даже если снова не будет никакой функциональной разницы. – Jon

+0

@Jon В этом случае нет никакой разницы, но я соглашаюсь, что '== null' сильно меня трогает. Вероятно, это связано с тем, что свободная проверка равенства ничем не отличается от '! Self :: $ instance'. Конечно, '! Self :: $ instance' - это еще один, одинаково допустимый подход. – cwallenpoole

0

Используйте isset(), если вы не уверены, есть ли переменная или нет. В вашем случае переменная всегда есть. Кроме того, вы могли бы написать это следующим образом:

if(is_null(self::$instance)) 
    self::$instance = new self(); 

Я бы написал так:

public static function getInstance() { 
    return is_null(self::$instance) ? new self() : self::$instance; 
} 
Смежные вопросы