批改状态:合格
老师批语:服务容器不仅仅是一个对象池, 也是一个对象管理器
可以理解为当一个项目需要使用到多个参数来传递数据的时候,为此而创建的一个类。
例:一个表单输出项目
先创建一个model脚本
<?phpnamespace 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脚本
<?phpnamespace 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脚本,里面就要用到服务容器类
<?phpnamespace 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']:返回值为地址栏上除域名/主机名外的完整地址
例
<?phpecho 'REQUEST_URI==> ' . $_SERVER['REQUEST_URI'] . '<br>';
图
$_SERVER['QUERY_STRING']:返回值为地址栏上查询字符串,在脚本名后面以’?’开头的
例
<?phpecho 'QUERY_STRING==>'. $_SERVER['QUERY_STRING']. '<br>';
图
$_SERVER['PATH_INFO']:返回值为地址栏上脚本名与查询字符串之间的字符串
例
<?phpecho '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>';
图
例
<?phpnamespace 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赶完了,不知道最后的作业能完成不- -###加油,努力。。。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号