__autoloadを使う場合と比べて、考えられるメリット・デメリットがありましたら教えてください
class Hoge {
function hogehoge() {
$this->Class->method(); // 存在しないプロパティのため__getが実行される
}
function __get($class) {
include $class . '.php';
$this->$class = new $class;
return $this->$class;
}
}
考えられるデメリットとして、
後から見たときにそれがインスタンスを生成しているのか、
内部メソッドを呼び出しているのか見えにくくなります。
$this->Class;が
Classクラスを作成しているのか、内部のClassプロパティのmethodメソッドをコールしているのかを判断するには
HogeクラスのプロパティにClassが存在しないかどうかを全てチェックする必要があります。
それはつまり、HogeクラスにはClassプロパティを作成できないという事にもなります。
加えてコンストラクタにパラメータを設定できない。
__getメソッドを全てのクラスに読み込む必要がある。
スレッドセーフじゃない
などが考えられますがいかがでしょう?
考えられるデメリットとして、
後から見たときにそれがインスタンスを生成しているのか、
内部メソッドを呼び出しているのか見えにくくなります。
$this->Class;が
Classクラスを作成しているのか、内部のClassプロパティのmethodメソッドをコールしているのかを判断するには
HogeクラスのプロパティにClassが存在しないかどうかを全てチェックする必要があります。
それはつまり、HogeクラスにはClassプロパティを作成できないという事にもなります。
加えてコンストラクタにパラメータを設定できない。
__getメソッドを全てのクラスに読み込む必要がある。
スレッドセーフじゃない
などが考えられますがいかがでしょう?
動的に読み込むクラス名は名前の末尾に「○○Class」をつけ、
それ以外は内部メソッド名とするなど規則性を持たせて名前の衝突を回避するとか方法はありそうですが、スレッドセーフじゃないというのは確かに痛いかもですね。思わぬところで予想外の動作をする可能性はありそうです。
参考になります。回答有り難うございました。
失礼ながら上記URLの意図が分からないのですが。。
__autoloadの使い方は理解しているつもりです。
動的に読み込むクラス名は名前の末尾に「○○Class」をつけ、
それ以外は内部メソッド名とするなど規則性を持たせて名前の衝突を回避するとか方法はありそうですが、スレッドセーフじゃないというのは確かに痛いかもですね。思わぬところで予想外の動作をする可能性はありそうです。
参考になります。回答有り難うございました。