類中類外訪問靜態(tài)成員和普通成員 - PHP面向?qū)ο缶幊蹋∣OP)

    在php中的訪問常量和靜態(tài)量的方法總結(jié)

    范圍解析操作符 (::)

    理解

    類外使用

    靜態(tài)成員

    • $obj::$member1;//訪問實(shí)例中的靜態(tài)變量
    • ClassName::member3_visit2();//訪問ClassName類中的靜態(tài)方法

    普通成員

    • echo $obj->member1;//訪問實(shí)例中的變量
    • $obj->member2();//訪問實(shí)例中的方法

    常量

    • echo $obj::member1;//訪問實(shí)例中的常量

    類內(nèi)使用

    靜態(tài)成員

    • self::$member2;//訪問類中靜態(tài)變量
    • ClassName::$member2;//訪問類中靜態(tài)變量(不建議使用)
    • self::member2;//訪問類中靜態(tài)方法

    普通成員

    • echo $this->member2;//訪問類中的變量
    • echo $this->member3();//方法中訪問其他方法

    常量

    • echo self::member2;//方法中訪問常量

    訪問大綱

    訪問又分為靜態(tài)成員的訪問和普通成員訪問

    1:靜態(tài)成員

    • 類內(nèi)訪問
    self::$靜態(tài)屬性名 
    self::$類常量名 

    (其實(shí)類內(nèi)頁可以使用類外訪問的類名的訪問方式,不過考慮到了后期類名的更改,self就很方便的解決了這個問題)

    • 類外訪問
    類名::$靜態(tài)屬性名 
    類名::$類常量名

    2:普通成員

    • 類內(nèi)訪問
    $this->屬性名 
    $this->方法名
    • 類外訪問
    $對象名->屬性名 
    $對象名->方法名 ($對象名 指的是實(shí)例化后的對象)

    實(shí)戰(zhàn)演示

    一:靜態(tài)成員屬性的訪問

    1: 靜態(tài)外部訪問

    <?php 
        class ClassName {
            //必須帶“$”,否則是常量
            public static $member1 = '成員1';
        }
        $obj = new ClassName;
        //注意這里的“::”
        echo $obj::$member1;
    ?>

    輸出:

    成員1

    2:靜態(tài)內(nèi)部訪問?(要知道,在類內(nèi)部訪問類成員必須定義一個方法來訪問)

    <?php 
        class ClassName {
            //必須帶“$”,否則是常量
            public static $member2 = '成員2 <br />';
            
            public function member2() {
                echo self::$member2;
                //下面這條效果與上條相同,但不推薦使用(考慮繼承中。類名會變的因素)
                echo ClassName::$member2;
            }
        }
    
        $obj = new ClassName;
    
        //類內(nèi)訪問類中靜態(tài)成員
        $obj->member2();
    ?>

    輸出:

    成員2
    成員2
    • 1:類內(nèi)訪問類內(nèi)成員首先要定義一個方法在方法內(nèi)訪問;
    • 2:最開始介紹到:類內(nèi)其實(shí)可以使用類名的訪問方式(echo ClassName::$member2;),考慮到項目后期可能會有類名更改問題,類內(nèi)最好使用self來代替

    (不過也正好證明了在類內(nèi)訪問其實(shí)就是使用類(名)進(jìn)行指定類內(nèi)的成員,講這個是因?yàn)椴煌谄胀ǔ蓡T中的類內(nèi)訪問方式--$this)

    二:靜態(tài)成員方法的訪問

    1:在類外訪問類內(nèi)靜態(tài)方法

    <?php 
        class ClassName {
    
            //靜態(tài)方法
            public static function member3() {
                echo __METHOD__;//打印當(dāng)前方法的方法名
            }
    
        }
    
        //類外訪問類內(nèi)靜態(tài)方法
        ClassName::member3();
        
    ?>

    輸出:

    ClassName::member3

    在類外使用 類名::類中的方法名。 (__METHOD__指的是當(dāng)前方法的方法名

    2:在類內(nèi)訪問類內(nèi)靜態(tài)方法

    <?php 
        class ClassName {
    
            //靜態(tài)方法
            public static function member3() {
                echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
            }
    
            //方法訪問靜態(tài)方法
            public function member3_visit1() {
                self::member3();
            }
    
            //靜態(tài)方法訪問靜態(tài)方法
            public static function member3_visit2() {
                self::member3();
            }
    
        }
    
        $obj = new ClassName;
    
        $obj->member3_visit1();
    
        ClassName::member3_visit2();
        
    ?>

    輸出

    ClassName::member3
    ClassName::member3
    • 類內(nèi)訪問靜態(tài)方法,同樣需要在方法內(nèi)訪問,
    • 定義的方法可以使用普通方法進(jìn)行訪問,
    • 也可以定義一個同樣是靜態(tài)方法的方法來訪問其他靜態(tài)方法。。
    • (可能這句話有些繞,直接分析代碼就行)

    三:普通成員的屬性訪問

    1:在類外訪問

    <?php 
        class ClassName {
            public  $member1 = '成員1 ';
        }
    
        $obj = new ClassName();
    
        //注意這里,不是“$member1”
        echo $obj->member1;
        
    ?>

    輸出:

    成員1

    這里有個重點(diǎn),記得看后面

    2:在類內(nèi)訪問

    <?php 
        class ClassName {
    
            public  $member2 = '成員2 ';
    
            function member2() {
                echo $this->member2;
            }
        }
    
        $obj = new ClassName();
    
        $obj->member2();
        
    ?>

    輸出:

    成員2

    你可能已經(jīng)發(fā)現(xiàn)了,為什么在最開始靜態(tài)訪問演示的時候,

            function member2() {
                echo $this->member2;
            }
    $obj->member2();

    上面變量名都有$符號,而這里卻沒有。
    要知道這里面php里面有個可變屬性和可變方法。下面來演示一下。

    類中類外訪問靜態(tài)成員和普通成員 - PHP面向?qū)ο缶幊蹋∣OP)

    在外面如果不帶$,就是代表著取obj這個對象中進(jìn)行訪問查找 為此名字的成員。

    一旦加上$,因?yàn)樵陬愅獠浚蜁划?dāng)做變量來找,所以就會報錯。當(dāng)然可以這樣寫 ?

    <?php 
        class ClassName {
            public  $member1 = '成員1 ';
            public  $member2 = '成員2 ';
    
            function member2() {
                echo $this->member2;
            }
        }
    
        $obj = new ClassName();
    
        $member1 = 'member1';
    
        echo $obj->$member1;
    
        $obj->member2();
        
    ?>

    輸出:

    成員1 成員2

    (其中一個值當(dāng)作另一個的名)當(dāng)obj進(jìn)行指向訪問的時候 $member就會被解析為 member

    四:普通成員的方法訪問

    1:類外訪問

    <?php 
        class ClassName {
            
            public  $member2 = '成員2,<br /> ';
    
            function member2() {
                echo $this->member2;
            }
    
            public function member3() {
                echo __METHOD__;//打印當(dāng)前方法的方法名
            }
    
        
        }
    
        $obj = new ClassName();
    
        $obj->member2();
    
        $obj->member3();
    
        
    ?>

    輸出

    成員2,
    ClassName::member3

    2:類內(nèi)訪問

    <?php 
        class ClassName {
    
            public function member3() {
                echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
            }
    
            public function member4() {
                echo $this->member3();
    
                //與上面一行代碼同樣的意思
                $member3 = 'member3';
                echo $this->$member3();
            }
    
        }
    
        $obj = new ClassName();
    
        $member4 = 'member4';
        $obj->$member4();
    
        
    ?>

    輸出:

    ClassName::member3
    ClassName::member3

    再次直接寫了 可變的 形式,方法同樣適用。

    思考(這樣的好處,以后比如前臺頁面的訪問可以都給定 一個頁面,頁面中定義好類,類中定義好各個對象,通過頁面點(diǎn)擊傳遞要制定的對象名也就是方法名,然后使用可變的形式,來隨時替換到變量,而調(diào)用只需要調(diào)用一次 $obj->變量名)

    五:類常量的訪問

    首先:類常量就是const定義的常量。

    要記住:類常量只能用const來定義

    1:類外訪問

    <?php 
        class ClassName {
            const member1='類常量1<br />';
        }
    
        $obj = new ClassName;
    
        echo $obj::member1;
    
    ?>

    輸出:

    類常量1

    2:類內(nèi)訪問

    <?php 
        class ClassName {
    
            const member2='類常量2<br />';
    
            public function visit() {
                echo self::member2;
            }
        }
    
        $obj = new ClassName;
    
        $obj->visit();
    
    ?>

    輸出

    類常量2

    跟靜態(tài)方式其實(shí)一樣,但唯一的差別就是最前面中的 注釋,變量名在類內(nèi)聲明的時候沒有 $

    注意:(至于可變的形式,在常量中類內(nèi)或者類外訪問都不可以

    <?php 
    //以下代碼采用可變方法訪問常量,會報錯
        class ClassName {
    
            const member1='類常量1<br />';
        }
    
        $obj = new ClassName;
    
        //可變方法
        $member1 = 'member1';
        echo $obj::$member1;
    
    ?>

    不過在調(diào)用方法的時候可以使用可變的形式,畢竟跟常量也沒太大關(guān)系。

    類與對象的內(nèi)存關(guān)系

    我們上面都知道,靜態(tài)訪問和類常量都是使用 類名來訪問,而其他都是通過實(shí)例化的對象來訪問。

    其實(shí):

    在類內(nèi)部,是分空間的,靜態(tài)成員一般保存在類空間里,而像其他的 普通屬性都是保存在對象的空間里(這里的對象指的是實(shí)例化的對象)

    而唯一特殊的就是 成員方法,它按我們的訪問方式是通過 對象來訪問的,但是它并不存儲在對象的空間里,相反存儲在了類的空間里

    我們來使用前面的代碼 證明一下:

    <?php 
        class ClassName {
            public  $member1 = '成員1 ';
            public  $member2 = '成員2,<br /> ';
            function member2() {
                echo $this->member2;
            }
    
    
            //兩個成員方法的訪問
            public function member3() {
                echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
            }
    
    
            public function member4() {
                $member3 = 'member3';
                echo $this->member3();
            }
    
        }
    
        $obj = new ClassName();
    
        $obj->member1 = '成員5';
        echo $obj->member1;
    
        $member1 = 'member1';
        echo $obj->$member1;
        $obj->member2();
    
    
        $obj->member3();
    
    
        $member4 = 'member4';
        $obj->$member4();
    
    
        $obj1 = new ClassName;
        echo $obj1->member1;
        
    ?>

    輸出

    成員5成員5成員2,
    ClassName::member3
    ClassName::member3
    成員1

    可以看出 新聲明的obj1?明顯沒有被前面的 obj 改變的成員5 而改變!

    就算是這個特殊的成員方法雖然存在了類空間里,但是仍不會被改變。

    這樣的原因就是因?yàn)榇鎯υ诹?實(shí)例化的對象的空間里,一個實(shí)例化中的改變不會影響其他實(shí)例化對象的改變

    <?php 
        class ClassName {
            //兩個靜態(tài)屬性
            public static  $member1 = '靜態(tài)成員1 <br /> ';
            public static  $member2 = '靜態(tài)成員2 <br /> ';
    
            //兩個靜態(tài)方法
            public static function member3() {
                echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
            }
    
            public function member3_visit1() {
                self::member3();
            }
    
            public static function member3_visit2() {
                self::member3();
            }
    
            public function member2() {
                echo ClassName::$member2;
            }
    
        }
    
        $obj = new ClassName();
    
        //類外訪問類中靜態(tài)屬性
        ClassName::$member1 = '11131313';
        echo ClassName::$member1;
    
        //類內(nèi)訪問類中靜態(tài)屬性
        $obj->member2();
    
        //類外訪問類內(nèi)靜態(tài)方法
        ClassName::member3();
    
        $obj->member3_visit1();
    
        ClassName::member3_visit2();
        
    
        $obj1 = new ClassName;
        echo ClassName::$member1;
    
        
        
    ?>

    而在類空間中除了不能改變的,常量外的靜態(tài)成員,只要被改變,其他的實(shí)例化對象同樣就會被調(diào)用。如上所顯示。

    參考文章

    php

    調(diào)用父類構(gòu)造方法 - PHP面向?qū)ο缶幊蹋∣OP)

    2022-8-25 14:56:51

    php

    里氏替換原則 - PHP面向?qū)ο缶幊蹋∣OP)

    2022-8-26 17:03:09

    ??
    Npcink上的部份代碼及教程來源于互聯(lián)網(wǎng),僅供網(wǎng)友學(xué)習(xí)交流,若您喜歡本文可附上原文鏈接隨意轉(zhuǎn)載。
    無意侵害您的權(quán)益,請發(fā)送郵件至 1355471563#qq.com 或點(diǎn)擊右側(cè) 私信:Muze 反饋,我們將盡快處理。
    0 條回復(fù) A文章作者 M管理員
      暫無討論,說說你的看法吧
    ?
    個人中心
    購物車
    優(yōu)惠劵
    今日簽到
    有新私信 私信列表
    搜索
    主站蜘蛛池模板: 国产一区二区电影| 日韩国产免费一区二区三区| 无码精品一区二区三区免费视频 | 午夜精品一区二区三区在线观看| 午夜视频在线观看一区二区| 国产精品一区二区三区免费| 熟妇人妻AV无码一区二区三区| 亚洲国产欧美一区二区三区 | 国产福利91精品一区二区 | 中文字幕在线播放一区| 一区高清大胆人体| 青娱乐国产官网极品一区| 亚洲一区免费观看| 国产一区二区免费在线| 无码AV中文一区二区三区| 波多野结衣中文字幕一区二区三区| 中文字幕久久亚洲一区| 亚洲制服中文字幕第一区| 国产成人无码AV一区二区在线观看 | 中日av乱码一区二区三区乱码| 国产成人一区二区三区免费视频| 国产精品一区二区三区99| 亚洲午夜日韩高清一区| 国产精品视频一区二区噜噜| 亚洲第一区精品日韩在线播放| 国产成人av一区二区三区在线观看 | 亚洲av无码一区二区三区天堂 | 亚洲一区免费观看| 一区在线观看视频| 国产成人精品一区二区三在线观看| 91福利一区二区| 亚洲大尺度无码无码专线一区 | 波多野结衣在线观看一区| 国产午夜毛片一区二区三区| 国产在线第一区二区三区| 蜜芽亚洲av无码一区二区三区| 天堂va在线高清一区| 国产乱码一区二区三区| 精品国产aⅴ无码一区二区| 影音先锋中文无码一区| 少妇一晚三次一区二区三区|