PHPで「self::」と「$this」の違いを理解する。

これを完全に理解しきるには一筋縄じゃいかない模様。
とりあえず自分用にザックリめも。

まず、標題の件に関して。

■self::
自クラスのプロパティ、及びメソッドへの静的アクセス。

■$this
自分自身のオブジェクトを指す。

 

次に、そもそも論として。

 

・クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。

・static メソッドは、オブジェクトのインスタンスを生成せずに コールすることができます。疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできません。

・static プロパティは、矢印演算子 -> によりオブジェクトからアクセス することはできません。

・static でないメソッドを静的にコールすると、E_STRICT レベルの 警告が発生します。

公式リファレンスより引用

 

上記の説明で大体理解は出来た。
一応セーフなパターンとアウトなパターンを実験してみる。

<?php
class selfAndThis {

	public $param1 = 'hoge';
	
	public static $param2 = 'piyo';	

}

例えば上記のようなクラスがあったとしたら。

// 下記はセーフ
$obj = new selfAndThis();
$res1 = $obj->param1;
$res2 = selfAndThis::$param2;

// 下記はアウト
$obj = new selfAndThis();
$res1 = $obj->param2;
$res2 = selfAndThis::$param1;

※$res1 : staticプロパティにはインスタンス化したオブジェクトからはアクセスできないためエラーとなる。(staticプロパティはアロー演算子「->」によるアクセスが出来ない。)
※$res2 : staticでないプロパティはインスタンス生成無しでアクセスできないためエラーとなる。

次にメソッド編。ようやくself::のお出まし。
上記のクラスに一つのメソッドを追加して実験。

<?php
class selfAndThis {
	
	public $param1 = 'hoge';
	
	public static $param2 = 'piyo';
	
	public static function test() {
		return self::$param2;
	}
}

staticなメソッドに関してはインスタンス化の有無を問わず呼び出すことが可能。
よって以下の呼び出し方は共にセーフ。

$obj = new selfAndThis();
$res1 = $obj->test();
$res2 = selfAndThis::test();

var_dump($res1, $res2);
↓
string(4) "piyo" string(4) "piyo"

そして以下アウトなパターン。
staticメソッド内で疑似変数$thisを使っているとアウト。

// Fatalエラー
public static function test() {
	return $this->param2;
}

他にもパターンをあげていくとキリがないが、スコープ定義演算子やstaticキーワードに関しては今後も知識を深めていく必要がありそう。