1. 程式人生 > >繼承static的註意點

繼承static的註意點

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,為什麽?先看流程
  1. Auth::getInstance(); 給 Auth的$_instance賦值了。
  2. AuthV2::getInstance();返回的對象是直接使用父級Auth的$_instance,因此,沒有再次執行new self()進行實例化。
  • 如果讓Auth::getInstance() 再次實例化?
  1. 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的註意點