はじめに
日本システム開発株式会社の藤井といいます。
タイトルにもあるようにクラスについてまとめました。
クラスとは?より、PHPのクラスについての内容になっています。
オブジェクトについて
オブジェクトは他の言語の参照と同じように扱えます。
$obj = new StdClass()
を実行すると、$obj
にはオブジェクトのIDが代入されます。
$obj
を他の変数に代入すると、オブジェクトのIDがコピーされます。
$obj
には、オブジェクトのIDが代入されているため、nullを再代入してもオブジェクトは消えません。(他の言語の参照と同じ動作です)
<?php
$obj = new StdClass();
var_dump($obj);
$obj2 = $obj;
$obj = null;
var_dump($obj2);
プロパティに代入した無名関数の呼び出し
PHPはプロパティへのアクセス、メソッドへのアクセスをコンテキストによって判断します。
「()」がついた呼び出しはメソッドへのアクセス、それ以外はプロパティへのアクセスと判断します。
そのため、プロパティに無名関数を代入すると、直接呼び出すことができなくなります。(一度、変数に代入する必要がある)
ワンラインでプロパティに代入した無名関数を呼び出すには、
($obj->closure)()
で、プロパティにアクセスしてから呼び出します。
<?php
$obj = new StdClass();
$obj->closure = function() {echo "hello";};
($obj->closure)();
静的遅延束縛
静的遅延束縛は「staticキーワード」と「スコープ定義演算子」を使います。
静的遅延束縛を使うと、親クラスから子クラスのメソッドを呼び出すことができます。
<?php
class Hoge {
public static function func1() {
static::func2();
}
}
class Huga extends Hoge {
public static function func2() {
echo "Huga::func2" . PHP_EOL;
}
}
Huga::func1();
staticキーワードは、直近の非転送コール(転送コール以外)に解決されます。
転送コールとは、「self」「parent」「static」を使った呼び出しを指します。
上記の例では、static::func2();
にとって、Huga::func1();
が直近の非転送コールにあたるため、static
がHuga
に解決されます。
まとめ
- オブジェクトをインスタンス化すると、変数にはオブジェクトのIDが代入される
- PHPは、プロパティへのアクセス、メソッドへのアクセスをコンテキストで判断する
- 静的遅延束縛を使うと、親クラスから子クラスのメソッドを呼び出すことができる