[PHP] オーバーロードとマジックメソッド

2018年8月13日月曜日

PHP

[PHP] PHPオブジェクトと配列の変換まとめでは、存在しないプロパティに値を設定すると、プロパティが追加されるのを見た。
class A {}
$a = new A();
$a->foo = 'f';
var_dump($a);
// object(A)#1 (1) {
//   ["foo"]=>
//   string(1) "f"
// }
でも、この操作を行ってもオブジェクトにプロパティが追加されない場合がある。

オーバーロード

以下のようにクラスに __setメソッドを追加すると、同じように存在しないプロパティに値を設定しても、プロパティ自体は追加されない。
class B {
  public function __set(string $name, $value) {}
}
$b = new B();
$b->foo = 'f';
var_dump($b);
// object(B)#2 (0) {
// }
イメージとしてはプロパティが存在しなかった場合のフックをPHPのデフォルトのものと置き換える感じ。

PHPではこのように存在しないプロパティやメソッドにアクセスされた時の振る舞いをオーバーロードと呼んでいる。

http://php.net/manual/ja/language.oop5.overloading.php

Javaとかでは、引数型違いの同名メソッドを定義することをオーバーロードと呼んでいるから、用語の使い方の違いに注意が必要だね。

マジックメソッド

オーバーロード以外にも実行時にフックを挿入して、PHPの動作に影響を与えるメソッドがマジックメソッドとして用意されている。

http://php.net/manual/ja/language.oop5.magic.php

コンストラクタもマジックメソッドの仲間として扱われている。
確かに、__construct が直接呼ばれるわけではなく、new演算子が使われた時に __construct が呼ばれるわけだからね。

なので、用語としてはオーバーロードという考え方を実現する手段がマジックメソッドということになるのかな。