singleton - попытка инициализировать статическое свойство при создании не удалась - PullRequest
0 голосов
/ 18 мая 2011

У меня есть одноэлементный класс, используемый для инициализации обработки ошибок.

Класс as is принимает объект 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, но это «не кажется» лучшим способом сделать это.

Ответы [ 2 ]

0 голосов
/ 19 мая 2011

Вы, вероятно, не используете 5.3.x-версию PHP. «Позднее статическое связывание» (static::$_appMode) ранее не было доступно ни в одной версии. Вместо этого используйте self::$_appMode. Это немного отличается от static, но в вашем случае все должно быть в порядке. Для получения дополнительной информации прочитайте Руководство: Позднее статическое связывание

0 голосов
/ 18 мая 2011

Оформление заказа

<?

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 - поздним статическим связыванием

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...