$this、self和static

$this 只有在類產(chǎn)生實例之后才會存在,我們只是設(shè)置一個屬性,此時不存在 $this,下圖會產(chǎn)生語法錯誤。

image.png

image.png

image.png

記得這種情況不要使用[0],[1] 這種寫法,全都用常量代替,還有獲取一個 pubblic static 屬性不需要 new一個實例,app(classA) 這個方式 == new classA

修改如下:


image.png

關(guān)于類屬性、方法調(diào)用有3個
$this、self、static
$this->foo();
selff::foo();
static::foo();

  • $this指向當(dāng)前對象,用來訪問當(dāng)前對象的非靜態(tài)變量和非靜態(tài)方法。
<?php
class Person {
    public $name;

    public function getName() {
        echo $this->name;
    }
}

$p = new Person();
$p2 = new Person();
$p->name = "小紅";
$p2->name = "小明";
$p->getName();  // 小紅
$p2->getName();  // 小明

上面 new 了兩個對象,并分別設(shè)置對象的 name 屬性,getName() 中使用了 this 訪問當(dāng)前對象的 name 屬性,所以分別輸出了 name 的值。所以說,this 就是指向當(dāng)前對象,不指向其他對象或類。

  • self::指向類,一般用來訪問當(dāng)前類的靜態(tài)變量和靜態(tài)方法,運行之前已經(jīng)確定指向哪個類。
<?php
class Person {
    public static $name = "小紅";

    public static function getName() {
        echo self::$name;
    }
}

$p = new Person();
$p2 = new Person();
$p::getName();  // 小紅
$p2::getName();  // 小紅
$p::$name = "小明";
$p::getName();  // 小明
$p2::getName();  // 小明

self 和 this 不同,它指向類本身,不指向任何實例化對象,一般用來訪問類中的靜態(tài)變量和靜態(tài)方法;
上例中 new 了兩個對象,并修改了其中一個對象的 name 屬性,另一個對象的 name 屬性值也改變了,所以說,self 是指向當(dāng)前類的,和對象無關(guān),所有的對象共用一個值。

  • static指向類,一般用來訪問當(dāng)前類的靜態(tài)變量和靜態(tài)方法,但是又不限于靜態(tài)的調(diào)用,運行時才確定指向哪個類。
    static 和 self 一樣,都是指向類,一般都用來訪問類中的靜態(tài)變量和靜態(tài)方法,但是又有一些不一樣,具體來講:self 寫在哪個類里,實際調(diào)用的就是這個類;static 則是寫在父類里,然后通過子類用到了這個 static,這個 static 指向的是這個子類,官方稱之為 后期靜態(tài)綁定 。
<?php
class A {
    public function say() {
        echo "Hello";
    }

    public function saySelf() {
        self::say();
    }

    public function sayStatic() {
        static::say();
    }
}

class B extends A {
    public function say() {
        echo "World";
    }
}

$b = new B();
$b->say();  // World
$b->saySelf();  // Hello
$b->sayStatic();  // World

上例中可以看到,self 寫在 A 類里,調(diào)用時就指向了 A 類,static 同樣寫在 A 類里,但是用 A 類的子類 B 類的對象去調(diào)用時,卻指向了 B 類,在使用時,static 才確定指向哪個類,這就是 后期靜態(tài)綁定 。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容