
批改狀態(tài):合格
老師批語:字太難認
<?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
{
// 構(gòu)造方法私有化
private function __construct()
{
}
// 目前 只能在類中的內(nèi)部將類實例化
// 當前類的實例
public static $instance = null;
// 實例化當前類的方法
public static function getInstance()
{
// 實例化當前類,并返回類實例/對象
// 判斷當前類是否已經(jīng)被實例化過了,如果沒有的話就實例化,如果已實例化,就返回它
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
// 禁用克隆魔術(shù)方法
private function __clone()
{
// ...
}
}
//new Demo1();
$obj1 = Demo1::getInstance();
$obj2 = Demo1::getInstance();
var_dump($obj1 === $obj2);
echo '<br>';
var_dump($obj1, $obj2);
echo '<hr>';
// 單例模型應用場景數(shù)據(jù)庫鏈接
class Db
{
// 構(gòu)造方法私有化
private function __construct(...$connectParams)
{
$dsn = $connectParams[0];
$username = $connectParams[1];
$password = $connectParams[2];
self::$pdo = new \PDO($dsn, $username, $password);
}
// 目前 只能在類中的內(nèi)部將類實例化
// 當前類的實例
public static $pdo = null;
// 實例化當前類的方法
public static function getInstance(...$connectParams)
{
// 實例化當前類,并返回類實例/對象
// 判斷當前類是否已經(jīng)被實例化過了,如果沒有的話就實例化,如果已實例化,就返回它
if (is_null(self::$pdo)) {
// 構(gòu)造函數(shù)不需要返回
new self(...$connectParams);
}
return self::$pdo;
}
// 禁用克隆魔術(shù)方法
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 '對象創(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, ...$argments)
{
return new $className(...$argments);
}
}
// 用工廠類來創(chuàng)建類實例/對象
Factory::create(Test1::class, 500);
echo '<br>';
Factory::create(Test2::class,'第一個參數(shù)','第二個參數(shù)');
echo '<br>';
Factory::create(Test3::class, '第一個參數(shù)','第二個參數(shù)','第三個參數(shù)');
<?php
//依賴注入
namespace dem;
//創(chuàng)建類
class Person
{
// 要依賴的外部對象
private $car;
//在構(gòu)造方法中將依賴的外部對象 全部實例化
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 ;
// 在構(gòu)造方法中將依賴的外部對象全部實例化
// 注入點放到構(gòu)造方法中
public function __construct(Car $car)
{
$this->car = $car;
}
// 外部對象執(zhí)行一個動作
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;
//引用類
use base\inc1\Car;
use base\inc1\Train;
use base\inc1\Plane;
require __DIR__ .'/autoload.php';
class Travel1
{
// 交通工具
private $vehicle;
// 構(gòu)造方法
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;
}
}
//調(diào)用外部一個對象
public function travelModel()
{
return $this->vehicle->drive().'去玩耍';
}
}
//客戶端調(diào)用
echo (new Travel1('car'))->travelModel() . '<br>';
echo (new Travel1('train'))->travelModel() . '<br>';
echo (new Travel1('plane'))->travelModel() . '<br>';
<?php
namespace base\inc1;
// 交通工具的接口
interface iVehicle
{
public function drive();
}
<?php
// ***類: 使用最傳統(tǒng)的方式
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;
// 構(gòu)造方法
public function __construct(iVehicle $vehicle)
{
$this->vehicle = $vehicle;
}
// 調(diào)用外部一個依賴對象
public function travelModel()
{
return $this->vehicle->drive() . ' : ======= 去***';
}
}
// 客戶端調(diào)用
$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().'生產(chǎn)的';
}
}
<?php
require 'Product.php';
require 'Maker.php';
class Client1
{
// 直接輸出
public function show(){
$product=new \_1205\Product();
$make=new \_1205\Maker();
return $product->get($make);
}
}
// 調(diào)用
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)
{
// 制造商注入到產(chǎn)品類中
return $product->get($maker);
}
}
// 綁定到容器中并實例化且返回
$container = new Container();
// 將實例化代碼綁定到容器中
$container->bind('product', function () {return new Product();});
$container->bind('maker', function () {return new Maker();});
// 創(chuàng)建類實例并返回
$product = $container->maker('product');
$maker = $container->maker('maker');
echo (new Client2())->show($product, $maker);
微信掃碼
關(guān)注PHP中文網(wǎng)服務號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號