namespace a;class A{ public function __construct() { echo 'a'; }}namespace b;use a\A;$a1 = 'A';$a2 = 'a\A';// new $a1(); //報錯// new $a2(); //正常// new A(); //正常
那麼問題來了,我在上面已經引入過命名空間了,為什麼new $a1()
找不到類,而直接new A()
正常??可變類名只有寫全部的命名空間才有用,引入的命名空間不生效,為什嗎?希望大神幫忙解答一下。
回複內容:
namespace a;class A{ public function __construct() { echo 'a'; }}namespace b;use a\A;$a1 = 'A';$a2 = 'a\A';// new $a1(); //報錯// new $a2(); //正常// new A(); //正常
那麼問題來了,我在上面已經引入過命名空間了,為什麼new $a1()
找不到類,而直接new A()
正常??可變類名只有寫全部的命名空間才有用,引入的命名空間不生效,為什嗎?希望大神幫忙解答一下。
機制就是這樣的,實際上在編譯時間,所有的類都會被轉換為攜帶命名空間的全名,而命名空間也就從程式中消失了。而變數由於在程式運行時才會被確定,所以已經沒法享受命名空間的便利,也就必須為類全名。
namespace YourNamespace;
use MyNamespace\Demo;
use MyNamespace\Demo as MyDemo;
new Demo(); //這個是對的,因為 use MyNamespane/Demo
new MyDemo(); //也是對的,因為 MyNamespace/Demo as MyDemo;
new \MyNamespace\Demo(); //也是對的,\表示根
new MyNamespace\Demo(); //錯了,這表示 new \YourNamespace\MyNamespace\Demo
明白了?
new $a1()失敗是 @有明 說的原因