博客列表 >1206模型原理,路由原理,路由原理

1206模型原理,路由原理,路由原理

张浩刚
张浩刚原创
2019年12月16日 11:49:55858浏览

1、模型的原理

框架中的模型, 通常会与一张数据表对应, 而模型对象,则与数据表中的一条记录对应
$stmt->setFetchMode(PDO::FETCH_CLASS, $className);
  1. <?php
  2. namespace _1206;
  3. use PDO;
  4. class user{
  5. private $id;
  6. private $name;
  7. private $age;
  8. private $sex;
  9. private $position;
  10. private $mobile;
  11. private $hiredate;
  12. // 属性重载
  13. public function __get($name)
  14. {
  15. return $this->$name;
  16. }
  17. // 构造方法: 用于初始化或设置默认值
  18. public function __construct()
  19. {
  20. // 将性别转为可识别的字符,数据库中0为女,1为男
  21. $this->sex = $this->sex ? '男' : '女';
  22. // 将时间戳转为日期字符串
  23. $this->hiredate = date('Y/m/d', $this->hiredate);
  24. }
  25. }
  26. $pdo = new PDO('mysql:host=localhost;dbname=film', 'root', 'root');
  27. $stmt = $pdo->prepare('SELECT * FROM staffs WHERE id>=:id');
  28. $stmt->execute(['id'=>1]);
  29. // 关键步骤: 指定获取方式,返回一个所请求类的新实例, 映射列到类中对应的属性名
  30. $stmt->setFetchMode(PDO::FETCH_CLASS, user::class);
  31. // 返回的每一条记录都是user类的实例对象
  32. while ($user = $stmt->fetch()) {
  33. // 属性重载的应用
  34. echo "<li>{$user->id}---{$user->name}---{$user->sex}---{$user->hiredate}</li>";
  35. }

2. 路由的原理

$_SERVER['REQUEST_URI']: 超全局变量, 用户请求的web资源地址
explode(): 使用一个字符串分割另一个字符串,返回数组
array_slice($arr, $start, $length): 获取数组片断
list($var1, $var2,...): 将索引数组成员转为独立变量
compact($str1, $str2,...): 将变量转为关联数组成员
call_user_func_array(): 以回调方式执行一个函数/方法

路由的原理 基础1

  1. <?php
  2. //示例链接:http://localhost/_1206/demo1.php/admin/index/hello
  3. $uri = $_SERVER['REQUEST_URI'];
  4. echo $uri;
  5. //explode()字符串转索引数组
  6. //如本例中explode('/',$uri), 通过“/”分割成数组;;如字符串是 $a='admin,2,age'; 转数组就是 explode(',',$a)
  7. $request = explode('/', $uri);
  8. echo '<pre>' . print_r($request, true) . '</pre>';
  9. //array_slice(数组名,开始位置,长度) 如果一直到终点,长度可不写
  10. $route = array_slice($request, 3,3);
  11. echo '<pre>' . print_r($route, true) . '</pre>';
  12. // list()语法结构, 可以从将一个索引数组中每个元素,设置一个字符串键名,并转为独立变量使用
  13. // list()并非函数, 因为它可以用到等号左边, 接受赋值操作, 而函数是绝对不允许也不可能用在等号左边的
  14. list($name,$controller,$action) = $route;
  15. echo "模块:{$name}, 控制器:{$controller}, 操作{$action}";
  16. echo '<pre>' . print_r($route, true) . '</pre>';
  17. // compact(),索引数组转换成关联数组
  18. $route = compact('name','controller','action');
  19. echo '<pre>' . print_r($route,true);

路由的原理 基础2

  1. <?php
  2. // 示例:http://localhost/_1206/demo1.php/admin/index/hello/name/peter/work/teacher
  3. $uri = $_SERVER['REQUEST_URI'];
  4. echo $uri;
  5. //explode()字符串转数组
  6. $request = explode('/', $uri);
  7. echo '<pre>' . print_r($request, true) . '</pre>';
  8. //array_slice()起始截取数组
  9. $values = array_slice($request, 6, 4);
  10. echo '<pre>' . print_r($values,true);
  11. //这里截取的结果是 name/peter/work/teacher
  12. // 键 / 值 / 键 / 值
  13. //我们的需求是 转成一个数组 $a=['name'=>'peter', 'work'=>'teacher']
  14. //for $i+=2,就是避开键值一起调用了,仅调用键
  15. for($i=0;$i<count($values);$i+=2){
  16. //第一个为键,第二个为值;判断第二个值存在的情况下执行
  17. if( isset($values[$i+1]) ){
  18. $params[$values[$i]] = $values[$i+1];
  19. }
  20. }
  21. //查询结果 结果为数组 name=peter; work=teacher
  22. echo '<pre>' . print_r($params,true) . '</pre>';

路由小案例

  1. <?php
  2. // 示例:http://localhost/_1206/demo1.php/admin/index/hello/id/1/name/admin
  3. $uri = $_SERVER['REQUEST_URI'];
  4. echo $uri;
  5. //将url转换成数组
  6. $request = explode('/', $uri);
  7. echo '<pre>'.print_r($request, true).'</pre>';
  8. //截取某个区间的数组
  9. $route = array_slice($request, 3, 3);
  10. echo '<pre>'.print_r($route, true).'</pre>';
  11. //通过list()设键 ,键可以自定义
  12. list($model, $controller, $action) = $route;
  13. echo "模块:\$model = {$model}<br>控制器:\$controller = {$controller}<br> 操作:\$action = {$action}";
  14. //通过list()设的键,与其值,再通过compact()转换成关联数组
  15. $getinfo = compact('model','controller','action');
  16. echo '<pre>'.print_r($getinfo, true).'</pre>';
  17. echo '<hr>';
  18. //截取数组,其他的如,id/1/name/admin
  19. $arr = array_slice($request,6);
  20. echo '<pre>'.print_r($arr, true).'</pre>';
  21. //对应转换 使其['id'=>1, 'name'=>'admin']
  22. for($i=0;$i<count($arr);$i+=2){ // $i+=2 就是只取键id , name,跳过值1 , admin
  23. //$param是自定义的
  24. $param[$arr[$i]] = $arr[$i+1];
  25. }
  26. echo '<pre>'.print_r($param, true).'</pre>';
  27. // 示例:http://localhost/_1206/demo1.php/admin/index/hello/id/1/name/admin
  28. // 将以上组合起来,做成类
  29. // 这个index不是自定义的,是url链接中的index
  30. class index{
  31. //hello也是url链接中的hello
  32. public function hello($id,$name){
  33. //这里的id 与 name 还有它们的值都必须一一对应示例的URL
  34. return 'index控制器的hell()操作:$id=' . $id . ' $name=' . $name;
  35. }
  36. }
  37. echo call_user_func_array([new $getinfo['controller'],$getinfo['action']],$param);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议