self關鍵字詳解(parent、static和this) – PHP

    php在類中的各種關鍵字詳解

    靜態成員函數內不能用this調用非成員函數,但可以用self調用靜態成員函數/變量/常量;

    其他成員函數可以用self調用靜態成員函數以及非靜態成員函數。

    parent

    • parent引用父類/基類被隱蓋的方法(或變量),
    • self則引用自身方法(或變量)。
    <?php 
    
    class Base {
    
        public function __construct() {
        echo "Base contructor!", PHP_EOL;
        }
        
        }
        
        class Child extends Base {
        
        public function __construct() {
        
        parent::__construct();
        
        echo "Child contructor!", PHP_EOL;
        
        }
        
        }
        
        new Child;
    
    // 輸出:
    
    // Base contructor!
    
    // Child contructor!
    
    ?>

    static

    static常規用途是修飾函數或變量使其成為類函數和類變量,也可以修飾函數內變量延長其生命周期至整個應用程序的生命周期。

    但是其與self關聯上是PHP 5.3以來引入的新用途:靜態延遲綁定。

    有了static的靜態延遲綁定功能,可以在運行時動態確定歸屬的類。

    <?php 
    
    class Base {
    
        public function __construct() {
        
        echo "Base constructor!", PHP_EOL;
        
        }
        
        public static function getSelf() {
        
        return new self();
        
        }
        
        public static function getInstance() {
        
        return new static();
        
        }
        
        public function selfFoo() {
        
        return self::foo();
        
        }
        
        public function staticFoo() {
        
        return static::foo();
        
        }
        
        public function thisFoo() {
        
        return $this->foo();
        
        }
        
        public function foo() {
        
        echo "Base Foo!", PHP_EOL;
        
        }
        
        }
        
        class Child extends Base {
        
        public function __construct() {
        
        echo "Child constructor!", PHP_EOL;
        
        }
        
        public function foo() {
        
        echo "Child Foo!", PHP_EOL;
        
        }
        
        }
        
        $base = Child::getSelf();
        
        $child = Child::getInstance();
        
        $child->selfFoo();
        
        $child->staticFoo();
        
        $child->thisFoo();
    
    
    ?>
    • 在函數引用上,self與static的區別是:對于靜態成員函數,self指向代碼當前類,static指向調用類;
    • 對于非靜態成員函數,self抑制多態,指向當前類的成員函數,static等同于this,動態指向調用類的函數。

    parent、self、static三個關鍵字聯合在一起看挺有意思,分別指向父類、當前類、子類,有點“過去、現在、未來”的味道。

    this

    • self與this是被討論最多,也是最容易引起誤用的組合。兩者的主要區別如下:
    • this不能用在靜態成員函數中,self可以;
    • 對靜態成員函數/變量的訪問,建議 用self,不要用$this::或$this->的形式;
    • 對非靜態成員變量的訪問,不能用self,只能用this;
    • this要在對象已經實例化的情況下使用,self沒有此限制;

    在非靜態成員函數內使用,self抑制多態行為,引用當前類的函數;而this引用調用類的重寫(override)函數(如果有的話)。

    self

    • self總是指向“當前類(及類實例)”。詳細說則是:
    • 替代類名,引用當前類的靜態成員變量和靜態函數;
    • 抑制多態行為,引用當前類的函數而非子類中覆蓋的實現;

    補充

    這幾個關鍵字中,只有this要加$符號且必須加,強迫癥表示很難受;

    靜態成員函數中不能通過$this->調用非靜態成員函數,但是可以通過self::調用,且在調用函數中未使用$this->的情況下還能順暢運行。此行為貌似在不同PHP版本中表現不同,在當前的7.3中ok;

    參考文章

    給TA贊賞
    共{{data.count}}人
    人已贊賞
    ??
    Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
    無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
    ?
    購物車
    優惠劵
    搜索
    主站蜘蛛池模板: jazzjazz国产精品一区二区| 国产一区二区电影| 亚洲一区二区三区免费| 卡通动漫中文字幕第一区| 精品成人一区二区三区免费视频| 亚洲免费一区二区| 亚洲AV无码一区二区三区网址 | 一区二区三区免费在线观看| 亚洲色欲一区二区三区在线观看| 无码丰满熟妇浪潮一区二区AV | 麻豆一区二区三区精品视频| 国产激情一区二区三区成人91| 人妻少妇精品视频三区二区一区| 亚洲综合国产一区二区三区| www一区二区三区| 一本岛一区在线观看不卡| 日本片免费观看一区二区| 无码人妻精品一区二区三区久久| 一区二区三区在线播放| 在线视频亚洲一区| 国精产品一区一区三区有限公司| 亚洲一区欧洲一区| 天堂va在线高清一区 | 无码日韩人妻AV一区二区三区| 成人欧美一区二区三区在线视频| 亚洲一区二区三区久久久久| 久久er99热精品一区二区| 无码人妻精品一区二区在线视频 | 日本伊人精品一区二区三区| 国产人妖视频一区二区| 国产精品区一区二区三在线播放 | 国产精品久久亚洲一区二区| 成人区人妻精品一区二区不卡| 国产一区二区三区小说| 日韩福利视频一区| 国产精品一区在线观看你懂的| 国产视频一区在线观看| 色欲综合一区二区三区| 亚洲乱码一区二区三区国产精品| 国产欧美一区二区精品仙草咪| 精品视频一区二区观看|