$thisは、自分自身の「オブジェクト」を指す。
インスタンス化した際、クラス内のメンバ変数やメソッドにアクセスする際に使用する。


<?php

class Colors {

    public $colors = 'red ';
    public function output_colors_name() { return 'blue '; }

    function test() {
        echo $this->colors;
        echo $this->output_colors_name() ;
    }

}

$obj = new Colors();
$obj->test();


出力結果 red blue

インスタンス化したオブジェクト自身が、コールしたtest()メソッド内から$this->を使ってechoしているのは、自身(オブジェクト)の変数やメソッド

self:: は、自クラスを示す。
自クラスというのは、言葉通り、class Colors {}というクラスがあれば、そのクラス自体のことである。

そしてself:: を理解する上で覚えておきたい変数が、
クラス定数と、static変数だ。

const COLORS = 'red ';                            //クラス定数
public static $colors = 'blue ';      //static変数
クラス定数と、static変数は、静的プロパティとも呼ばれ、
オブジェクト自体の変数ではなく、クラスそのものに属する変数であることをまずは理解しよう。

 

そのため、クラス定数と、static変数にアクセスする場合は、
$thisは使用せず、代わりにselfを使用する。

<?php

class Colors {

    const COLORS = 'red ';
    public static $colors = 'blue ';

    function test() {
        echo self::COLORS;
        echo self::$colors;
    }

}

$obj = new Colors();
$obj->test();
 

出力結果

red blue
 

先ほどと同様のことをしているように見えるが、出力しているredとblueという値が、「オブジェクト自身の変数」ではなく、静的プロパティである「クラス自身の変数」である

「self::」と「$this」の使い分け
静的なプロパティにアクセスする際は、self::を使用し、
動的なプロパティやメソッドにアクセスする際は$thisを使用するなどの使い分けをする。

 

どういうことかと言うと、
下記のプログラムを実行すると、self::と$thisの違いを確認できる。

<?php

class Parent {

    function test() {
        self::who(); //  'parent'
        $this->who(); //  'child'
    }

    function who() {
        echo 'parent ';
    }

}

class Child extends Parent {

    function who() {
        echo 'child ';
    }

}

$obj = new Child();
     $obj->test();
 

出力結果

parent child
 

上記プログラムは、
self::は自クラスを表し、$thisは自身のオブジェクトを表すことを確認できる。

self::who()の場合はParentClass自身のwho()メソッドを実行しているのが分かる。
$this->who()の場合は、Childクラスをインスタンス化しているため、ChildClassのwho()メソッドを実行しているのが分かる。


self::は自クラスを表し、$thisは自身のオブジェクトを表す。
self::はクラス定数やstatic変数など静的なプロパティにアクセスできるのに対し、
$thisは静的なプロパティにはアクセスできない。