Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:画出流程图, 辅助理解, 这些都是项目开发中, 最基本的知识点, 必须明白
<?php
namespace _1205;
//use PDO;
// 单例模式
class Temp
{
// ...
}
$obj1 = new Temp();
$obj2 = new Temp();
var_dump($obj1, $obj2);
echo '<br>';
var_dump($obj1 === $obj2);
echo '<hr>';
// 单例模式原理
class Demo1
{
// 构造方法私有化
private function __construct()
{
}
// 目前 只能在类中的内部将类实例化
// 当前类的实例
public static $instance = null;
// 实例化当前类的方法
public static function getInstance()
{
// 实例化当前类,并返回类实例/对象
// 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
// 禁用克隆魔术方法
private function __clone()
{
// ...
}
}
//new Demo1();
$obj1 = Demo1::getInstance();
$obj2 = Demo1::getInstance();
var_dump($obj1 === $obj2);
echo '<br>';
var_dump($obj1, $obj2);
echo '<hr>';
// 单例模型应用场景数据库链接
class Db
{
// 构造方法私有化
private function __construct(...$connectParams)
{
$dsn = $connectParams[0];
$username = $connectParams[1];
$password = $connectParams[2];
self::$pdo = new \PDO($dsn, $username, $password);
}
// 目前 只能在类中的内部将类实例化
// 当前类的实例
public static $pdo = null;
// 实例化当前类的方法
public static function getInstance(...$connectParams)
{
// 实例化当前类,并返回类实例/对象
// 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它
if (is_null(self::$pdo)) {
// 构造函数不需要返回
new self(...$connectParams);
}
return self::$pdo;
}
// 禁用克隆魔术方法
private function __clone()
{
// ...
}
}
echo '<hr>';
$connectParams = ['mysql:host=localhost;dbname=mysql', 'root', 'root'];
$pdo = Db::getInstance(...$connectParams);
print_r($pdo->query('SELECT * FROM `db`')->fetchAll());
<?php
//工床模式
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);
}
}
// 用工厂类来创建类实例/对象
Factory::create(Test1::class, 500);
echo '<br>';
Factory::create(Test2::class,'第一个参数','第二个参数');
echo '<br>';
Factory::create(Test3::class, '第一个参数','第二个参数','第三个参数');
<?php
//依赖注入
namespace dem;
//创建类
class Person
{
// 要依赖的外部对象
private $car;
//在构造方法中将依赖的外部对象 全部实例化
public function __construct()
{
$this->car=new Car();
}
//外部对象的方法
public function work()
{
return $this->car->drive();
}
}
//依赖外部的类
class Car
{
// 外部类的方法
public function drive()
{
return '开车去上工作';
}
}
//实例化类
$Person=new Person();
echo $Person->work();
echo '<hr>';
class Person1
{
// 要依赖的外部对象
private $car ;
// 在构造方法中将依赖的外部对象全部实例化
// 注入点放到构造方法中
public function __construct(Car $car)
{
$this->car = $car;
}
// 外部对象执行一个动作
public function work()
{
return $this->car->drive();
}
}
// 依赖的外部类
class Car1
{
public function drive()
{
return '开车去上班';
}
}
// 实例化类
$car = new Car();
$person = new Person1($car);
echo $person->work();
echo '<hr>';
<?php
namespace base\inc1;
class Car
{
public function drive()
{
return '开汽车';
}
}
<?php
namespace base\inc1;
class Plane{
public function drive()
{
return '坐***';
}
}
<?php
namespace base\inc1;
class Train{
public function drive()
{
return '坐火车';
}
}
<?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>';
<?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();
break;
case 'train':
self::$instance = new Train();
break;
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>';
<?php
namespace base\inc1;
// 交通工具的接口
interface iVehicle
{
public function drive();
}
<?php
// ***类: 使用最传统的方式
namespace base;
// 设置引用的外部类名的别名
use base\inc1\Car;
use base\inc1\Train;
use base\inc1\Plane;
use base\inc1\Ship;
use base\inc1\iVehicle;
require __DIR__ . '/autoload.php';
class Travel3
{
// 交通工具
private $vehicle;
// 构造方法
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>';
<?php
//容器类
namespace _1205;
//引用闭包
use Closure;
class Container
{
// 类实例
protected $instance=[];
//将实例化过程绑定到容中
public function bind($alias, Closure $process)
{
$this->instance[$alias]=$process;
}
//取出保存在容器中的实例化过程
public function maker($alias)
{
return $this->instance[$alias];
}
}
<?php
namespace _1205;
class Maker
{
public function get()
{
return '华为';
}
}
<?php
namespace _1205;
class Product {
public function get(Maker $maker)
{
return '该手机是由:'.$maker->get().'生产的';
}
}
<?php
require 'Product.php';
require 'Maker.php';
class Client1
{
// 直接输出
public function show(){
$product=new \_1205\Product();
$make=new \_1205\Maker();
return $product->get($make);
}
}
// 调用
echo (new Client1())->show();
$sh=new Client1();
echo $sh->show();
<?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->maker('product');
$maker = $container->maker('maker');
echo (new Client2())->show($product, $maker);
我个人对这些依赖注入、工厂类、接口、容器啥的理解就是都是围绕这个类来的,然后在这些类就像函数哪样来调用,各自完成应用的功能,然后再把这些功能进行衔接,这些单个理解起来还是很容易的就是要完整的组合起来理解 在这些中调来调去的 还没看完就已经绕晕了。