$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は静的なプロパティにはアクセスできない。