2012-08-26 21 views
6

Sto cercando di utilizzare gli spazi dei nomi in php con alcune classi e interfacce.PHP Namespace e interfacce

Sembra che sia necessario inserire un'istruzione di utilizzo per l'interfaccia e il tipo di calcestruzzo utilizzato. Questo è un po 'come sconfiggere lo scopo di usare le interfacce sicuramente?

così che io possa avere

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

non è il punto centrale di interfacce in modo che i tipi concreti sono intercambiabili - questo va contro che sicuramente. A meno che non stia facendo qualcosa correttamente

risposta

5

L'implementazione concreta è intercambiabile, ma è necessario specificare da qualche parte quale implementazione si desidera utilizzare, giusto?

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

Quindi, anziché utilizzare "usa spazio dei nomi", utilizzare invece il percorso completo della classe? –

+1

Non necessariamente, è anche possibile importare la classe nello spazio dei nomi corrente. È solo una questione di stile. – Niko

+0

Sì, stavo pensando che, dal momento che sto usando un'interfaccia, voglio che lo spazio dei nomi sia l'interfaccia, ma in realtà su una riflessione che non ha alcun senso. Un'opzione migliore sarebbe quella di utilizzare l'iniezione di dipendenza suppongo e mai istanziare una classe che può essere intercambiabile ?? –