1. 程式人生 > >【學習點滴-php】static關鍵字---延遲靜態繫結

【學習點滴-php】static關鍵字---延遲靜態繫結

首先是這樣一組程式碼:

abstract class User{

}

class Admin extends User{

    private $group;

    public  static function create(){
        return new Admin(); 
    } 

   public static function getGroup(){
         return "admin";
   }

   //.......其他更多函式。。

}

class    NormalUser extends User{

    private $group;

    public  static function create(){
        return new NormalUser(); 
    } 

   public static function getGroup(){
         return "normaluser";
   }

   //其他函式。

}

    首先是定義了一個抽象的類,然後建立了兩個子類admin和normalUser,並且這兩個類中都包含了兩個靜態方法create和getgroup.這樣的程式碼幾乎沒有什麼問題,然而卻有很多的冗餘。現在只有兩個子類,如果子類增多的話,就需要增加與之類似的程式碼。這樣我們不得不思考,如果把這段通用的程式碼提取放到父類中是不是可以呢。

很多人可能都想到了用self關鍵字。廢話少說,我們開始行動。

abstract class User{

    public  static function create(){
        return new self(); 
   } 
   

   public static function getGroup(){
         return self::getGroup();
   }

}
class    Admin extends User{

}

class    NormalUser extends User{

}

Admin :: create();

程式碼看起來規整了許多。然而不幸的是,執行這段程式碼,給出了這樣的錯誤提示:

--------------------------------------------------------------
PHP Fatal error: Cannot instance abstract class User in...
--------------------------------------------------------------
出現這段錯誤的原因是什麼呢?原因就是:self被解析為定義create的Object物件(User),而不是解析為呼叫self的Object物件(Admin).因此,self的方法是不可行的。

sigh....

不過不用氣餒,php 5.3引入了延遲靜態繫結的概念,用static關鍵字標明,它與self關鍵字類似,不同的是,static會被解析為被呼叫的類而不是被定義的類。現在程式碼變成這樣:

abstract class User{

    public  static function create(){
        return new static(); 
	}  

	public static function getGroup(){
        return static::getGroup();
	}

}

是不是方便了許多呢?

。。。。。