web-dev-qa-db-ja.com

PHP 5.3名前空間を使用した文字列によるクラスのインスタンス化

文字列変数とPHP 5.3。名前空間を使用して新しいクラスをインスタンス化する問題を回避することはできません。たとえば、これは機能します。

$class = 'Reflection';
$object = new $class();

ただし、これはありません。

$class = '\Application\Log\MyClass';
$object = new $class();

クラスが見つからないという致命的なエラーがスローされます。ただし、FQNを使用している場合は明らかにインスタンス化できます。

$object = new \Application\Log\MyClass;

PHP 5.3.2-1ではないが、それ以降のバージョンではそうではない。これに回避策はありますか?

36
Kevin
$class = 'Application\Log\MyClass';
$object = new $class();

開始\は、(完全修飾された)名前空間付き識別子を導入しますが、クラス名自体の一部ではありません。

68
Artefacto

同じ結果を得るが動的引数を使用する別の方法は次のとおりです。以下のクラスをインスタンス化するクラスと見なしてください。

<?php

// test.php

namespace Acme\Bundle\MyBundle;

class Test {
    public function __construct($arg1, $arg2) {
        var_dump(
            $arg1,
            $arg2
        );
    }
}

その後:

<?php

require_once('test.php');

(new ReflectionClass('Acme\Bundle\MyBundle\Test'))->newInstanceArgs(['one', 'two']);

PHPの最新バージョンを使用していない場合は、上記の例の最後の行を置き換える次のコードを使用してください。

$r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
$r->newInstanceArgs(array('one', 'two'));

コードは次の出力を生成します。

string(3) "one"
string(3) "two"
5

同じ問題があり、この問題を回避する方法を見つけました。おそらくあまり効率的ではありませんが、少なくとも機能します。

function getController($controller)
{
    return new $controller;
}

$object = getController('Application\Log\MyClass');
0
Przemek Kro