PHPは、クラスの名前からオブジェクトを文字列としてインスタンス化できますか?


83

クラス名が文字列に格納されている場合、PHPでクラス名からオブジェクトをインスタンス化することは可能ですか?

回答:


138

うん、間違いなく。

$className = 'MyClass';
$object = new $className; 

7
かっこいい、私はheheに尋ねる前にそれをテストするべきだった。ありがとう!
user135295 2009

2
@ user-正しすぎる。最低限のことをするのではなく、なぜ直接SOに来たのだろうか。笑
ベン

2
実際、それはそれほど明白ではありません。Javaではリフレクションと呼ばれるものであることは知っていますが、これはそれに比べて非常に単純です。
バルティスアロン2014年

4
clsssが名前空間にある場合は、この$ class = 'PrintData \\'を使用します。$ class; 新しい$ class();を返します。
Dariux 2015年

2
また、PHPのドキュメントに記載されているように、インスタンス化するクラスが名前空間内にある場合は、FQN(完全修飾名)を指定する必要があります。たとえば、私自身は「App \ Http \ Controllers」という名前空間内にいて、文字列$ string = 'App \ Models \ Task';を持っていました。文字列をインスタンス化しようとすると壊れると思いましたが、実際には最初に\を追加する必要はありません。
Matt Kieran 2018年


5

クラスに引数が必要場合は、次のようにする必要があります

class Foo 
{
   public function __construct($bar)
   {
      echo $bar; 
   }
}

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));

3

静的も:

$class = 'foo';
return $class::getId();

これは質問に対する答えを提供しません。著者に批評したり説明を求めたりするには、投稿の下にコメントを残してください。-レビューから
Blackbam 2017

@Blackbam関連の関連する補足回答。役に立つ場合にのみコメントしてください。
Andrew Atkinson

確かにそれは基本的にはとにかくうまくいきますあなたの答えの少しの説明がいいでしょう。質問は「PHPがオブジェクトをインスタンス化できるか」でしたが、静的メンバー関数へのアクセスはオブジェクトアクセスではありません。
ブラックバム2017

0

クラス名/メソッドをデータベースなどのストレージに保存することで、動的な呼び出しを行うことができます。クラスがエラーに対して回復力があると仮定します。

sample table my_table
    classNameCol |  methodNameCol | dynamic_sql
    class1 | method1 |  'select * tablex where .... '
    class1 | method2  |  'select * complex_query where .... '
    class2 | method1  |  empty use default implementation

次に、クラスとメソッド名のためにデータベースから返された文字列を使用してコード内で。クラスのSQLクエリ、想像力に応じた自動化のレベルを保存することもできます。

$myRecordSet  = $wpdb->get_results('select * from my my_table')

if ($myRecordSet) {
 foreach ($myRecordSet   as $currentRecord) {
   $obj =  new $currentRecord->classNameCol;
   $obj->sql_txt = $currentRecord->dynamic_sql;
   $obj->{currentRecord->methodNameCol}();
}
}

このメソッドを使用して、RESTWebサービスを作成します。


1
そして、私があなたのデータベースに任意の数のクラスとメソッドを注入することができれば、私はあなたの残りのAPI全体を所有しています....称賛!このコードは使用しないでください。非常に危険です。
JamesKipling20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.