• ベストアンサー

変数によるクラスの呼び出しができない

変数によるクラスの呼び出しができません。 <?php class test { public function test_method () { $return = "test"; return $return; } } $test1 = 'test'; $test2 = 'test_method'; new $test1; echo $test1::$test2 (); ?> 問題が起こっているのは new $test1; echo $test1::$test2 (); の部分の$test1をtestに変更する事で正しく動作します。 実際に使う時には$_GETの入力値から呼び出すクラスの変更を行おうと考えています。 セキュリティー対策として登録済みクラスの対応表を使っての呼び出しを行っているので対応表を if ($_GET["~"] == ~) { new ~; ~::test(); } else... のような形式に出来ないわけではないですが対応表自身が変動する為この方法では対応表の書き換えが大変困難なものになってしまいます。 変数を使った呼び出しの方法は無いもなのでしょうか。 環境はWeb ServerがApache 2.2.0,PHPが5.1.4の状態でmod_suPHP 0.6.1を使っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 えと………どのように学ばれたのか背景が不明ではあるのですが。クラスの使い方の基本が根本から間違ってますので、是非一度履修されなおすことをお勧めいたします。 まず、 new $test1; については、最低限きちんと $obj = new $test1; とすべきです。これは、new演算子が「インスタンスを返すもの」だからです。 次に echo $test1::$test2(); ですが、メソッド名を動的にする必要があると仮定して、これはPHPであれば call_user_func などを用いたほうがよろしいかと思われます。 上述と絡めると、$test1の部分はインスタンスが格納されている変数名になろうかと思うのですが。 ただ、万全のセキュリティ対策を施してなお、 > 実際に使う時には$_GETの入力値から呼び出すクラスの変更を行おうと考えています。 については危険性が伴うので、十二分に注意が必要かと思われます。 # 多分MVC系のフレームワークのコントローラ部分なのだろうと思われるのですが… # あと、もしコントローラ部分なら、メソッド名は固定に出来ると思います。

izayoimizuki
質問者

お礼

> えと………どのように学ばれたのか背景が... 学んだもなにも余りにユーザー定義関数が増えたため(既に100位存在します)クラスにより有る程度分類しなければ 名前が衝突する事態に陥り始めた為に何か対応が必要になった次第です。 > ですが、メソッド名を動的にする必要があると仮定して... 分かりました。参考にさせていただきます。 > ただ、万全のセキュリティ対策を施してなお、 > > 実際に使う時には$_GETの入力値から呼び出すクラスの変更を行おうと考えています。 > については危険性が伴うので、十二分に注意が必要かと思われます。 「$_GETの入力値と同じキーを持つ配列の要素を探しもし見つかった場合要素が保持する値が呼び出すべきクラス名」 となっていますので入力値が直接呼び出すクラス名を指定できる状態にはなっていません。 $class_list = array ("class1" => "class_a", "class2" => "class_b"); $mode = $_GET["mode"]; if (isset ($class_list[$mode])) { $obj = new $class_list[$mode]; } といった挙動です。 > # 多分MVC系のフレームワークのコントローラ部分なのだろうと思われるのですが… > # あと、もしコントローラ部分なら、メソッド名は固定に出来ると思います。 クラスを定義しているファイル自身が独立したファイルです。 またApacheのモジュールのような組み換えを可能にしたい為クラス名の固定を行う事が出来ません。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

<?php class test{ function test_method(){ $return = "test"; return $return; } } $test1 = 'test'; $test2 = 'test_method'; $testclass=new $test1; echo $testclass->$test2(); ?>

izayoimizuki
質問者

お礼

ありがとうございます。 解決しました。

関連するQ&A