博客列表 >02月17日作业:服务容器和路由原理

02月17日作业:服务容器和路由原理

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年02月19日 17:46:03785浏览

作业一:

MVC框架:Model > View > Container(对象容器) > Facade(门面) > Controller
1、Model代码:

  1. <?php
  2. namespace one;
  3. use mysqli;
  4. class Model
  5. {
  6. public function getdatas()
  7. {
  8. $mysql=new mysqli('NewYear.com','phptest','123456','php');
  9. $stmt=$mysql->stmt_init();
  10. $stmt->prepare('SELECT * FROM `staffs`');
  11. // var_dump($stmt);
  12. $stmt->execute();
  13. $reuslt=$stmt->get_result();
  14. $datas=$reuslt->fetch_all(MYSQLI_ASSOC);
  15. return $datas;
  16. }
  17. }

2、View代码:

  1. <?php
  2. namespace one;
  3. // 视图类
  4. class View
  5. {
  6. public function fetch($data)
  7. {
  8. $table = '<table>';
  9. $table .= '<caption>员工信息表</caption>';
  10. $table .= '<tr><th>ID</th><th>姓名</th><th>性别</th><th>职务</th><th>手机号</th><th>入职时间</th></tr>';
  11. // 将数据循环遍历出来
  12. foreach ($data as $staff) {
  13. $table .= '<tr>';
  14. $table .= '<td>' . $staff['id'] . '</td>';
  15. $table .= '<td>' . $staff['name'] . '</td>';
  16. $table .= '<td>' . ($staff['sex'] ? '男' : '女') . '</td>';
  17. $table .= '<td>' . $staff['position'] . '</td>';
  18. $table .= '<td>' . $staff['mobile'] . '</td>';
  19. $table .= '<td>' . date('Y年m月d日', $staff['hiredate']) . '</td>';
  20. $table .= '</tr>';
  21. }
  22. $table .= '</table>';
  23. return $table;
  24. }
  25. }
  26. echo '<style>
  27. table {border-collapse: collapse; border: 2px solid;text-align: center;height: 150px;width: 600px;background-color:yellow; }
  28. caption {font-size: 1.2rem; margin-bottom: 10px;}
  29. tr:first-of-type { background-color:red;}
  30. td,th {border: 1px solid; padding:5px}
  31. </style>';
  32. // require 'Model.php';
  33. // $mysql=new Model;
  34. // $datas=$mysql->getdate();
  35. // echo (new View())->fetch($datas);

3、Control代码:

  1. <?php
  2. namespace one;
  3. // 加载数据和视图
  4. require 'Model.php';
  5. require 'View.php';
  6. class Objects
  7. {
  8. protected $obj=[];
  9. public function bind($classname,\Closure $class)
  10. {
  11. $this->obj[$classname]=$class;
  12. }
  13. public function make($classname,$params=[])
  14. {
  15. return call_user_func_array($this->obj[$classname],[]);
  16. }
  17. }
  18. $obj=new Objects;
  19. $obj->bind('model',function(){return new Model();});
  20. $obj->bind('view',function(){return new View();});
  21. class Face
  22. {
  23. protected static $class=null;
  24. protected static $datas=[];
  25. public static function set(Objects $obj)
  26. {
  27. static::$class=$obj;
  28. }
  29. public static function get_datas()
  30. {
  31. static::$datas=static::$class->make('model')->getdatas();
  32. }
  33. public static function fetch()
  34. {
  35. return static::$class->make('view')->fetch(static::$datas);
  36. }
  37. }
  38. class Controler
  39. {
  40. public function __construct(Objects $class)
  41. {
  42. Face::set($class);
  43. }
  44. public function index()
  45. {
  46. Face::get_datas();
  47. return Face::fetch();
  48. }
  49. }
  50. $c=new Controler($obj);
  51. echo $c->index();

4、效果图:

作业二

代码:

  1. <?php
  2. namespace part10;
  3. // 将所有查询参数全部使用pathinfo方式提供
  4. // 实例演示
  5. class ActionController1
  6. {
  7. public function method($id, $name,$age)
  8. {
  9. return "id => $id : name => $name : age => $age";
  10. }
  11. }
  12. // 1. 解析出pathinfo
  13. // echo $_SERVER['PATH_INFO'].'<br>';
  14. $url=ltrim($_SERVER['PATH_INFO'],'/');
  15. $pathinfo = explode('/',$url);
  16. $pathinfo = array_values($pathinfo);
  17. echo '<pre>' . print_r($pathinfo, true) . '</pre>';
  18. // 解析出控制器
  19. $controller = __NAMESPACE__ . '\\' . ucfirst($pathinfo[0]) . 'Controller1';
  20. // echo $controller;
  21. // 解析控制器方法
  22. $action = $pathinfo[1];
  23. // 解析参数
  24. // array_slice(): 从一个数组中返回指定索引开始的指定长度的元素
  25. $values = array_slice($pathinfo, 2);
  26. $params = [];
  27. for ($i=0; $i<count($values); $i+=2) {
  28. if (isset($values[$i+1])) $params[$values[$i]] = $values[$i+1];
  29. }
  30. echo '<pre>' . print_r($params, true) . '</pre>';
  31. // 实例化控制器
  32. $test = new $controller();
  33. // 以回调的方式来调用控制器的方法
  34. echo call_user_func_array([$test, 'method'], $params);

结果图:

作业三:

1、知识点:
(1)http请求:
$_SERVER[‘REQUEST_URI’]:域名下的文件地址
$_SERVER[‘SCRIPT_FILENAME’]:服务器上的据对路径
$_SERVER[‘SCRIPT_NAME’]:域名下的绝对路径
$_SERVER[‘PATH_INFO’]:跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息(并非所有的url都有这个值)
$_SERVER[‘QUERY_STRING’]:查询的字符串
parse_str(‘id=10&name=ldy’,$params):将查询的字符串转换成数组;
http_build_query():将一个关联数组解析成一个查询字符串(自动转义);
explode(‘/‘,$url):将$url以 / 为界拆分成数组;
array_filter():过滤函数
array_values($array):将数组中的值取出重新组成一个数组;
ucfirst($str):将字符串的首字母大写
call_user_func_array():利用回调函数处理数组
array_slice($array,2,3):从一个数组返回指定索引开始的指定长度的元素。

上一条:HTML头部下一条:正则表达式中 *
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议