看 Laravel 源代码了解 Container
i
<?php
function info($msg){
echo $msg;
}
class LogToFile {
public function execute($message) {
info('log the message to a 美羊羊 :'.$message);
}
}
class UseLogger {
protected $logger;
public function __construct(LogToFile $logger) {
$this->logger = $logger;
}
public function show() {
$user = '小灰灰';
$this->logger->execute($user);
}
}
$useLogger = new UseLogger(new LogToFile());
$useLogger->show();
ii
A
<?php
function info($msg){
echo $msg;
}
class LogToFile {
public function execute($message) {
info('log the message to a 美羊羊 :'.$message);
}
}
class LogToDD {
public function execute($message) {
info('log the message to 喜羊羊 :'.$message);
}
}
class UseLogger {
protected $logger;
public function __construct(LogToFile $logger) {
$this->logger = $logger;
}
public function show() {
$user = '小灰灰';
$this->logger->execute($user);
}
}
$useLogger = new UseLogger(new LogToFile());
$useLogger->show();
B
<?php
function info($msg){
echo $msg;
}
class LogToFile {
public function execute($message) {
info('log the message to a 美羊羊 :'.$message);
}
}
class LogToDD {
public function execute($message) {
info('log the message to 喜羊羊 :'.$message);
}
}
class UseLogger {
protected $logger;
public function __construct(LogToDD $logger) {
$this->logger = $logger;
}
public function show() {
$user = '小灰灰';
$this->logger->execute($user);
}
}
$useLogger = new UseLogger(new LogToDD());
$useLogger->show();
iii
<?php
function info($msg){
echo $msg;
}
interface Logger {
public function execute($message);
}
class LogToFile implements Logger {
public function execute($message) {
info('log the message to a 美羊羊 :'.$message);
}
}
class LogToDD implements Logger {
public function execute($message) {
info('log the message to 喜羊羊 :'.$message);
}
}
class UseLogger {
protected $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function show() {
$user = '小灰灰';
$this->logger->execute($user);
}
}
$useLogger = new UseLogger(new LogToFile());
$useLogger->show();
echo '<br>';
$useLogger = new UseLogger(new LogToDD());
$useLogger->show();
终极版
<?php
function info($msg){
echo $msg;
}
interface Logger {
public function execute($message);
}
class LogToFile implements Logger {
public function execute($message) {
info('log the message to a 美羊羊 :'.$message);
}
}
class LogToDD implements Logger {
public function execute($message) {
info('log the message to 喜羊羊 :'.$message);
}
}
class UseLogger {
protected $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function show() {
$user = '小灰灰';
$this->logger->execute($user);
}
}
class SimpleContainer {
// 用于存储所有绑定 key-value
protected static $container = [];
public static function bind($name, Callable $resolver) {
static::$container[$name] = $resolver;
}
public static function make($name) {
if(isset(static::$container[$name])){
$resolver = static::$container[$name] ;
return $resolver();
}
throw new Exception("Binding does not exist in container");
}
}
SimpleContainer::bind(Logger::class, function () {
return new LogToDD();
});
$useLogger3 = new UseLogger(SimpleContainer::make(Logger::class));
$useLogger3->show();
发表回复