Blogger Information
Blog 42
fans 5
comment 0
visits 38197
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1206模型原理,路由原理,路由原理
张浩刚
Original
851 people have browsed it

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);
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!