我有一个用于初始化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方法设置值,但这并不“感觉”是最好的方法。
答案 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());
这是你想要的吗?
您可以在此处阅读static
和self
- late static binding
答案 1 :(得分:0)
您可能不使用任何5.3.x版本的PHP。之前的任何版本都没有“延迟静态绑定”(static::$_appMode
)。请改用self::$_appMode
。它与static
略有不同,但在你的情况下应该没问题。有关详细信息,请阅读Manual: Late Static Binding