批改状态:合格
老师批语:作业写得非常棒, 这么多的手写作业 , 真不容易
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);点击 "运行实例" 按钮查看在线实例


总结
通过例子,知道了单例和工厂方法,还有服务容器的原理,可以增加扩展性。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号