6

私はいくつかのクラスとインターフェースでphpの名前空間を使おうとしています。

使用されているインターフェースと具象型の両方にuseステートメントを入れなければならないようです。これは確かにインターフェースを使うという目的を打ち破るようなものですか?

だから私は持っているかもしれません

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

具体的なタイプが交換可能であるように、インターフェースの全体的なポイントではありません-これは確かにそれに反します。私が正しく何かをしていない限り

4

1 に答える 1

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);
于 2012-08-26T19:21:59.610 に答える