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;

    參考文章

    php

    里氏替換原則 - PHP面向對象編程(OOP)

    2022-8-26 17:03:09

    php默認分類

    開發微信小程序的URL Scheme - 前后端實戰項目

    2022-9-11 11:56:54

    ??
    Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
    無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
    0 條回復 A文章作者 M管理員
      暫無討論,說說你的看法吧
    ?
    個人中心
    購物車
    優惠劵
    今日簽到
    有新私信 私信列表
    搜索
    主站蜘蛛池模板: 人妻精品无码一区二区三区| 波多野结衣久久一区二区| 538国产精品一区二区在线| 亚洲一区二区在线免费观看| 亚洲人成网站18禁止一区| 亚洲一区二区三区免费在线观看 | 亚洲一区二区三区免费观看| 美女AV一区二区三区| 色一情一乱一伦一区二区三欧美| 在线精品亚洲一区二区小说| 国产亚洲一区二区三区在线不卡 | 日韩国产免费一区二区三区| 国产精品无圣光一区二区| 亚洲人成网站18禁止一区| 丝袜美腿高跟呻吟高潮一区| 在线视频亚洲一区| 亚洲欧美国产国产一区二区三区| 久久久久人妻精品一区蜜桃| 国产成人精品一区二区秒拍| 国产午夜精品免费一区二区三区 | 加勒比无码一区二区三区| 中文字幕亚洲综合精品一区| 日本不卡一区二区三区视频| 最美女人体内射精一区二区| 国产色综合一区二区三区| 一区二区三区无码视频免费福利 | 麻豆va一区二区三区久久浪| 色窝窝免费一区二区三区| 亚洲熟妇成人精品一区| 人妻精品无码一区二区三区| 国产精品亚洲一区二区三区在线观看| 日韩成人无码一区二区三区| 国产精品亚洲一区二区在线观看| 天堂成人一区二区三区| 国产一区二区三区福利| 成人区精品一区二区不卡| 日本欧洲视频一区| 国产经典一区二区三区蜜芽| 国产精品福利一区| 亚洲国产一区视频| 91成人爽a毛片一区二区|