2012-08-26 34 views
6

Tôi cố gắng để sử dụng không gian tên trong php với một số lớp và giao diện.PHP Namespaces và giao diện

Dường như tôi phải đưa một tuyên bố sử dụng cho cả giao diện và các loại bê tông được sử dụng. Đây là loại đánh bại mục đích sử dụng giao diện chắc chắn?

Vì vậy, tôi có thể có

//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 
{} 

Isnt toàn bộ các điểm giao diện sao cho các loại bê tông được hoán đổi cho nhau - điều này đi ngược lại mà chắc chắn. Trừ khi tôi không làm điều gì đó một cách chính xác

Trả lời

5

Việc thực hiện bê tông LÀ hoán đổi cho nhau, nhưng bạn cần phải xác định nơi nào đó mà thực hiện bạn muốn sử dụng, phải không?

// 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

Vì vậy, thay vì sử dụng 'sử dụng không gian tên' chỉ cần sử dụng đường dẫn đầy đủ đến lớp thay thế? –

+1

Không nhất thiết, bạn cũng có thể nhập lớp vào không gian tên hiện tại. Đó chỉ là vấn đề về phong cách. – Niko

+0

Vâng, tôi đã suy nghĩ rằng kể từ khi im bằng cách sử dụng một giao diện tôi muốn không gian tên là giao diện - nhưng thực sự trên sự phản ánh mà không làm cho bất kỳ ý nghĩa. Một lựa chọn tốt hơn sẽ được sử dụng tiêm phụ thuộc tôi giả sử và không bao giờ nhanh chóng một lớp học có thể được hoán đổi cho nhau ?? –

Các vấn đề liên quan