
批改狀態(tài):合格
老師批語(yǔ):先寫出最基本的功能 , 然后慢慢填充, 就像是小時(shí)候?qū)懽魑? 先寫一個(gè)大綱
<?php
namespace _1204;
use PDO;
// static: 聲明類中的靜態(tài)成員
// 1. 創(chuàng)建類
class Db1
{
// 2. 添加類成員
// 添加的靜態(tài)成員: 屬性, 方法
// 靜態(tài)屬性
protected static $pdo;
protected static $dsn = 'mysql:host=127.0.0.1;dbname=mydb';
protected static $username = 'peter';
protected static $password = '123456';
// 靜態(tài)方法
public static function connect()
{
// 在類中訪問當(dāng)前類的靜態(tài)成員: self::
self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
}
// 測(cè)試方法
public static function select()
{
// 連接數(shù)據(jù)庫(kù)
self::connect();
return self::$pdo->query('select * from `users`', PDO::FETCH_ASSOC);
}
}
// 3. 訪問類成員
// 在類的外部,訪問類中的靜態(tài)成員, 直接用類名
$result = Db1::select();
foreach ($result as $row) {
echo '<pre>' . print_r($row, true) . '</pre>';
}
<?php
namespace _1204;
// static: 后期靜態(tài)綁定
// 使用場(chǎng)景 : 靜態(tài)繼承的上下文環(huán)境中
// 類成員訪問綁定時(shí)間: 在聲明的時(shí)候綁定, 在調(diào)用的時(shí)候綁定
// 后期綁定就是在類成員被調(diào)用的時(shí)候再動(dòng)態(tài)的綁定, 也叫:延遲綁定
use PDO;
// static: 聲明類中的靜態(tài)成員
// 1. 創(chuàng)建類
class Db2
{
// 2. 添加類成員
// 添加的靜態(tài)成員: 屬性, 方法
// 靜態(tài)屬性
protected static $pdo;
protected static $dsn = 'mysql:host=127.0.0.1;dbname=mydb';
protected static $username = 'peter';
protected static $password = '123456';
// 靜態(tài)方法
public static function connect()
{
// 在類中訪問當(dāng)前類的靜態(tài)成員: self::
static::$pdo = new PDO(static::$dsn, static::$username, static::$password);
}
// 測(cè)試方法
public static function select()
{
// 連接數(shù)據(jù)庫(kù)
static::connect();
return self::$pdo->query('select * from `users`', PDO::FETCH_ASSOC);
}
}
class Sub extends Db2
{
protected static $username = 'peter';
protected static $password = '123456';
public static function connect()
{
self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
}
}
// 3. 訪問類成員
// 在類的外部,訪問類中的靜態(tài)成員, 直接用類名
$result = Sub::select();
//本意是想用子類中的connect();
foreach ($result as $row) {
echo '<pre>' . print_r($row, true) . '</pre>';
}
<?php
namespace mvc;
// 模型類:用于數(shù)據(jù)表的操作
class Model
{
public function getData()
{
// 用二維數(shù)組來(lái)模擬從表中獲取到的商品數(shù)據(jù)
return [
['id'=>1, 'name'=>'蘋果電腦', 'model'=>'MacBook Pro', 'price'=>25800],
['id'=>2, 'name'=>'華為手機(jī)','model'=>'P30 Pro','price'=>4988],
['id'=>3, 'name'=>'小愛同學(xué)','model'=>'AI音箱','price'=>299],
];
}
}
<?php
namespace mvc;
// 視圖類:渲染數(shù)據(jù)
class View
{
public function fetch($data)
{
$table = '<table>';
$table .= '<caption>商品信息表</caption>';
$table .= '<tr><th>ID</th><th>品名</th><th>型號(hào)</th><th>價(jià)格</th></tr>';
foreach ($data as $product) {
$table .= '<tr>';
$table .= '<td>' . $product['id'] . '</td>';
$table .= '<td>' . $product['name'] . '</td>';
$table .= '<td>' . $product['model'] . '</td>';
$table .= '<td>' . $product['price'] . '</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 1px solid; width: 500px;height: 150px}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:lightblue;}
td,th {border: 1px solid}
td:first-of-type {text-align: center}
</style>';
5
<?php
// 控制器: 將商品信息表展示出來(lái)
namespace mvc;
// 1. 加載模型
require 'Model.php';
// 2. 加載視圖
require 'View.php';
// 3. 創(chuàng)建控制器
class Controller1
{
public function index()
{
// 3.1 獲取數(shù)據(jù)
$model = new Model();
$data = $model->getData();
// 3.2 渲染模板
$view = new View();
return $view->fetch($data);
}
}
// 4. 客戶端調(diào)用/訪問類成員
$controller = new Controller1();
echo $controller->index();
<?php
// 控制器: 將商品信息表展示出來(lái)
// 將類中對(duì)其它類的實(shí)例化, 模型/視圖分離出來(lái), 降低耦合度
// 依賴注入
namespace mvc;
// 1. 加載模型
use BaconQrCode\Common\Mode;
require 'Model.php';
// 2. 加載視圖
require 'View.php';
// 3. 創(chuàng)建控制器
class Controller2
{
public function index(Model $model, View $view)
{
// 3.1 獲取數(shù)據(jù)
$data = $model->getData();
// 3.2 渲染模板
return $view->fetch($data);
}
}
// 4. 客戶端調(diào)用/訪問類成員
// 將模型與視圖的實(shí)例化代碼從控制器分離出來(lái), 放到了客戶端
$model = new Model();
$view = new View();
// 將模型對(duì)象與視圖對(duì)象,以參數(shù)的方式再次注入到控制器的方法
$controller = new Controller2();
echo $controller->index($model, $view);
<?php
// 控制器: 將商品信息表展示出來(lái)
// 依賴注入: 將注入點(diǎn)改到了控制器的構(gòu)造方法中
namespace mvc;
// 1. 加載模型
use BaconQrCode\Common\Mode;
require 'Model.php';
// 2. 加載視圖
require 'View.php';
// 3. 創(chuàng)建控制器
class Controller3
{
protected $model;
protected $view;
// 構(gòu)造方法, 注入點(diǎn)改到了構(gòu)造方法中, 實(shí)現(xiàn)了模型與視圖對(duì)象的共享
public function __construct(Model $model, View $view)
{
$this->model = $model;
$this->view = $view;
}
public function index()
{
// 3.1 獲取數(shù)據(jù)
$data = $this->model->getData();
// 3.2 渲染模板
return $this->view->fetch($data);
}
}
// 4. 客戶端調(diào)用/訪問類成員
// 將模型與視圖的實(shí)例化代碼從控制器分離出來(lái), 放到了客戶端
$model = new Model();
$view = new View();
// 將模型對(duì)象與視圖對(duì)象,以參數(shù)的方式再次注入到控制器的方法
$controller = new Controller3($model, $view);
echo $controller->index();
<?php
// 控制器: 將商品信息表展示出來(lái)
// 依賴注入: 將注入點(diǎn)改到了控制器的構(gòu)造方法中
namespace mvc;
// 1. 加載模型
use BaconQrCode\Common\Mode;
require 'Model.php';
// 2. 加載視圖
require 'View.php';
/**************************************************/
//添加服務(wù)容器層
class Container
{
// 容器屬性, 就是一個(gè)數(shù)組,里面全是創(chuàng)建對(duì)象的方法
protected $instance = [];
// 1. 放進(jìn)去: 將類的實(shí)例化過程綁定到容器中
// $alias: 類實(shí)例的別名,
public function bind($alias, \Closure $process)
{
// 將類實(shí)例化的方法綁定/ 存儲(chǔ)到服務(wù)容器中
$this->instance[$alias] = $process;
}
// 2. 取出來(lái): 執(zhí)行容器中的實(shí)例方法
public function make($alias, $params=[])
{
return call_user_func_array($this->instance[$alias], []);
}
}
// 實(shí)例化容器
$container = new Container();
// 用到模型對(duì)象, 視圖對(duì)象,將它們綁定到容器中
$container->bind('model', function () {return new Model();});
$container->bind('view', function () {return new View();});
/**************************************************/
// 3. 創(chuàng)建控制器
class Controller4
{
public function index(Container $container)
{
// 3.1 獲取數(shù)據(jù)
$data = $container->make('model')->getData();
// 3.2 渲染模板
return $container->make('view')->fetch($data);
}
}
// 4. 客戶端調(diào)用/訪問類成員
// 將模型對(duì)象與視圖對(duì)象,以參數(shù)的方式再次注入到控制器的方法
$controller = new Controller4();
echo $controller->index($container);
<?php
// 控制器: 將商品信息表展示出來(lái)
// Facade技術(shù): 規(guī)范/統(tǒng)一了對(duì)外部對(duì)象的調(diào)用方式, 全部改為了靜態(tài)調(diào)用, 不管之前的方法是什么類型
// laravel, thinkphp
namespace mvc;
// 1. 加載模型
use BaconQrCode\Common\Mode;
require 'Model.php';
// 2. 加載視圖
require 'View.php';
/**************************************************/
//添加服務(wù)容器層
class Container1
{
// 容器屬性, 就是一個(gè)數(shù)組,里面全是創(chuàng)建對(duì)象的方法
protected $instance = [];
// 1. 放進(jìn)去: 將類的實(shí)例化過程綁定到容器中
// $alias: 類實(shí)例的別名,
public function bind($alias, \Closure $process)
{
// 將類實(shí)例化的方法綁定/ 存儲(chǔ)到服務(wù)容器中
$this->instance[$alias] = $process;
}
// 2. 取出來(lái): 執(zhí)行容器中的實(shí)例方法
public function make($alias, $params=[])
{
return call_user_func_array($this->instance[$alias], []);
}
}
// 實(shí)例化容器
$container = new Container1();
// 用到模型對(duì)象, 視圖對(duì)象,將它們綁定到容器中
$container->bind('model', function () {return new Model();});
$container->bind('view', function () {return new View();});
/**************************************************/
// 添加Facade門面類
class Facade
{
protected static $container = null;
protected static $data = [];
// 用服務(wù)容器給它初始化
public static function initialize(Container1 $container)
{
static::$container = $container;
}
// 用靜態(tài)代理方式將模型中的getData()靜態(tài)化
public static function getData()
{
static::$data = static::$container->make('model')->getData();
}
// 用靜態(tài)代理方式將視圖中的fetch()靜態(tài)化
public static function fetch()
{
return static::$container->make('view')->fetch(static::$data);
}
}
// 聲明一學(xué)生類
class Student extends Facade
{
//
}
/**************************************************/
// 3. 創(chuàng)建控制器
class Controller5
{
public function __construct(Container1 $container)
{
// 調(diào)用Faceda里面的初始化方法
Student::initialize($container);
}
public function index()
{
// 3.1 獲取數(shù)據(jù)
Student::getData();
// 3.2 渲染模板
return Student::fetch();
}
}
// 4. 客戶端調(diào)用/訪問類成員
// 將模型對(duì)象與視圖對(duì)象,以參數(shù)的方式再次注入到控制器的方法
$controller = new Controller5($container);
echo $controller->index();
學(xué)習(xí)了如何使用static:聲明類中的靜態(tài)成員
初步了解了MVC結(jié)構(gòu)與框架基礎(chǔ)
M:model,模型,類用于數(shù)據(jù)表的操作
V:view,視圖類:渲染數(shù)據(jù)
C:Controller,控制器:將商品信息表展示出來(lái)
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)