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 反饋,我們將盡快處理。
    ?
    購物車
    優惠劵
    搜索
    主站蜘蛛池模板: 午夜无码视频一区二区三区| 综合无码一区二区三区四区五区 | 亚洲AV无码一区二区三区人 | 天天躁日日躁狠狠躁一区| 国产乱码精品一区二区三区 | 无码人妻一区二区三区一| 一区视频免费观看| 另类国产精品一区二区| 亚洲视频在线一区二区三区| 婷婷亚洲综合一区二区| 97se色综合一区二区二区| 色窝窝无码一区二区三区| 国产日韩AV免费无码一区二区| 无码人妻aⅴ一区二区三区| 亚洲中文字幕在线无码一区二区 | 五月婷婷一区二区| 日韩人妻一区二区三区蜜桃视频| 久久精品国产一区二区电影| 精品一区二区三区视频 | 国产精品福利区一区二区三区四区| 韩国一区二区视频| 亚洲美女视频一区二区三区 | 一区二区国产在线播放| 人妻互换精品一区二区| 亚洲日韩AV一区二区三区四区| 中文字幕在线一区二区在线| 国产免费一区二区三区| 精品国产一区二区三区香蕉| 麻豆果冻传媒2021精品传媒一区下载| 亚洲午夜在线一区| 亚洲AV无码片一区二区三区| 亚洲AV无码一区二区一二区| 久久精品国内一区二区三区| 性色av闺蜜一区二区三区| 性色av闺蜜一区二区三区| 一区二区三区在线免费观看视频| а天堂中文最新一区二区三区| 国产AV国片精品一区二区| 中文字幕精品亚洲无线码一区应用 | 99精品国产高清一区二区三区 | 中文字幕精品一区|