0

これは私を困惑させています。最初の行が機能するのはなぜですか?オブジェクトを動的に作成すると機能しませんか?

$a = new Strategy\NotificationStrategy(); // This works

$className = "Strategy\\NotificationStrategy";
var_dump(class_exists($className)); // bool(false)
$strategy = new $className(); // Fatal error: Class 'Strategy\NotificationStrategy' not found, etc..
4

2 に答える 2

1

名前空間はコンパイル時に解決されます。文字列からオブジェクトを作成しようとするときは、クラスの絶対パスを定義する必要があります。このようなもの:

$className = "\\Vendor\\Package\\Strategy\\NotificationStrategy";

また

$className = __ NAMESPACE __."\\Strategy\\NotificationStrategy";
于 2013-02-27T22:52:33.660 に答える
0

うーん...私はあなたがしたことと同様のことを試しました:

戦略.php:

<?php
    namespace Strategy{

      class NotificationStrategy{
        public function hello(){ echo "Hi!\n"; }
      }
    }
?>

インスタンス化.php

<?php
  require 'strategy.php';

  $ns    = new Strategy\NotificationStrategy();
  $klass = "Strategy\\NotificationStrategy";
  $qq    = new $klass();

  $qq->hello(); // Hi!
?>

これは私にとっては問題なく機能したので、問題がある場合は、必要な問題があると思います...おそらく、クラス定義を含むファイルのインクルードの前に動的呼び出しが起動しようとしていますか?

于 2013-02-27T22:57:00.577 に答える