单例 - 尝试在创建时初始化静态属性失败

时间:2011-05-18 03:56:36

标签: php design-patterns singleton

我有一个用于初始化error_handling的单例类。

类as采用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 :(得分:0)

结帐

<?

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

这是你想要的吗?

您可以在此处阅读staticself - late static binding

之间的区别

答案 1 :(得分:0)

您可能不使用任何5.3.x版本的PHP。之前的任何版本都没有“延迟静态绑定”(static::$_appMode)。请改用self::$_appMode。它与static略有不同,但在你的情况下应该没问题。有关详细信息,请阅读Manual: Late Static Binding