1、模型的原理
框架中的模型, 通常会与一张数据表对应, 而模型对象,则与数据表中的一条记录对应
$stmt->setFetchMode(PDO::FETCH_CLASS, $className);
<?php
namespace _1206;
use PDO;
class user{
private $id;
private $name;
private $age;
private $sex;
private $position;
private $mobile;
private $hiredate;
// 属性重载
public function __get($name)
{
return $this->$name;
}
// 构造方法: 用于初始化或设置默认值
public function __construct()
{
// 将性别转为可识别的字符,数据库中0为女,1为男
$this->sex = $this->sex ? '男' : '女';
// 将时间戳转为日期字符串
$this->hiredate = date('Y/m/d', $this->hiredate);
}
}
$pdo = new PDO('mysql:host=localhost;dbname=film', 'root', 'root');
$stmt = $pdo->prepare('SELECT * FROM staffs WHERE id>=:id');
$stmt->execute(['id'=>1]);
// 关键步骤: 指定获取方式,返回一个所请求类的新实例, 映射列到类中对应的属性名
$stmt->setFetchMode(PDO::FETCH_CLASS, user::class);
// 返回的每一条记录都是user类的实例对象
while ($user = $stmt->fetch()) {
// 属性重载的应用
echo "<li>{$user->id}---{$user->name}---{$user->sex}---{$user->hiredate}</li>";
}
2. 路由的原理
$_SERVER['REQUEST_URI']
: 超全局变量, 用户请求的web资源地址
explode()
: 使用一个字符串分割另一个字符串,返回数组
array_slice($arr, $start, $length)
: 获取数组片断
list($var1, $var2,...)
: 将索引数组成员转为独立变量
compact($str1, $str2,...)
: 将变量转为关联数组成员
call_user_func_array()
: 以回调方式执行一个函数/方法
路由的原理 基础1
<?php
//示例链接:http://localhost/_1206/demo1.php/admin/index/hello
$uri = $_SERVER['REQUEST_URI'];
echo $uri;
//explode()字符串转索引数组
//如本例中explode('/',$uri), 通过“/”分割成数组;;如字符串是 $a='admin,2,age'; 转数组就是 explode(',',$a)
$request = explode('/', $uri);
echo '<pre>' . print_r($request, true) . '</pre>';
//array_slice(数组名,开始位置,长度) 如果一直到终点,长度可不写
$route = array_slice($request, 3,3);
echo '<pre>' . print_r($route, true) . '</pre>';
// list()语法结构, 可以从将一个索引数组中每个元素,设置一个字符串键名,并转为独立变量使用
// list()并非函数, 因为它可以用到等号左边, 接受赋值操作, 而函数是绝对不允许也不可能用在等号左边的
list($name,$controller,$action) = $route;
echo "模块:{$name}, 控制器:{$controller}, 操作{$action}";
echo '<pre>' . print_r($route, true) . '</pre>';
// compact(),索引数组转换成关联数组
$route = compact('name','controller','action');
echo '<pre>' . print_r($route,true);
路由的原理 基础2
<?php
// 示例:http://localhost/_1206/demo1.php/admin/index/hello/name/peter/work/teacher
$uri = $_SERVER['REQUEST_URI'];
echo $uri;
//explode()字符串转数组
$request = explode('/', $uri);
echo '<pre>' . print_r($request, true) . '</pre>';
//array_slice()起始截取数组
$values = array_slice($request, 6, 4);
echo '<pre>' . print_r($values,true);
//这里截取的结果是 name/peter/work/teacher
// 键 / 值 / 键 / 值
//我们的需求是 转成一个数组 $a=['name'=>'peter', 'work'=>'teacher']
//for $i+=2,就是避开键值一起调用了,仅调用键
for($i=0;$i<count($values);$i+=2){
//第一个为键,第二个为值;判断第二个值存在的情况下执行
if( isset($values[$i+1]) ){
$params[$values[$i]] = $values[$i+1];
}
}
//查询结果 结果为数组 name=peter; work=teacher
echo '<pre>' . print_r($params,true) . '</pre>';
路由小案例
<?php
// 示例:http://localhost/_1206/demo1.php/admin/index/hello/id/1/name/admin
$uri = $_SERVER['REQUEST_URI'];
echo $uri;
//将url转换成数组
$request = explode('/', $uri);
echo '<pre>'.print_r($request, true).'</pre>';
//截取某个区间的数组
$route = array_slice($request, 3, 3);
echo '<pre>'.print_r($route, true).'</pre>';
//通过list()设键 ,键可以自定义
list($model, $controller, $action) = $route;
echo "模块:\$model = {$model}<br>控制器:\$controller = {$controller}<br> 操作:\$action = {$action}";
//通过list()设的键,与其值,再通过compact()转换成关联数组
$getinfo = compact('model','controller','action');
echo '<pre>'.print_r($getinfo, true).'</pre>';
echo '<hr>';
//截取数组,其他的如,id/1/name/admin
$arr = array_slice($request,6);
echo '<pre>'.print_r($arr, true).'</pre>';
//对应转换 使其['id'=>1, 'name'=>'admin']
for($i=0;$i<count($arr);$i+=2){ // $i+=2 就是只取键id , name,跳过值1 , admin
//$param是自定义的
$param[$arr[$i]] = $arr[$i+1];
}
echo '<pre>'.print_r($param, true).'</pre>';
// 示例:http://localhost/_1206/demo1.php/admin/index/hello/id/1/name/admin
// 将以上组合起来,做成类
// 这个index不是自定义的,是url链接中的index
class index{
//hello也是url链接中的hello
public function hello($id,$name){
//这里的id 与 name 还有它们的值都必须一一对应示例的URL
return 'index控制器的hell()操作:$id=' . $id . ' $name=' . $name;
}
}
echo call_user_func_array([new $getinfo['controller'],$getinfo['action']],$param);