博客列表 >设计模式与服务容器---PHP九期线上班

设计模式与服务容器---PHP九期线上班

一丁
一丁原创
2019年12月08日 16:48:17791浏览

1.demo1


实例

<?php
//命名空间
namespace _1205;

class Temp{
}
//实例化
$obj1 = new Temp();
$obj2 = new Temp();
//输出
var_dump($obj1, $obj2);
echo '<br>';
//输出$obj1跟$obj2是否相等
var_dump($obj1 === $obj2);
echo '<hr>';

// 单例模式原理
class Demo1{
    // 构造方法私有化
    private function __construct(){
    }

    // 目前 只能在类中的内部将类实例化
    // 当前类的实例
    public static $instance = null;

    // 实例化当前类的方法
    public static function getInstance(){
        // 实例化当前类,并返回类实例/对象
        // 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它
        if (is_null(self::$instance)) {
            //静态调用$instance=实例化本身
            self::$instance = new self();
        }
        //返回$instance
        return self::$instance;
    }
    // 禁用克隆魔术方法
    private function __clone(){
    }
}

//静态调用Demo1类里的getInstance()方法
$obj1 = Demo1::getInstance();
$obj2 = Demo1::getInstance();
//输出$obj1是否跟obj2相等
var_dump($obj1 === $obj2);
echo '<br>';
//输出$obj1和$obj2
var_dump($obj1, $obj2);
echo '<hr>';

// 单例模型应用场景
class Db{
    // 构造方法私有化
    private function __construct(...$connectParams){
        //定义PDO的3个参数
        $dsn = $connectParams[0];
        $username = $connectParams[1];
        $password = $connectParams[2];
        //实例化PDO,把值传给$pdo
        self::$pdo = new \PDO($dsn, $username, $password);
    }

    // 目前 只能在类中的内部将类实例化
    // 当前类的实例
    public static $pdo = null;

    // 实例化当前类的方法
    public static function getInstance(...$connectParams){
        // 实例化当前类,并返回类实例/对象
        // 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它
        if (is_null(self::$pdo)) {
            // 构造函数不需要返回
            new self(...$connectParams);
        }
        //如果已经实例化就返回$pdo
        return self::$pdo;
    }
    // 禁用克隆魔术方法
    private function __clone(){
    }
}
echo '<hr>';
//连接数据库
$connectParams = ['mysql:host=localhost;dbname=test2', 'root', 'root'];
//静态调用Db类的getInstance方法
$pdo = Db::getInstance(...$connectParams);
//查询结果输出
print_r($pdo->query('SELECT * FROM `user`')->fetchAll());

运行实例 »

点击 "运行实例" 按钮查看在线实例



2.demo2

实例

<?php
//命名空间
namespace _1205;
// 工厂模式: 用于批量创建类的实例/对象
use mvc\Facade;
//创建类
class Demo2{
}
// file1.php
$obj = new Demo2();
// file2.php
$obj = new Demo2();
// file3.php
$obj = new Demo2();

/********************************************/
//创建类
class Test1{
    //构造方法
    public function __construct($arg1){
        //输出内容
        echo '对象创建成功, 参数是: ' . $arg1;
    }
}
//创建类
class Test2{
    //构造方法
    public function __construct($arg1, $arg2){
        //输出内容,把数组合为一个字符串
        echo '对象创建成功, 参数是: ' . implode(', ', [$arg1, $arg2]);
    }
}
//创建类
class Test3{
    //构造方法
    public function __construct($arg1, $arg2, $arg3){
        //输出内容,把数组合为一个字符串
        echo '对象创建成功, 参数是: ' . implode(', ', [$arg1, $arg2, $arg3]);
    }
}

// 工厂类, 专用于创建类实例
class Factory{
    //创建静态方法
    public static function create($className, ...$argments){
        //返回实例化
        return new $className(...$argments);
    }
}
//echo Test1::class; // _1205\Test1: 完整的类名, 带有命名空间的
// 用工厂类来创建类实例/对象
//静态调用Factory的create方法,静态调用Test1,参数为class,值为100
Factory::create(Test1::class, 100);
echo '<br>';
//静态调用Factory的create方法,静态调用Test2,参数为class,值为100,200
Factory::create(Test2::class, 100, 200);
echo '<br>';
//静态调用Factory的create方法,静态调用Test3,参数为class,值为100,200,300
Factory::create(Test3::class, 100, 200, 300);

运行实例 »

点击 "运行实例" 按钮查看在线实例



3.demo3


实例

<?php
//命名空间
namespace _1205;
// 工作类
class Person{
    // 要依赖的外部对象
    private $car = null;
    // 在构造方法中将依赖的外部对象全部实例化
    // 注入点放到构造方法中
    public function __construct(){
       //实例化Car传值给本类的$car
        $this->car = new Car();
    }

    // 外部对象执行一个动作
    public function work(){
        //调用car的drive方法
        return $this->car->drive();
    }
}

// 依赖的外部类
class Car{
    //创建drive方法
    public function drive(){
        //返回字符串内容
        return '开车去上班';
    }
}

// 实例化类
$person = new Person();
//输出内容
echo $person->work();
echo '<hr>';

/*******************************************/
//创建类
class Person1{
    // 要依赖的外部对象
    private $car = null;

    // 在构造方法中将依赖的外部对象全部实例化
    // 注入点放到构造方法中
    public function __construct(Car $car){
        //外部获取的 $car值传给本类的car
        $this->car = $car;
    }

    // 外部对象执行一个动作
    public function work(){
        //调用外部的drive方法
        return $this->car->drive();
    }
}
// 依赖的外部类
class Car1{
    //创建drive方法
    public function drive(){
        //返回字符串内容
        return '开车去上班';
    }
}
// 实例化类
$car = new Car();
//实例化Person1类,参数为$car
$person = new Person1($car);
//调用Person1里的work方法
echo $person->work();
echo '<hr>';

运行实例 »

点击 "运行实例" 按钮查看在线实例



4.demo4

实例

<?php
//命名空间
namespace _1205;
//加载数据页
require 'Product.php';
require 'Maker.php';

// 创建类
class Client1{
    // 输出商品与制造商
    public function show(){
        // 创建产品的实例
        $product = new Product();

        // 创建制造商的实例
        $maker = new Maker();

        // 制造商注入到产品类中
        return $product->get($maker);
    }
}
// 客户端调用
echo  (new Client1())->show();

运行实例 »

点击 "运行实例" 按钮查看在线实例


5.使用容器

实例

<?php
//命名空间
namespace _1205;
//加载
require 'Product.php';
require 'Maker.php';
require 'Container.php';

// 创建类
class Client2{
    // 输出商品与制造商
    public function show(Product $product, Maker $maker){
        // 制造商注入到产品类中
        return $product->get($maker);
    }
}
// 客户端调用
// 将类实例绑定到容器中并实例化且返回
$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);

运行实例 »

点击 "运行实例" 按钮查看在线实例


image.png

image.png

总结

通过例子,知道了单例和工厂方法,还有服务容器的原理,可以增加扩展性。

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