Correction status:qualified
Teacher's comments:之前说过, 尽可能不要大段的抄课堂源码, 一个功能, 有不止一种实现方式, 不一定必须要和老师一样, 学了快一个月的php了, 应该有这个能力了, 前面的总结写得不错
常用的设计模式
1.单例模式,一个类仅允许被实例化一次;
主要应用与数据库连接,http请求
操作三步骤:
1.构造方法私有化
2.在当前类实例化并返回当前实例给调用者
3.禁用外部的clone方式创建新对象,将__clone 私有化
2.工厂模式
用于批量创建对象,适合一个类多个实例,工厂模式创建对象,一处修改,全局生效
操作步骤:
1.创建多个类,在创建一个工厂类
2.工厂类中创建一个函数,传入需要实例化类的名称和参数,用剩余参数
3.再return new $className(...$arguments);
4.调用则用Factory::create($className,$value);
MVC原理
M->Model模型,负责数据访问;
C->Controller 控制器,负责解析HTTP请求并转发和与模型、试图进行交互
V->View 负责生成HTML页面
效果:
<?php //这是Model1.php文件 class Model1 { public $pdo = null; public function __construct() { $this->pdo = new \PDO('mysql:host=127.0.0.1;dbname=php','root','root'); } public function getData() { $sql = 'SELECT `staff_id`, `name`,`age`,`position` FROM `staff`'; $stmt = $this->pdo-> prepare($sql); $stmt->execute(); return $staffs = $stmt->fetchAll(PDO::FETCH_ASSOC); } }
点击 "运行实例" 按钮查看在线实例
<?php //这是View1文件 class View1 { public function fetch($data) { $table = '<table border="1" width="800px">'; $table .= '<caption>明星数据表</caption>'; $table .= '<tr bgcolor="#f08080"><th>ID</th><th>姓名</th><th>年龄</th><th>职务</th></tr>'; foreach ($data as $staffs) { $table .= '<tr>'; $table .= '<th>'.$staffs['staff_id'].'</th>'; $table .= '<th>'.$staffs['name'].'</th>'; $table .= '<th>'.$staffs['age'].'</th>'; $table .= '<th>'.$staffs['position'].'</th>'; $table .= '</tr>'; } $table .= '</table>'; return $table; } }
点击 "运行实例" 按钮查看在线实例
<?php //这是demo文件 require 'Model1.php'; require 'View1.php'; class Controller { protected $view1; protected $model; public function __construct(Model1 $model1,View1 $view1) { $this->model1=$model1; $this->view1=$view1; } public function index() { $data = $this->model1->getData(); return $this->view1->fetch($data); } } $model1 = new Model1(); $view1 = new View1(); $controller = new Controller($model1,$view1); echo $controller->index();
点击 "运行实例" 按钮查看在线实例
<?php namespace _0806; class Demo1 { //构造函数 private function __construct() { echo '我被调用了'; } private static $instance = null; public static function getInstance() { if (is_null(self::$instance)){ self::$instance = new self; } return self::$instance; } private function __clone() { echo '外部的clone方法被调用了'; } } $obj1 = Demo1::getInstance(); //var_dump($obj1); echo '<hr>'; //引用赋值 $obj2 = $obj1; //var_dump($obj2); //$obj2 = clone $obj1;
点击 "运行实例" 按钮查看在线实例
<?php namespace _0806; class A { public function __construct($arg1) { echo '对象创建成功,参数是'.$arg1; } } class B { public function __construct($arg1,$arg2) { echo '对象创建成功,参数是'***plode(',',[$arg1,$arg2]); } } class C { public function __construct($arg1,$arg2,$arg3) { echo '对象创建成功,参数是'***plode(',',[$arg1,$arg2,$arg3]); } } class D { public function __construct() { echo '对象创建成功,无参数'; } } class Factory { public static function create($className,...$arguments) { return new $className(...$arguments); } } Factory::create(A::class,100);echo '<br>'; Factory::create(B::class,100,200);echo '<br>'; Factory::create(C::class,100,200,300);echo '<br>'; Factory::create(D::class);echo '<br>';
点击 "运行实例" 按钮查看在线实例