interface ILogger{
/**
* @param String テキスト
*/
public function show(string $string);
}
class BrowserLogger implements ILogger{
/**
* @Override
*/
public function show(string $string){
print($string . '<br />');
}
}
class ErrorlogLogger implements ILogger{
/**
* @Override
*/
public function show(string $string){
error_log($string);
}
}
class HelloWorld{
private $logger;
/**
* @param Logger
*/
public function __construct(ILogger $logger){
$this->logger = $logger;
}
/**
* @param String $string
*/
public function show(string $string){
$this->logger->show($string);
}
}
$helloWorld1 = new HelloWorld(new BrowserLogger());
$helloWorld1->show('hello, world');
$helloWorld2 = new HelloWorld(new ErrorlogLogger());
$helloWorld2->show('hello, world');
最低限の概念だけ実装したらこんなかんじだと思うんだけど、
で、だからこれがどうしたんだ、という気がしてならない。
だってみんな普通public function setPdo(PDO $pdo){ $this->pdo=$pdo; }
とかやるよね?
その程度ことをわざわざDIとか言ってるのか?
PDOはInterfaceじゃないけど、かわりにabstract class PDOInterface extends PDO{}
とか書いとけば、まあだいたい同じ意味になるだろう。