作业一:
MVC框架:Model > View > Container(对象容器) > Facade(门面) > Controller
1、Model代码:
<?php
namespace one;
use mysqli;
class Model
{
public function getdatas()
{
$mysql=new mysqli('NewYear.com','phptest','123456','php');
$stmt=$mysql->stmt_init();
$stmt->prepare('SELECT * FROM `staffs`');
// var_dump($stmt);
$stmt->execute();
$reuslt=$stmt->get_result();
$datas=$reuslt->fetch_all(MYSQLI_ASSOC);
return $datas;
}
}
2、View代码:
<?php
namespace one;
// 视图类
class View
{
public function fetch($data)
{
$table = '<table>';
$table .= '<caption>员工信息表</caption>';
$table .= '<tr><th>ID</th><th>姓名</th><th>性别</th><th>职务</th><th>手机号</th><th>入职时间</th></tr>';
// 将数据循环遍历出来
foreach ($data as $staff) {
$table .= '<tr>';
$table .= '<td>' . $staff['id'] . '</td>';
$table .= '<td>' . $staff['name'] . '</td>';
$table .= '<td>' . ($staff['sex'] ? '男' : '女') . '</td>';
$table .= '<td>' . $staff['position'] . '</td>';
$table .= '<td>' . $staff['mobile'] . '</td>';
$table .= '<td>' . date('Y年m月d日', $staff['hiredate']) . '</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 2px solid;text-align: center;height: 150px;width: 600px;background-color:yellow; }
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:red;}
td,th {border: 1px solid; padding:5px}
</style>';
// require 'Model.php';
// $mysql=new Model;
// $datas=$mysql->getdate();
// echo (new View())->fetch($datas);
3、Control代码:
<?php
namespace one;
// 加载数据和视图
require 'Model.php';
require 'View.php';
class Objects
{
protected $obj=[];
public function bind($classname,\Closure $class)
{
$this->obj[$classname]=$class;
}
public function make($classname,$params=[])
{
return call_user_func_array($this->obj[$classname],[]);
}
}
$obj=new Objects;
$obj->bind('model',function(){return new Model();});
$obj->bind('view',function(){return new View();});
class Face
{
protected static $class=null;
protected static $datas=[];
public static function set(Objects $obj)
{
static::$class=$obj;
}
public static function get_datas()
{
static::$datas=static::$class->make('model')->getdatas();
}
public static function fetch()
{
return static::$class->make('view')->fetch(static::$datas);
}
}
class Controler
{
public function __construct(Objects $class)
{
Face::set($class);
}
public function index()
{
Face::get_datas();
return Face::fetch();
}
}
$c=new Controler($obj);
echo $c->index();
4、效果图:
作业二
代码:
<?php
namespace part10;
// 将所有查询参数全部使用pathinfo方式提供
// 实例演示
class ActionController1
{
public function method($id, $name,$age)
{
return "id => $id : name => $name : age => $age";
}
}
// 1. 解析出pathinfo
// echo $_SERVER['PATH_INFO'].'<br>';
$url=ltrim($_SERVER['PATH_INFO'],'/');
$pathinfo = explode('/',$url);
$pathinfo = array_values($pathinfo);
echo '<pre>' . print_r($pathinfo, true) . '</pre>';
// 解析出控制器
$controller = __NAMESPACE__ . '\\' . ucfirst($pathinfo[0]) . 'Controller1';
// echo $controller;
// 解析控制器方法
$action = $pathinfo[1];
// 解析参数
// array_slice(): 从一个数组中返回指定索引开始的指定长度的元素
$values = array_slice($pathinfo, 2);
$params = [];
for ($i=0; $i<count($values); $i+=2) {
if (isset($values[$i+1])) $params[$values[$i]] = $values[$i+1];
}
echo '<pre>' . print_r($params, true) . '</pre>';
// 实例化控制器
$test = new $controller();
// 以回调的方式来调用控制器的方法
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):从一个数组返回指定索引开始的指定长度的元素。