PHP5で__GETメソッドを使って下記のように動的にクラスを読み込みたいのですが、

__autoloadを使う場合と比べて、考えられるメリット・デメリットがありましたら教えてください

class Hoge {
 function hogehoge() {
  $this->Class->method(); // 存在しないプロパティのため__getが実行される
 }
 function __get($class) {
  include $class . '.php';
  $this->$class = new $class;
  return $this->$class;
 }
}

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/03/25 16:37:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kenz-firespeed No.1

回答回数104ベストアンサー獲得回数3

ポイント70pt

考えられるデメリットとして、

後から見たときにそれがインスタンスを生成しているのか、

内部メソッドを呼び出しているのか見えにくくなります。

$this->Class;が

Classクラスを作成しているのか、内部のClassプロパティのmethodメソッドをコールしているのかを判断するには

HogeクラスのプロパティにClassが存在しないかどうかを全てチェックする必要があります。

それはつまり、HogeクラスにはClassプロパティを作成できないという事にもなります。

加えてコンストラクタにパラメータを設定できない。

__getメソッドを全てのクラスに読み込む必要がある。

スレッドセーフじゃない

などが考えられますがいかがでしょう?

id:xxmasaxx

動的に読み込むクラス名は名前の末尾に「○○Class」をつけ、

それ以外は内部メソッド名とするなど規則性を持たせて名前の衝突を回避するとか方法はありそうですが、スレッドセーフじゃないというのは確かに痛いかもですね。思わぬところで予想外の動作をする可能性はありそうです。

参考になります。回答有り難うございました。

2009/03/22 01:53:35

その他の回答1件)

id:kenz-firespeed No.1

回答回数104ベストアンサー獲得回数3ここでベストアンサー

ポイント70pt

考えられるデメリットとして、

後から見たときにそれがインスタンスを生成しているのか、

内部メソッドを呼び出しているのか見えにくくなります。

$this->Class;が

Classクラスを作成しているのか、内部のClassプロパティのmethodメソッドをコールしているのかを判断するには

HogeクラスのプロパティにClassが存在しないかどうかを全てチェックする必要があります。

それはつまり、HogeクラスにはClassプロパティを作成できないという事にもなります。

加えてコンストラクタにパラメータを設定できない。

__getメソッドを全てのクラスに読み込む必要がある。

スレッドセーフじゃない

などが考えられますがいかがでしょう?

id:xxmasaxx

動的に読み込むクラス名は名前の末尾に「○○Class」をつけ、

それ以外は内部メソッド名とするなど規則性を持たせて名前の衝突を回避するとか方法はありそうですが、スレッドセーフじゃないというのは確かに痛いかもですね。思わぬところで予想外の動作をする可能性はありそうです。

参考になります。回答有り難うございました。

2009/03/22 01:53:35
id:hijk05 No.2

回答回数1307ベストアンサー獲得回数23

id:xxmasaxx

失礼ながら上記URLの意図が分からないのですが。。

__autoloadの使い方は理解しているつもりです。

2009/03/22 01:52:46
  • id:kenz-firespeed
    メリットについても考えてみました。
    ・難読化に使える。
    一般的なリファクタリングツールでは対応できないので効果が大きい

    ・__getメソッドを工夫すれば作成するクラスを動的に切り替えることが出来る。
    ポリモーフィズムちっくにできる。

    ・呼び元のロジックが違うから、autoloadと併用可能なので、2種類の動的読み込みが使えることになる。
    別のフォルダから読み込むとか
  • id:xxmasaxx
    なるほど。考えてみるとこういうメリットもあるものですね。
    恥ずかしながら全然浮かびませんでした。どうもありがとうございます!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません