DI,依靠注入(Dependency Injection),没必要本身在代码中保护对象的依靠,容器自动依据设置,将依靠注入指定对象
某地区有种种差别的市肆,每家市肆都卖四种生果:苹果十元一个、香蕉二十元一个、橘子三十元一个、西瓜四十元一个,主顾能够在任意市肆举行购置,每家市肆须要能够随时向税务局供应总销售额。(引荐进修:PHP编程从入门到通晓)
开端代码完成
class Shop
{
// 市肆的名字
private $name;
// 市肆的总销售额
private $turnover = 0;
public function __construct($name){
$this->name = $name;
}
// 售卖商品
public function sell($commodity){
switch ($commodity){
case 'apple':
$this->turnover += 10;
echo "卖出一个苹果<br/>";
break;
case 'banana':
$this->turnover += 20;
echo "卖出一个香蕉<br/>";
break;
case 'orange':
$this->turnover += 30;
echo "卖出一个橘子<br/>";
break;
case 'watermelon':
$this->turnover += 40;
echo "卖出一个西瓜<br/>";
break;
}
}
// 显现市肆现在的总销售额
public function getTurnover(){
echo $this->name.'现在为止的销售额为:'.$this->turnover;
}
}
// 主顾类
class Human
{
//从市肆购置商品
public function buy(Shop $shop,$commodity){
$shop->sell($commodity);
}
}
// new一个名为kfc的市肆
$kfc = new Shop('kfc');
// new一个名为mike的主顾
$mike = new Human();
// mike从kfc买了一个苹果
$mike->buy($kfc,'apple');
// mike从kfc买了一个香蕉
$mike->buy($kfc,'banana');
// 输出kfc的总营业额
echo $kfc->getTurnover();
能够看到,虽然代码完成了对现在需求的完成,然则此时的 shell() 要领依靠于细致的实践而且具有相对的掌握权。一旦我们须要在市肆到场一个新的商品,比方芒果mango,那我们不得不去修正市肆类的 sell() 要领,违反了 OCP 准绳,即对扩大开放,对修正封闭。
此时我们能够修正代码以下
abstract class Fruit
{
public $name;
public $price;
}
class Shop
{
//市肆的名字
private $name;
//市肆的总销售额
private $turnover = 0;
public function __construct($name){
$this->name = $name;
}
//售卖商品
public function sell(Fruit $commodity){
$this->turnover += $commodity->price;
echo '卖出一个'.$commodity->name.',收入'.$commodity->price."元<br/>";
}
//显现市肆现在的总销售额
public function getTurnover(){
echo $this->name.'现在为止的销售额为:'.$this->turnover;
}
}
//主顾类
class Human
{
//从市肆购置商品
public function buy(Shop $shop,$commodity){
$shop->sell($commodity);
}
}
class Apple extends Fruit
{
public $name = 'apple';
public $price = 10;
}
class Bananae extends Fruit
{
public $name = 'banana';
public $price = 20;
}
class Orange extends Fruit
{
public $name = 'orange';
public $price = 30;
}
class Watermelon extends Fruit
{
public $name = 'watermelon';
public $price = 40;
}
//new一个名为kfc的市肆
$kfc = new Shop('kfc');
//new一个名为mike的主顾
$mike = new Human();
//mike从kfc买了一个苹果
$mike->buy($kfc,new Apple());
//mike从kfc买了一个香蕉
$mike->buy($kfc,new Bananae());
//输出kfc的总营业额
echo $kfc->getTurnover();
上面的代码增加了一个名为 Fruit 的笼统类,一切的生果都独立成差别的继续了 Fruit 的类,此时 sell() 要领不再依靠细致的生果名,而是依靠于笼统的 Fruit 类,决议卖了多少钱的掌握权不再包含在要领内,而是由要领外传入,这就是掌握反转,而完成掌握反转的历程就是依靠注入。
经由过程掌握反转,对象在被建立的时刻,由一个调控体系内一切对象的外界实体,将其所依靠的对象的援用通报给它。也能够说,依靠被注入到对象中。
以上就是php掌握反转怎样完成的的细致内容,更多请关注ki4网别的相干文章!