服务容器
可以理解为当一个项目需要使用到多个参数来传递数据的时候,为此而创建的一个类。
例:一个表单输出项目
先创建一个model脚本
<?php
namespace test;
use PDO;
class Model
{
public function getData()
{
return (new PDO('mysql:host=localhost;dbname=phpedu','root','root'))->query('SELECT * FROM user')
->fetchAll(PDO::FETCH_ASSOC);
}
}
再来一个view脚本
<?php
namespace test;
class View
{
public function fetch($data)
{
$table = '<table>';
$table .='<caption>门派信息</caption>';
$table .='<tr><td>姓名</td><td>门派</td><td>职务</td></tr>';
foreach ($data as $value){
$table .='<tr><td>'. $value['name'] .'</td><td>'. $value['school'] .'</td><td>'. $value['job'] .'</td>';
$table .='</tr>';
}
return $table;
}
}
echo '<style>
table{
margin:auto;
width:200px;
height:150px;
border:1px solid black;
cellspacing:1px;
text-align:center;
border-collapse:collapse;
}
caption{
font-size:25px;
margin:5px 0;
}
tr,td{
border:1px solid black;
padding:5px;
}
</style>';
再来一个controller脚本,里面就要用到服务容器类
<?php
namespace test;
use Closure;
//导入模型数据
require 'model.php';
//导入视图
require 'view.php';
class Container
{
//创建一个空数据来接受所有的类对象
private $package = [];
//创建一个方法,用来传递类闭包对象
public function bind(string $type, \Closure $Closure)
{
$this->package[$type] = $Closure;
}
//提取需要使用的对象
public function take(string $type, $params = [])
{
return call_user_func_array($this->package[$type], $params);
}
}
//创建容器类实例
$container = new Container;
//把model与view传递进容器
$container->bind('model', function () {
return new Model;
});
$container->bind('view', function () {
return new View;
});
// 调式
// $model = $container->take('model');
// $data = $model->getData();
// $view = $container->take('view');
// echo $view->fetch($data);
// die;
//门面类
class Facade
{
private static $container;
private static $data;
//这里需要传入容器类实例
public static function getMold(Container $container)
{
static::$container = $container;
}
public static function getData()
{
//这里步骤就是
// $model = $container->take('model');
// $data = $model->getData();
static::$data = static::$container->take('model')->getData();
}
public static function fetch()
{
// 这里的步骤流程
// $view = $container->take('view');
// $view->fetch($data);
return static::$container->take('view')->fetch(static::$data);
}
}
//控制器
class Controller
{
//这里的构造方法是为了给Facade类传递参数
public function __construct(Container $container)
{
Facade::getMold($container);
}
public function fetch()
{
//获取model数据
Facade::getData();view
//获取view数据
//这里需要注意,不要把return忘记了,不然没有内容输出
return Facade::fetch();
}
}
//创建控制器类实例,并把容器类实例传递进去
$controller = new controller($container);
echo $controller->fetch();
最终输出结果
路由的简单应用
先了解要用到的一些函数与常量
$_SERVER['REQUEST_URI']
:返回值为地址栏上除域名/主机名外的完整地址
例
<?php
echo 'REQUEST_URI==> ' . $_SERVER['REQUEST_URI'] . '<br>';
图$_SERVER['QUERY_STRING']
:返回值为地址栏上查询字符串,在脚本名后面以’?’开头的
例
<?php
echo 'QUERY_STRING==>'. $_SERVER['QUERY_STRING']. '<br>';
图$_SERVER['PATH_INFO']
:返回值为地址栏上脚本名与查询字符串之间的字符串
例
<?php
echo 'PATH_INFO==>' . $_SERVER['PATH_INFO'] . '<br>';
图parse_str()
:将一个查询字符串解析为键值对,保存到一个关联数组中
例
<?php
$str = 'id=20&name=test';
\parse_str($str,$arr);
print_r($arr);
图explode()
:去掉分隔符,并以分隔符为界限,赋值到一个索引数组中
例
<?php
$str ='a+b+c+d';
$arr = explode('+',$str);
echo '<pre>'. print_r($arr,true) .'</pre>';
图array_values()
:参数为数组,取出数组的值,并以索引数组方式重新排列
例
<?php
$arr = ['id'=>2,'cid'=>3];
$arr = array_values($arr);
echo '<pre>'. print_r($arr,true) .'</pre>';
图
根据以上的函数与常量就可以实现一个简单的路由原理
例
<?php
namespace chapter;
echo $_SERVER['REQUEST_URI'];
echo '<hr>';
//获取path信息,并转为数组
$pathinfo = explode('/', $_SERVER['PATH_INFO']);
//去除掉空键值的元素,并以索引数组重新排序
$pathinfo = array_values(array_filter(($pathinfo)));
//检测path数据是否更新
echo '<pre>'.print_r($pathinfo,true).'</pre>';
//拿到类名
$test = __NAMESPACE__. '\\'. ucfirst($pathinfo['0']). 'User';
//拿到方法名;
$func = $pathinfo['1'];
//获取查询字符串
$querystring = $_SERVER['QUERY_STRING'];
\parse_str($querystring,$params);
//测试
echo '<pre>'.print_r($params,true).'</pre>';
class TestUser
{
public function getUser($id,$name)
{
return 'id==>'. $id .': name==>'. $name;
}
}
// 创建类实例
$testuser = new $test;
//因为类方法里面有id与name两个参数要传递
//所以要使用call_user_func_array回调函数,里面第一个参数为数组,第一个表示类名,第二个表示类方法,第二个参数为需要传递的值,它必须为数组
echo call_user_func_array([$testuser,$func],$params);
终于要把PHP赶完了,不知道最后的作业能完成不- -###加油,努力。。。