6 Stimmen

PHP Namespaces und Schnittstellen

Ich versuche, Namespaces in PHP mit einigen Klassen und Schnittstellen zu verwenden.

Es scheint, dass ich eine Verwendungsanweisung sowohl für die Schnittstelle als auch für den konkreten Typ, der verwendet wird, angeben muss. Dies ist Art der Niederlage der Zweck der Verwendung von Schnittstellen sicherlich?

Ich habe also vielleicht

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

Ist nicht der ganze Punkt der Schnittstellen, so dass die konkreten Typen austauschbar sind - dies geht gegen das sicher. Es sei denn, ich mache etwas nicht richtig

5voto

Niko Punkte 26266

Die konkrete Implementierung IST austauschbar, aber Sie müssen irgendwo angeben, welche Implementierung Sie verwenden möchten, richtig?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X