单例模式 实例
<?php /医院 * 单例模式:一个类仅允许创建一个实例 * 例如: * 1.一个站点仅连接一个数据库连接对象 * 2.一个站点仅允许存在一个配置类的实例对象 * */ class Config { /医院 * 必须先声明一个静态私有属性:用来保存当前类的实例 * 1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享 * 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法 * 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化 */ private static $instance = null; //保存用户的自定义配置 private $setting = []; //构造器私有化,禁止从类外部实例化 private function __construct() {} //克隆方法私有化,禁止从类外部克隆对象 private function __clone() {} //因为用静态属性返回类实例,而只能在静态方法使用静态属性 //所以必须创建一个静态方法来生成当前类的唯一实例 public static function getInstance() { //检测当前类属性$instance是否已经保存了当前类的实例 if(self::$instance == null) { //如果没有,则创建当前类的实例 self::$instance = new self(); } //如果有,则直接返回当前实例,防止重复实例化。 return self::$instance; } //设置配置项 public function set($index,$value) { $this->setting[$index] = $value; } //读取配置项 public function get($index) { return $this->setting[$index]; } } //实例化 Config 构造器被私有化,所以只能被实例化一次, $obj1 = Config::getInstance(); $obj2 = Config::getInstance(); var_dump($obj1,$obj2); //输出2个变量仅被执行一次 echo '<hr>'; $obj1->set('host','127.0.0.1'); echo $obj1->get('host');
单例模式效果图:
工厂模式 实例
<?php /* * 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 */ //声明形状类 class Shape { public static function create($type,array $size=[]) { //检测形状 switch ($type) { //长方形 case 'rectangle': return new Rectangle($size[0], $size[1]); break; //三角形 case 'triangle': return new Triangle($size[0], $size[1]); break; } } } // 长方形 class Rectangle { private $width; private $height; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } public function area() { return $this->width * $this->height; } } //三角形 class Triangle { private $width; private $height; public function __construct($width, $height) { $this->widht = $width; $this->height = $height; } public function area() { return ($this->widht * $this->height)/2; } } //使用静态方法来实例化形状类,而不是用传统的new 关键字 //并根据形状类型参数的不同,来实例化不同的类,生成不同的对象 $rectangle = Shape::create('rectangle',[10,30]); echo '长方形的面积是:'.$rectangle->area(); echo '<hr>'; $triangle = Shape::create('triangle',[40,50]); echo '三角形的面积是:'.$triangle->area();
运行效果图:
注册树 实例
<?php /* * 注册树:其实就是创建一个对象集,也叫对象池,是用数组来进行存储的 */ //先声明三个类,一会丢进对象树上中 class Demo1 {} class Demo2 {} class Demo3 {} //声明对象注册树类 class Register { //静态属性中保存着所有已经挂载到树上的对象 public static $objs = []; //将对象挂载到树上 public static function set($index, $obj) { self::$objs[$index] = $obj; } //取出对象使用 public static function get($index) { return self::$objs[$index]; } //已经无效的对象,及时销毁,节省资源 public static function del($index) { unset(self::$objs[$index]); } } //将三个类实例化后,并挂载到对象树上 Register::set('demo1',new Demo1); Register::set('demo2',new Demo2); Register::set('demo3',new Demo3); //检测是否上树? var_dump(Register::$objs); echo '<hr>'; echo '<pre>'.print_r(Register::$objs,true).'</pre>'; echo '<hr>'; //用注册类的get方法查看 echo var_dump(Register::get('demo2')); //删除对象池中的某个实例对象 Register::del('demo2'); //再次查看demo2对象,已经不能被查看了,因为被销毁了 var_dump(Register::get('demo2'));
运行效果图:
MVC设计思想:
model.php文件:
model:模型类—实例
<?php /医院 * 1.写一个Model:模型类 * PDO这个类是全局的,不在这个命名空间下,所以需要在前面加反斜线\ */ //命名空间 MVC文件夹下的model文件夹 namespace MVC\model { //Model:模型类 class Model { //声明属性 public $pdo = null; public $result = []; //构造方法 public function __construct($dbname, $user, $pass) { //连接数据库 $this->pdo = new \PDO('mysql:host=127.0.0.1;dbname='.$dbname, $user, $pass); } //执行查询并获取结果集 public function select($table, $num) //从外部传入参数, { //创建预处理对象 $stmt = $this->pdo->prepare("SELECT * FROM {$table} LIMIT :num;"); //执行查询操作并获取结果集 $stmt -> bindValue(':num', $num, \PDO::PARAM_INT); $stmt -> execute(); //解析结果集 $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC); $result = $this->result; // print_r($result); } } } ?>
运行实例 »
view.php文件
view:视图类 实例
<?php /医院 * 2.再写一个view视图类 * view视图类 */ namespace MVC\view; class View { public $data = []; public function __construct($data) { $this->data = $data; } public function getData() { return $this->data; } public function display($data) { $table = ' <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> table, tr, td, th{border: 1px solid #666;} table{width:70%; border-collapse: collapse; text-align: center;margin: 50px auto;} table caption{margin-bottom: 20px; font-size: 24px; font-weight: bold;} th{ background-color: lightblue;} tr th,td{ padding: 5px;} </style> </head> <body> <table> <caption>用户管理表</caption> <tr> <th>排序ID</th> <th>用户名</th> <th>会员等级</th> <th>QQ账号</th> <th>账号余额</th> <th>注册时间</th> <th>操作</th> </tr>'; foreach ($data as $nam) { $table .= '<tr>'; $table .= '<td>'.$nam['mana_id'].'</td>'; $table .= '<td>'.$nam['name'].'</td>'; $table .= '<td>'.$nam['class'].'</td>'; $table .= '<td>'.$nam['faqqq'].'</td>'; $table .= '<td>'.$nam['sum'].'</td>'; $table .= '<td>'.$nam['join_date'].'</td>'; $table .= '<td>'.$nam['operation'].'</td>'; $table .= '</tr>'; } $table .= '</table> </body> </html>'; echo $table; } }
运行实例 »
controller.php文件
controller:控制器 实例
<?php /医院 * 3.再写一个controller控制器 * 控制器 */ namespace mvc\controller; class Controller { public function index() { //从模型中获取数据 //model:模型类 控制器 require './model/model.php'; $model = new \MVC\model\Model('php','root','root'); //实例化 $model->select('mana',12); $result = $model->result; //根据从模型中获取的数据的要求来渲染模板,格式化展示模型中的数据 //view:视图类 控制器 require './view/view.php'; $view = new \MVC\view\View($result); //获取给模板赋的值 $data = $view->getData(); //获取模板的数据,将存储给变量$data $view->display($data); //将$data模板数据显示出来,也叫模板渲染 } }
运行实例 »
index.php入口文件
index.php 入口文件 实例
<?php /医院 * 入口文件 */ //导入控制器类 require 'controller/Controller.php'; use mvc\controller\Controller; //控制器取个别名 $controller = new Controller; //实例化控制器 $controller->index(); ?>
运行实例 »
MVC结构图:
MVC 运行效果图: