2012-08-26 81 views
6

我想在一些類和接口的php中使用名稱空間。PHP命名空間和接口

看來我必須爲接口和使用的具體類型提供一個使用語句。這有沒有可靠的使用接口的目的?

所以我可能有

//Interface 
namespace App\MyNamesapce; 
interface MyInterface 
{} 

//Concrete Implementation 
namespace App\MyNamesapce; 
class MyConcreteClass implements MyInterface 
{} 

//Client 
namespace App; 
use App\MyNamespace\MyInterface // i cannot do this!!!! 
use App\MyNamespace\MyConcreteClass // i must do this! 
class MyClient 
{} 

心不是接口的整點,這樣的具體類型是可以互換的 - 這無疑違背了這一點。除非我沒有正確地做某件事

回答

5

具體實現是可以互換的,但是你需要指定某個地方你想使用哪個實現,對嗎?

// Use the concrete implementation to create an instance 
use \App\MyNamespace\MyConcreteClass; 
$obj = MyConcreteClass(); 

// or do this (without importing the class this time): 
$obj = \App\MyNamespace\MyConcreteClass2(); // <-- different concrete class!  

class Foo { 
    // Use the interface for type-hinting (i.e. any object that implements 
    // the interface = every concrete class is okay) 
    public function doSomething(\App\MyNamespace\MyInterface $p) { 
     // Now it's safe to invoke methods that the interface defines on $p 
    } 
} 

$bar = new Foo(); 
$bar->doSomething($obj); 
+0

因此,而不是使用'使用命名空間'只是使用類的完整路徑呢? –

+1

不一定,您也可以將該類導入當前名稱空間。這只是一個風格問題。 – Niko

+0

是的,我只是想,因爲即時通訊使用接口,我想命名空間是接口 - 但實際上反射沒有任何意義。更好的選擇是使用依賴注入我想,並且從不實例化一個可以互換的類? –