0907作业:
1.编程: 单例模式
实例
<?php /** * 单例模式: 一个类仅允许被实例化一次,而且自行实例化并向整个系统提供这个实例。 * 1.单例模式的要点有三个: (1)某个类只能有一个实例; (2)它必须自行创建这个实例; (3)它必须自行向整个系统提供这个实例。 * 2. 一个站点仅需要创建一个数据库连接 * 3. 一个站点通常只需要一个配置类 */ echo '<h3>编程1:单例模式: 一个类仅允许被实例化一次</h3>'; class Config1 {} // 下面我们来实例化 $obj1 = new Config1(); $obj2 = new Config1(); var_dump($obj1, $obj2); var_dump($obj1 === $obj2); echo '<hr>'; // 创建一个实用的配置类: 单例模式,这个类只能有一个实例 class Config { /** * 为什么要用静态的? 因为静态属性于类的,被所有类实例所共享; * 为什么要能实例初始化为null? 便于检测 */ // 保存类实例在此属性中,自行创建这个实例 private static $instance = null; // 其实默认值也是null,可以省 // 配置参数容器 public $setting = []; // 禁止从类的外部实例化对象 private function __construct() { } //克隆方法也私有化 private function __clone() { // TODO: Implement __clone() method. } //外部仅允许通过一个公共静态方法来创建实例 public static function getInstance() { //检测当前的类属性$instance是否已经保存了当前类的实例?,自行创建这个实例 if (!isset(self::$instance)) { //如果没有创建,实例化当前类,这里实现类只实例化一次 self::$instance = new self(); } // 如果已经存在当前类的实例,返回当前类的实例 return self::$instance; } // 配置项的设置操作 public function set() { //func_num_args():返回调用函数的传入参数个数,类型是整型,获取参数的数量。 $num = func_num_args(); if ($num > 0) { switch ($num) { case 1: // 如果只有一个参数,说明这是一个数组 //func_get_arg() 函数返回的是指定位置的参数的值 $value = func_get_arg(0); //is_array() 函数用于检测变量是否是一个数组 if (is_array($value)) { //array_merge() 函数把一个或多个数组合并为一个数组 $this->setting = array_merge($this->setting, $value); } break; case 2: // 逐个设置 $name = func_get_arg(0); // 配置项的名称 $value = func_get_arg(1); // 配置项的值 $this->setting[$name] = $value; break; default: echo '<span style="color:red">非法参数</span>'; } } else { echo '<span style="color:red">没有参数</span>'; } } // 获取参数: 当无参数的时候,默认获取全部参数 public function get($name='') { if (empty($name)) { //获取所有参数 return $this->setting; } // 获取某一个参数 return $this->setting[$name]; } } //实现类只实例化一次,可以得到$obj1, $obj2的id相同,即类只能被实例化一次。 $obj1 = Config::getInstance(); $obj2 = Config::getInstance(); var_dump($obj1, $obj2); var_dump($obj1 === $obj2);//true echo '<hr>'; //设置,单例模式自行向整个系统提供这个实例。 $obj1->set('host','127.0.0.1'); echo $obj1->get('host'); echo '<hr>'; $config = ['host'=>'localhost','user'=>'root','pass'=>'123456']; $obj1->set($config); print_r($obj1->get());
运行实例 »
点击 "运行实例" 按钮查看在线实例
2.编程: MVC的实现原理
实例
<?php //模型类 namespace mvc\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 `id`,`name`,`age`,`salary` FROM {$table} LIMIT :num"); //执行查询 $stmt->bindValue(':num', $num, \PDO::PARAM_INT); $stmt->execute(); $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC); } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
<?php /** *视图类 */ 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"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <style> table,th,td { border: 1px solid black; } table { border-collapse: collapse; /*折叠表格线*/ width: 600px; margin: 30px auto; text-align: center; padding: 5px; } table tr:first-child { background-color: lightgreen; } table caption { font-size: 1.5em; margin-bottom: 15px; } </style> <title>MVC简介</title> </head> <body> <table> <caption>员工信息表</caption> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>工资</th> </tr>'; //从$date数组容器里面取出一行数据,并进行遍历 foreach ($data as $staff) { $table .= '<tr>'; $table .= '<td>'.$staff['id'].'</td>'; $table .= '<td>'.$staff['name'].'</td>'; $table .= '<td>'.$staff['age'].'</td>'; $table .= '<td>'.$staff['salary'].'</td>'; $table .= '</tr>'; } $table .= '</table></body></html>'; echo $table; } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
<?php /** *控制器类 */ namespace mvc\controller; use mvc\model\Model; use mvc\view\View; class Controller { public function index() { require './model/Model.php'; $model = new Model('php','root','root'); $model->select('staff', 10); $result = $model->result; require './view/View.php'; $view = new View($result); $data = $view->getData(); $view->display($data); } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
<?php /** * 框架入口文件 * 首页 */ require './controller/Controller.php'; use mvc\controller\Controller; $controller = new Controller; $controller->index();
运行实例 »
点击 "运行实例" 按钮查看在线实例
3.问答:mvc的工作原理:
答:
一般都是路由(相当于浏览者发出指令,并调用控制器)
-->控制层(controller控制器按指令选取一个合适的模型和视图)
-->数据处理层(mode模型,控制器按指令取相应数据)
-->视图层(view视图层,控制器按指令选取相应的视图,并把模型里面的数据按用户想要的样子显示出来)
总结一下:
路由就是引路人先将你引到控制层,由控制层用到数据的时候调用数据处理层,用到输出展示的时候调用视图层,
控制层(controller)把视图层(view)需要的数据从数据处理层(model)里取出来数据按用户想要的样子显示出来。