2009-12-22 90 views
12

PHP類或PHP方法中self$this->之間的區別在哪裏?

例如:

我最近看過這段代碼。

public static function getInstance() { 

    if (!self::$instance) { 
     self::$instance = new PDO("mysql:host='localhost';dbname='animals'", 'username', 'password');; 
     self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    return self::$instance; 
} 

但我記得$this->是指一類(也可能是錯誤的)當前實例(對象)。但是,有什麼區別?

+4

重複:http://stackoverflow.com/questions/151969/php-self-vs-this – inkedmn 2009-12-22 18:39:50

+1

很好的來源你 - http://www.programmerinterview.com/index.php/php-questions/php-self -vs-this/ – Sudara 2015-05-18 05:52:53

回答

15

$this指的是類的實例,這是正確的。但是,也有一些稱爲靜態的東西,對於該類的所有實例都是一樣的。 self::是這些屬性和功能的訪問者。

另外,通常無法從靜態方法訪問實例成員。意思是,你不能這樣做

static function something($x) { 
    $this->that = $x; 
} 

因爲靜態方法不知道你指的是哪個實例。

+0

self ::在一個對象內引用同一個繼承級別的屬性/方法,其中$ this->指的是對象繼承的方法。換句話說,self ::更精確。並且在初始化對象內部,它也不是靜態調用,除非您定義明確定義的靜態屬性/方法。這個「答案」從上到下是錯誤的。 – AnrDaemon 2016-02-10 07:10:31

+0

@AnrDaemon我不知道你是幾歲,但在事後看到你的學位之前,這個答案是100%正確的。我不知道PHP以後做了什麼,因爲當開發人員開始公然無視質量或經驗數據做出決定時,我放棄了使用它。這可能是在這個答案之前。此外,這個答案適用於所有其他面向對象的語言,並尊重其自身。如果它不在PHP中,那麼PHP是錯誤的,而不是我。感謝您的意見,它已被記錄並被丟棄。 – 2016-02-13 23:24:04

+0

@TorValamo不,你的回答是對的。評論者可能會被JavaScript中'this'的使用所困惑,這會在當前上下文中進行查找。 – SuperDuck 2017-11-23 11:40:19

3

self用於類級作用域,而$this用於實例級作用域。

1

self引用調用對象的類。 $this指的是對象本身。

7

$this指的是當前對象,self指的是當前類。班級是對象的藍圖。所以你定義一個類,但你構造對象。

換句話說,使用self來表示靜態,而this表示使用非靜態成員或方法。

2

$this用於引用類的當前實例的方法和屬性。

self我們用來引用靜態方法和屬性,由所有實例共享(甚至可以在任何實例外訪問)的一個類。靜態使他們訪問 不需要的 類的一個實例

聲明類屬性或方法 :


你可以看看Static Keyword(報價幾行)。聲明爲靜態 屬性可以不與 實例化的類對象(雖然 靜態方法可以)

...

靜態屬性不能使用箭頭 操作者訪問 通過對象來訪問 - >。


並且,從頁Properties(引用)

在類方法的屬性, 常量和方法可以通過使用形式$this->property 訪問 (其中property是屬性的名稱)除非在的上下文中訪問 靜態屬性靜態類方法,在這種情況下,使用 self::$property的形式訪問它 。

1

$這是用來調用類,其中自::主要是用來調用類中的常數變量的實例。

1
  1. this->無法訪問靜態方法或靜態屬性,我們使用self來訪問它們。
  2. $ this->在處理擴展類時,將引用當前擴展的範圍,self將始終引用父類,因爲它不需要實例來訪問類方法或直接訪問類。

    <?php 
    class FirstClass{ 
        function selfTest(){ 
        $this->classCheck(); 
        self::classCheck(); 
        } 
        function classCheck(){ 
        echo "First Class"; 
        } 
    } 
    class SecondClass extends FirstClass{ 
        function classCheck(){ 
         echo "Second Class"; 
        } 
    } 
    $var = new SecondClass(); 
    $var->selfTest(); //this-> will refer to Second Class , where self refer to the parent class 
    
相關問題