#php #design-patterns #singleton
#php #шаблоны проектирования #singleton
Вопрос:
У меня есть класс singleton, используемый для инициализации error_handling.
Класс как есть принимает объект Zend_Config и необязательный параметр $appMode в качестве параметра, чтобы разрешить переопределение определенной константы APPMODE при тестировании этого класса. Все в порядке, если я создаю объект с нестатическими свойствами, но инициализация статического свойства работает не так, как я ожидал при вызове обычного getInstance().
class ErrorHandling{
private static $instance;
private static $_appMode; // not initialised in returned instance
private $_errorConfig;
private function __construct(Zend_Config $config, $appMode = null){
$this->_errorConfig = $config;
if(isset($appMode)){
static::$_appMode = $appMode;
}else{
static::$_appMode = APPMODE;
}
}
private final function __clone(){}
public static function getInstance(Zend_config $config, $appMode = null){
if(! (static::$instance instanceof self)){
static::$instance = new static($config, $appMode);
}
return static::$instance;
}
}
Не то чтобы мне действительно нужно, чтобы $ _appMode вообще был статическим, я объявил его закрытым и двинулся дальше, но мне все еще интересно, можно ли инициализировать статические свойства из вызова статической функции. Если бы мне ДЕЙСТВИТЕЛЬНО нужен был статический $ _appMode , я, вероятно, мог бы создать объект и впоследствии установить значение с помощью метода setter, но это «не кажется» лучшим способом сделать это.
Ответ №1:
Оформить покупку
<?
class ErrorHandling{
private static $instance;
private static $_appMode; // not initialised in returned instance
private $_errorConfig;
private function __construct(array $config, $appMode = null){
$this->_errorConfig = $config;
if(isset($appMode)){
self::$_appMode = $appMode;
}else{
self::$_appMode = APPMODE;
}
}
private final function __clone(){}
public static function getInstance(array $config, $appMode = null){
if(! (self::$instance instanceof self)){
self::$instance = new ErrorHandling($config, $appMode);
}
return self::$instance;
}
public static function getAppMode() {
return self::$_appMode;
}
}
$e = ErrorHandling::getInstance(array('dev' => true), -255);
var_dump($e, ErrorHandling::getAppMode());
Это ваше желание?
Вы могли бы прочитать здесь о разнице между static
и self
— поздней статической привязкой
Комментарии:
1. По какой-то причине я не смог установить статические свойства для singleton в конструкторе.
2. Спасибо, я не пробовал self :: $instance = новая обработка ошибок ($ config, $ appMode); Я полагаю, что я использовал self :: $instance = новая обработка ошибок ($ config, $ appMode); в исходном коде. Также использовалось static:: для возвращаемых значений, и, по-видимому, это ключевое слово предназначено только для присваивания. Спасибо за отзыв ; o)
3. @stef
static
подходит для присвоения в PHP > = 5.3; это дает немного иное поведение, чемself
хотя.4. @stefgosselin, добавьте ссылку на разницу между
self
иstatic
Ответ №2:
Вероятно, вы не используете какую-либо версию PHP 5.3.x. «Поздняя статическая привязка» ( static::$_appMode
) недоступна ни в одной из предыдущих версий. Используйте self::$_appMode
вместо этого. Это немного отличается от static
, но в вашем случае все должно быть в порядке. Для получения дополнительной информации прочитайте Руководство: Поздняя статическая привязка