博客列表 >php教学设计模式与依赖管理_12.5

php教学设计模式与依赖管理_12.5

果莫个人博客
果莫个人博客原创
2023年01月16日 22:51:01640浏览
autoload.php<?phpspl_autoload_register(function ($className)){    $path = str_replace('\\','/',$className);    require dirname(__DIR__).DIRECTORY_SEPARATOR.$path.'.php';});Travel1.php<?php//旅游namespace base;//设置引用的外部类名的别名use base\inc1\Car;use base\inc1\Train;use base\inc1\Plane;require __DIR__.'/autoload.php';class Travel1{    //交通工具    private $vehicle;    //构造方法    public function __construct($vehicle)    {        switch (strtolower($vehicle))        {            case 'car';            $this->vehicle=new Car();            break;            case 'train';            $this->vehicle=new Train();            break;            case 'plane';            $this->vehicle=new Plane();            break;        }    }    //调用外部一个依赖对象    public function travelModel()    {        return $this->vehicle->drive().':去旅行';    }}//客户端调用echo (new Travel1('car'))->travelModel(),'<br>';echo (new Travel1('train'))->travelModel(),'<br>';echo (new Travel1('plane'))->travelModel(),'<br>';Travel2.php<?php//旅游namespace base;//设置引用的外部类名的别名use base\inc1\Car;use base\inc1\Train;use base\inc1\Plane;require __DIR__.'/autoload.php';//工厂类,专用于创建实例class Factory{    protected static $instance=null;    public static function getInstance($vehicle)    {        switch (strtolower($vehicle))        {            case 'car':                self::$instance=new Car();            case 'train':                self::$instance=new Train();            case 'plane':                self::$instance=new Plane();        }        //返回当前具体的交通工具        return self::$instance;    }}class Travel2{    //交通工具    private $vehicle;    //构造方法    public function __construct($vehicle)    {        $this->vehicle=Factory::getInstance($vehicle);    }    //调用外部一个依赖对象    public function travelModel()    {        return $this->vehicle->drive().':#####去旅行';    }}//客户端调用echo (new Travel2('car'))->travelModel(),'<br>';echo (new Travel2('train'))->travelModel(),'<br>';echo (new Travel2('plane'))->travelModel(),'<br>';Travel3.php<?php//旅游namespace base;//设置引用的外部类名的别名use base\inc2\Car;use base\inc2\Train;use base\inc2\Plane;use base\inc2\Ship;use base\inc2\iVehicle;require __DIR__.'/autoload.php';class Travel3{    //交通工具    private $vehicle;    //构造方2    public function __construct(iVehicle $vehicle)    {        $this->vehicle=$vehicle;    }    //调用外部一个依赖对象    public function travelModel()    {        return $this->vehicle->drive().':#####去旅行';    }}//客户端调用$car =new Car();echo (new Travel3($car))->travelModel(),'<br>';echo (new Travel3(new Train()))->travelModel(),'<br>';echo (new Travel3(new Plane()))->travelModel(),'<br>';echo (new Travel3(new Ship()))->travelModel(),'<br>';inc1/Car.php<?phpnamespace base\inc1;class Car{    public function drive()    {        return '开汽车';    }}inc1/Plane.php<?phpnamespace base\inc1;class Plane{    public function drive()    {        return '乘飞机';    }}inc1/Train.php<?phpnamespace base\inc1;class Train{    public function drive()    {        return '坐火车';    }}inc2/Car.php<?phpnamespace base\inc2;class Car implements iVehicle{    public function drive()    {        return '开汽车';    }}inc2/iVehicle.php<?phpnamespace base\inc2;//交通工具的接口interface iVehicle{    public function drive();}inc2/Plane.php<?phpnamespace base\inc2;class Plane implements iVehicle{    public function drive()    {        return '乘飞机';    }}inc2/Ship.php<?phpnamespace base\inc2;class Ship implements iVehicle{    public function drive()    {        return '坐轮船';    }}inc2/Train.php<?phpnamespace base\inc2;class Train implements iVehicle{    public function drive()    {        return '坐火车';    }}

lesson1

##Container.php<?php//容器类namespace _1205;//引入闭包别名use Closure;class Container{    //容器数组/实例容器/类实例容器    protected $instance = [];    //将类实例化的过程绑定到容器中    public function bind($alias,Closure $process)    {        $this->instance[$alias]=$process;//        //创建产品实例//        $product = new Product();//        //创建制造商实例//        $maker = new Marker();//        //制造商注入到产品类中//        return  $product->get($maker);    }    //取出保存在容器中的实例化过程的闭包,并执行他    public function make($alias)    {        return $this->instance[$alias]();//        call_user_func_array()    }}##Mark.php<?phpnamespace _1205;//制造商class Marker{    public function get()    {        return '华为';    }}##Product.php<?phpnamespace _1205;//商品类class Product{    public function get(Marker $marker)    {        return '该手机是由:'. $marker->get().'生产的';    }}##demo1.php<?phpnamespace _1205;require 'Product.php';require 'Marker.php';//先不用容器class Client1{    //输出商品与制造商    public function show()    {        //创建产品实例        $product = new Product();        //创建制造商实例        $maker = new Marker();        //制造商注入到产品类中       return  $product->get($maker);       //相当于$instances[obj]=new Product();        //make()方法去除new Product();    }}//客户端调用echo (new Client1())->show();##demo2.php<?phpnamespace _1205;require 'Product.php';require 'Marker.php';require 'Container.php';//先不用容器class Client2{    //输出商品与制造商    public function show(Product $product,Marker $marker)    {//        //创建产品实例//        $product = new Product();//        //创建制造商实例//        $maker = new Marker();//        //制造商注入到产品类中        return $product->get($maker);        //相当于$instances[obj]=new Product();        //make()方法去除new Product();    }}//客户端调用//将类实例绑定到容器中并实例化且返回$container = new Container();//将产品类与它的实例化代码绑定到容器中$container->bind('product',function (){return new Product();});$container->bind('maker',function (){return new Maker();});//创建实例并返回$product =  $container->make('product');$maker =  $container->make('maker');echo (new Client2())->show($product,$maker);

总结:如果只学到这里的话,看懂很容易,但是自己写基本上是不可能的了,这辈子都不可能的了,只能希望在后面学习中看看能不能有突破了。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议