2013-05-29 27 views
2

創建的類使用命名空間因此,我創建這兩個類與可變

//Quarter.php 
namespace Resources; 
class Quarter { 
    ... 
} 


//Epoch.php 
namespace Resources; 
class Epoch { 

    public static function initFromType($value, $type) { 
     $class = "Quarter"; 
     return new $class($value, $type); 
    }  
} 

現在,這是兩者的一個非常簡化的版本,但也足以說明我的問題。這裏顯示的類不起作用,因爲它不會找到Quarter類。爲了使它工作,我可以在$類變量更改爲

$class = "\Resources\Quarter"; 

所以我的問題是:爲什麼我需要在這兩個類都已經同一個命名空間的成員在這裏使用的命名空間。命名空間只有當我把類名放入一個變量時才需要這麼做:

public static function initFromType($value, $type) { 
     return new Quarter($value, $type); 
    }  

將工作沒有問題。爲什麼會這樣,我是否有任何潛在的陷阱需要避免?

回答

3

因爲字符串可以從一個命名空間傳遞到另一個命名空間。這使得名稱解析模糊不清,容易引入奇怪的問題。

namespace Foo; 

$class = 'Baz'; 

namespace Bar; 

new $class; // what class will be instantiated? 

在一定的命名空間的文字不會有這樣的問題:

namespace Foo; 

new Baz;  // can't be moved, it's unequivocally \Foo\Baz 

因此,所有的「串類名」始終是絕對的,需要寫成FQN:

$class = 'Foo\Baz'; 

(注意:不是主導\。)

您可以使用此作爲shorth並且相當於一個自我指涉self類:

$class = __NAMESPACE__ . '\Baz'; 
+0

感謝您的好回答欺騙:) – Sondre