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

來源:互聯網
上載者:User

首先是這樣一組代碼:

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

是不是方便了許多呢?

。。。。。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.