
批改狀態(tài):合格
老師批語:看來你的markdown語法還沒有掌握 , 作業(yè)排版問題很多, 趕緊補一下
`<?php
namespace gzg_05;
// PDO打開全局變量 如不打開 調(diào)用時需要 加 \PDO
use PDO;
// 單例模式
// 空類
class Temp{
//…
}
//實例化 兩個類
$obj1 = new Temp();
$obj2 = new Temp();
var_dump($obj1,$obj2);
echo ‘<br>‘;
var_dump($obj1 === $obj2);
echo ‘<hr>‘;
// 單例模式原理
class Demo1
{
// 目前 只能在類中的內(nèi)部將類實例化
// 當(dāng)前類的實例 用于實例判斷
public static $instance = null;
//構(gòu)造方法私有化
private function __construct()
{
}
// 實例化當(dāng)前類的方法
public static function getInstance()
{
// 實例化當(dāng)前類,并返回類實例/對象
// 判斷當(dāng)前類是否已經(jīng)被實例化過了,如果沒有的話就實例化,如果已實例化,就返回它
// self = static 在這里這兩個都能用 在場景中用 static 不再用self
if(is_null(self::$instance))
{
// new 一個內(nèi)部類
self::$instance =new self();
// $demo =new demo();
}
return self::$instance;
}
// 禁用克隆魔術(shù)方法
private function __clone()
{
// TODO: Implement __clone() method.
}
}
// 類實例化 靜態(tài)實例化 Demo:: 實現(xiàn) 公共的 new Demo 實現(xiàn)
$obj3 = Demo1::getInstance();
$obj4 = Demo1::getInstance();
var_dump($obj3,$obj4);
echo ‘<br>‘;
var_dump($obj3 === $obj4);
echo ‘<hr>‘;
// 單例模型應(yīng)用場景 self 全部變更為static
class Db
{
// 目前 只能在類中的內(nèi)部將類實例化
// 當(dāng)前類的實例
public static $pdo = null;
// 構(gòu)造方法私有化
private function __construct(...$conn)
{
$dsn = $conn[0];
$username =$conn[1];
$password =$conn[2];
static::$pdo = new PDO($dsn,$username,$password);
}
// 實例化當(dāng)前類的方法 傳參使用
public static function getPdo(...$conn)
{
// 實例化當(dāng)前類,并返回類實例/對象
// 判斷當(dāng)前類是否已經(jīng)被實例化過了,如果沒有的話就實例化,如果已實例化,就返回它
if (is_null(static::$pdo)){
// 構(gòu)造函數(shù)不需要返回
new static(...$conn);
}
return static::$pdo;
}
// 禁用克隆魔術(shù)方法
private function __clone()
{
// ...
}
}
$conn = [‘mysql:host=localhost;dbname=gzg’,’root’,’root’];
$pdo = Db::getPdo(…$conn);
print_r($pdo->query(‘SELECT * FROM users
‘)->fetchAll());
`
`<?php
namespace gzg_05;
// 工廠模式: 用于批量創(chuàng)建類的實例/對象
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 ‘對象創(chuàng)建成功, 參數(shù)是: ‘ . $arg1;
}
}
class Test2
{
public function __construct($arg1, $arg2)
{
echo ‘對象創(chuàng)建成功, 參數(shù)是: ‘ . implode(‘, ‘, [$arg1, $arg2]);
}
}
class Test3
{
public function __construct($arg1, $arg2, $arg3)
{
echo ‘對象創(chuàng)建成功, 參數(shù)是: ‘ . implode(‘, ‘, [$arg1, $arg2, $arg3]);
}
}
// 工廠類, 專用于創(chuàng)建類實例
class Factory
{
public static function create($className, …$arg)
{
return new $className(…$arg);
}
}
//echo Test1::class; // _1205\Test1: 完整的類名, 帶有命名空間的
// 用工廠類來創(chuàng)建類實例/對象
Factory::create(Test1::class,abc);
echo ‘<br>‘;
$test1 = Factory::create(Test1::class,abc);
var_dump($test1);
echo ‘<br>‘;
Factory::create(Test2::class,123,200);
echo ‘<br>‘;
Factory::create(Test3::class,aabb,123,asf);`
`<?php
namespace gzg_05;
// 依賴注入: 解決對象調(diào)用之間耦合
// 工作類
class Person
{
// 要依賴的外部對象
private $car=null;
// 在構(gòu)造方法中將依賴的外部對象全部實例化
// 注入點放到構(gòu)造方法中
public function __construct()
{
$this->car =new Car();
}
// 外部對象執(zhí)行一個動作
public function work()
{
return $this->car->drive();
}
}
// 依賴的外部類
class Car
{
public function drive()
{
return ‘111111111’;
}
}
// 實例化類
$person = new Person();
echo $person->work();
echo ‘<hr>‘;
/*/
//car = new Car() 在類外調(diào)用
class Person1
{
// 要依賴的外部對象
private $car = null;
// 在構(gòu)造方法中將依賴的外部對象全部實例化
// 注入點放到構(gòu)造方法中
public function __construct(Car $car)
{ //類外調(diào)用后傳參
$this->car = $car;
}
// 外部對象執(zhí)行一個動作
public function work()
{
return $this->car->drive();
}
}
// 依賴的外部類
class Car1
{
public function drive()
{
return ‘開車去上班’;
}
}
// 實例化類
//類外實例化
$car = new Car();
//給構(gòu)造函數(shù)傳參
$person = new Person1($car);
echo $person->work();
echo ‘<hr>‘;
`
`<?php
namespace gzg_05;
//制造商
class Maker
{
public function get ()
{
return’華為’;
}
}
<?php
namespace gzg_05;
// 商品類
class Product
{
public function get(Maker $maker)
{
return ‘該手機是由: <span style="color:green;font-weight: bolder">‘ . $maker->get() . ‘ </span>生產(chǎn)的’;
}
}
<?php
namespace gzg_05;
//use Closure;
use Closure;
class Container
{
// 類實例容器
protected $instance = [];
// 將類實例化的過程綁定到容器中
public function bind($alias, Closure $process)
{
$this->instance[$alias] = $process;
}
// 取出保存在容器中的實例化過程的閉包,并執(zhí)行它
public function make($alias)
{
return $this->instance[$alias]();
}
}
<?php
namespace gzg_05;
use http\Client;
require ‘Product.php’;
require ‘Maker.php’;
// 先不用容器
class Client1
{
public function show()
{
$product = new Product();
$make = new Maker();
return $product->get($make);
}
}
$obj = new Client1();
echo $obj->show();
echo ‘<br>‘;
echo ((new Client1())->show());
<?php
namespace gzg_05;
require ‘Product.php’;
require ‘Maker.php’;
require ‘Container.php’;
class Client2
{
// 輸出商品與制造商
public function show( Product $product,Maker $maker)
{
// 制造商注入到產(chǎn)品類中
return $product->get($maker);
}
}
// 客戶端調(diào)用
// 將類實例綁定到容器中并實例化且返回
$container= new Container();
//$container->bind(‘product’,function (){return new Product();});
//$container->bind(‘Maker’,function (){return new Maker();});
$container->bind(‘product’, function () {return new Product();});
$container->bind(‘maker’, function () {return new Maker();});
// 創(chuàng)建類實例并返回
$product = $container->make(‘product’);
$maker = $container->make(‘maker’);
echo (new Client2())->show($product,$maker);
`
<?php
spl_autoload_register(function ($className){
$path = str_replace('\\', '/', $className);
require dirname(__DIR__) . DIRECTORY_SEPARATOR . $path . '.php';
});
`<?php
//旅游類 傳統(tǒng)方式
namespace base;
//設(shè)置引用的外部類名的別名 把類名全部改為小寫 不改別名的話 調(diào)用時為 Car 類的實際名稱
use base\inc\Car as car;
use base\inc\Train as train;
use base\inc\Plane as plane;
//require DIR . ‘/inc/Car.php’;
//$path = str_replace(‘\‘, ‘/‘, \inc\Car::class);
//echo $path, ‘<br>‘;
require DIR . ‘/autoload.php’;
class Travel10
{
// 交通工具
private $vehicle;
//構(gòu)造方法
public function __construct($vehicle)
{
// print_r($vehicle);
// exit;
//strtolower() 把參數(shù)全部改為小寫
// 根據(jù)參數(shù)進行不同的選擇,調(diào)用不同的類
switch (strtolower($vehicle)){
case 'car':
$this->vehicle = new Car();
break;
case 'train':
$this->vehicle = new train();
break;
case 'plane':
$this->vehicle = new plane();
}
}
// 調(diào)用外部一個依賴對象
public function travelModel()
{
return $this->vehicle->drive() . ' : 去旅行';
}
}
// 客戶端調(diào)用
// $car = new Travel10(‘car’);
// echo $car->travelModel();
// echo ‘<br>‘;
echo (new Travel10(‘car’))->travelModel(), ‘<br>‘;
//echo ‘111’;
//$car = new Car();
//echo $car->drive();
echo (new Travel10(‘train’))->travelModel(), ‘<br>‘;
echo (new Travel10(‘plane’))->travelModel(), ‘<br>‘;
<?php
namespace base;
use base\inc\Train as train;
use base\inc\Car as car;
use base\inc\Plane as plane;
require DIR . ‘/autoload.php’;
//$path = str_replace(‘\‘, ‘/‘, \inc\Car::class);
//echo $path, ‘<br>‘;
// 工廠類, 專用于創(chuàng)建類實例
class Factory1
{
protected static $instance =null;
public static function getInstance($vehicle)
{
switch (strtolower($vehicle))
{
case ‘car’:
static::$instance = new car();
break;
case ‘train’:
static::$instance = new train();
break;
case ‘plane’:
static::$instance = new plane();
}
// 返回當(dāng)前具體的交通工具
return static::$instance;
}
}
class Travel5
{
// 交通工具
private $vehicle;
//構(gòu)造方法
public function __construct($vehicle)
{
echo $vehicle;
$this->vehicle = Factory1::getInstance($vehicle);
}
public function travelModel()
{
return $this->vehicle->drive() .'1111111';
}
}
// 客戶端調(diào)用
$car = new Travel5(‘car’);
echo $car->travelModel();
echo ‘<br>‘;
echo (new Travel5(‘train’))->travelModel(),’<br>‘;
echo (new Travel5(‘plane’))->travelModel(),’<br>‘;
<?php
namespace base;
use base\inc1\Car ;
use base\inc1\iVehicle;
use base\inc1\Train;
use base\inc1\Plane;
use base\inc1\Ship;
//
require DIR . ‘/autoload.php’;
//$path = str_replace(‘\‘, ‘/‘, Car1::class);
//echo $path, ‘<br>‘;
//$path = str_replace(‘\‘, ‘/‘, \inc1\iVehicle1::class);
//echo $path, ‘<br>‘;
//exit;
class Travel8
{
// 交通工具
private $vehicle;
// 構(gòu)造方法
public function __construct(iVehicle $vehicle)
{
$this->vehicle = $vehicle;
}
// 調(diào)用外部一個依賴對象
public function travelModel()
{
return $this->vehicle->drive() . ' : ======= 去旅行';
}
}
// $car1 = new Car();
//echo (new Travel8($car))->travelModel(), ‘<br>‘;
//// $car1 = new Trave8($car) ;
//
$car = new Car();
echo (new Travel8($car))->travelModel(), ‘<br>‘;
echo (new Travel8(new Plane()))->travelModel(), ‘<br>‘;
echo (new Travel8(new Ship()))->travelModel(), ‘<br>‘;
$ship1 = new Ship();
$ship2 = new Travel8( $ship1);
echo $ship2->travelModel();
echo ‘<br>‘;
$ship = new Ship();
$ship1 = new Travel8( $ship);
echo $ship1->travelModel();
echo ‘<br>‘;
$ship1 = new Travel8( new $ship);
echo $ship1->travelModel();
echo ‘<br>‘;`
接口 把面向?qū)ο蟾臑槊嫦蚪涌凇H坑山涌谡{(diào)用
容器 了解了容器的原理,容器就是管理 對象的。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號