3

それで、

名前空間を使用した動的オブジェクトの作成に問題があります。名前空間のコードは次のとおりです。

namespace Foo
{
   class Bar
   {
   }
}

今、私はクラスのオブジェクトを作成しようとしていますBar:

include('namespace.php');
$sName  = 'Bar';
$sClass = '\\Foo\\'.$sName;
$rObj   = new $sClass; //correct object

そして、すべてがうまくいっています。しかし、今はエイリアスを使用して次のようなことをしたいと思っています:

include('namespace.php');
use Foo as Baz;
$sName  = 'Bar';
$sClass0= '\\Foo\\'.$sName;
$sClass1= '\\Baz\\'.$sName;
$rObj   = new $sClass0; //correct object
$rObj   = new $sClass1; //Fatal error

そして、そのような方法でオブジェクトをインスタンス化することはできません (フルネームでアクセスしてもうまくいきます)。だから、私の質問は - 何らかの方法でエイリアスを介してクラスにアクセスすることは可能ですか? はいの場合、どのように? 使用時にアクセスしようとしましたが$sClass1='Baz\\'.$sName、成功しませんでした。get_declared_classes()また、関数を介して宣言されたクラスをチェックしました。クラスしかないことを示しています\Foo\Bar(エイリアスへの参照はありません)。

問題があるかどうかはわかりませんが、PHP 5.5 バージョンを使用しています。

4

1 に答える 1

6

パーサーだけが名前空間エイリアスを使用して、各ファイル内のクラス参照を正規化します。

つまり、他のコードが使用できるある種のグローバル エイリアスは導入されません。スクリプトが解析されると、エイリアスは使用されなくなります。

この動作は、マニュアルにも記載されています。

インポートはコンパイル時に実行されるため、動的クラス、関数、または定数名には影響しません。

于 2013-08-20T07:15:13.243 に答える