繼承static的註意點
阿新 • • 發佈:2017-11-19
source prot sel tin fine 提示 urn fat 註意點
繼承static的註意點
singleton模式會使用
<?php
class Auth
{
protected static $_instance = null;
/**
* 單用例入口
*
* @return Auth
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self ::$_instance;
}
}
class AuthV2 extends Auth
{
// 使用父類的
// protected static $_instance = null;
/**
* 單用例入口
*
* @return AuthV2
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self::$_instance;
}
public function checkLogin(){
return false;
}
}
Auth::getInstance();
AuthV2::getInstance()->checkLogin();
結果
上面的結果看上去感覺沒有問題,但是...
// 出現如下錯誤
Fatal error: Call to undefined method Auth::checkLogin()
分析
- 提示說使用的類竟然是Auth,而不是AuthV2,為什麽?先看流程
- Auth::getInstance(); 給 Auth的$_instance賦值了。
- AuthV2::getInstance();返回的對象是直接使用父級Auth的$_instance,因此,沒有再次執行new self()進行實例化。
- 如果讓Auth::getInstance() 再次實例化?
- AuthV2需要使用自己的 protected static $_instance = null;
正確代碼:
<?php
class Auth
{
protected static $_instance = null;
/**
* 單用例入口
*
* @return Auth
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self::$_instance;
}
}
class AuthV2 extends Auth
{
// 必須使用自身的
protected static $_instance = null;
/**
* 單用例入口
*
* @return AuthV2
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self::$_instance;
}
public function checkLogin(){
return false;
}
}
Auth::getInstance();
AuthV2::getInstance()->checkLogin();
繼承static的註意點