首頁 > 後端開發 > php教程 > PHP中this self static 的用法區別

PHP中this self static 的用法區別

零到壹度
發布: 2023-03-23 10:36:01
原創
1502 人瀏覽過

這篇文章主要介紹了PHP中this self static 的區別,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

引入

最近在做軟體工程的課程設計,碰到一個問題,去扒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 指向的是這個子類,官方稱之為 後期靜態綁定 。

<?phpclass 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 指向類別,一般用來存取目前類別的靜態變數和靜態方法,但又 不限於靜態的調用,運行時才確定指向哪個類別。

以上是PHP中this self static 的用法區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板