PHPでは一般的に $this->var;のようにプロパティを読み取ることが多いですが、ライブラリなどで$this->$var;のような、ドルマーク(ドル記号)が付いたままの呼び出しや、中括弧付きの呼び出しを見かけます。
$this->var
$this->$var
$this->{$var}
こういった呼び分けを何と言えば良いかわからないため、調べてもなかなか違いが出てきませんが、後者2つの書き方は共通処理などで使えるため、この違いについて説明していきます。
$this->var;について
まず$this->var;この記述はオブジェクトのvarプロパティを読み取っているだけです。PHPにおけるプロパティとはクラスのメンバ変数のことを示しています。
下記の例で言えば$this->id = $id_param;はメンバ変数に第一引数の$id_paramを代入しているということです。
public $id;
public $name;
public function __construct($id_param, $name_param){
$this->id = $id_param;
$this->name = $name_param;
}
$this->$var;について
PHPは多少癖があり、文字列を使った関数呼び出しを行うことができます。
下記の例で見ると、$thisオブジェクトの変数プロパティ名、ここではexampleを読み取るので、$this->example;ということになります。
$id = 'example'; $this->$id; //$this->example;呼び出しと同義
マイクロサービスやRESTful API(REST API)のようなAPI呼出を行うような設計の時など、共通処理として記載できます。
class Test{
public function get($api_name, $parameter ) {
$result = array();
if (method_exists($this, $api_name)) {
$this->$api_name($result, $parameter );
}
return $result;
}
}
$test = new Test();
var_dump($test->get('get_example',array()));
//get_exampleという呼び出しメソッドがなければ
//array(0) {}
$this->{$var};について
最後にもう一つ可変変数と呼ばれる$this->{$var};のような中括弧で覆われた記載があります。
これは上記の$this->example;と基本的には同じですが、曖昧さを抑えた記述で、順序を制御するために括弧を追加するのと似ており、場合によっては便利です。
$id = 'example';
$this->{$id};
//式の明確さや順番をコントロールすることができます
$this->{$id['key']};
$this->{$id}['key'];