1. 程式人生 > >PHP 中 this self static 的區別

PHP 中 this self static 的區別

轉載自:https://blog.csdn.net/mrzhouxiaofei/article/details/78648079

引入

最近在做軟體工程的課程設計,碰到一個問題,去扒 Laravel 原始碼,又搜尋一番,發現是對 self static 的理解不深,才出現了問題,所以記錄下來,避免再次犯同樣的錯誤。

正文

this

this 比較好理解,就是指向當前物件,用於訪問當前物件的非靜態變數和非靜態方法,它是和物件相關的;

<?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 了兩個物件,並分別設定物件的 name 屬性,getName() 中使用了 this 訪問當前物件的 name 屬性,所以分別輸出了 name 的值。所以說,this 就是指向當前物件,不指向其他物件或類。

self

self 和 this 不同,它指向類本身,不指向任何例項化物件,一般用來訪問類中的靜態變數和靜態方法;

<?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(); // 小明

上例中 new 了兩個物件,並修改了其中一個物件的 name 屬性,另一個物件的 name 屬性值也改變了,所以說,self 是指向當前類的,和物件無關,所有的物件共用一個值。

static

static 和 self 一樣,都是指向類,一般都用來訪問類中的靜態變數和靜態方法,但是又有一些不一樣,具體來講:self 寫在哪個類裡,實際呼叫的就是這個類;static 則是寫在父類裡,然後通過子類用到了這個 static,這個 static 指向的是這個子類,官方稱之為 後期靜態繫結 。

<?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 類裡,呼叫時就指向了 A 類,static 同樣寫在 A 類裡,但是用 A 類的子類 B 類的物件去呼叫時,卻指向了 B 類,在使用時,static 才確定指向哪個類,這就是 後期靜態繫結 。

總結

this 指向當前物件,用來訪問當前物件的非靜態變數和非靜態方法; 
self 指向類,一般用來訪問當前類的靜態變數和靜態方法,執行之前已經確定指向哪個類; 
static 指向類,一般用來訪問當前類的靜態變數和靜態方法,但又 不限於 靜態的呼叫,執行時才確定指向哪個類。