2012-08-26 10 views
6

Estoy tratando de usar espacios de nombres en php con algunas clases e interfaces.Espacios de nombres PHP e interfaces

Parece que debo poner una declaración de uso tanto para la interfaz como para el tipo concreto que se utiliza. ¿Esto es una especie de derrotar el propósito de usar interfaces con seguridad?

así que pude haber

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

¿No es todo el punto de interfaces de modo que los tipos concretos son intercambiables - esto va en contra que a buen seguro. A menos que no esté haciendo algo correctamente

Respuesta

5

La implementación concreta ES intercambiable, pero necesita especificar en algún lugar qué implementación desea usar, ¿no?

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

Entonces, en lugar de usar 'usar espacio de nombres', ¿usar la ruta completa a la clase? –

+1

No necesariamente, también puede importar la clase en el espacio de nombre actual. Eso es solo una cuestión de estilo. – Niko

+0

Sí, estaba pensando que, como estoy utilizando una interfaz, quiero que el espacio de nombres sea las interfaces, pero en realidad, al reflexionar eso no tiene ningún sentido. Una mejor opción sería usar inyección de dependencia, supongo, y nunca instanciar una clase que pueda ser intercambiable. –