DIY 实现 ThinkPHP 核心框架(四)命名空间
在
PHP
中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
- 用户编写的代码与
PHP
内部的类 / 函数 / 常量或第三方类 / 函数 / 常量之间的名字冲突。- 为很长的标识符名称 (通常是为了缓解第一类问题而定义的) 创建一个别名(或简短)的名称,提高源代码的可读性。
命名空间的使用#
在 /home/namespace
目录下创建 demo1.php
文件
namespace demo1;
$num = '666';
class Hi
{
public function hi()
{
echo 'Hello World!';
}
}
在 /home/namespace
目录下创建 demo2.php
文件
namespace demo2;
require __DIR__ . '/demo1.php';
echo $num; // 666
$hi = new \demo1\Hi();
$hi->hi(); // Hello World!
在 /home/namespace
目录下创建 Employee.php
文件
namespace app\index\controller;
class Employee
{
public static function addr()
{
return __CLASS__;
}
}
在 /home/namespace
目录下创建 Container.php
文件
namespace think;
use app\index\controller;
class Container
{
public static function show()
{
return controller\Employee::addr();
}
}
在 /home/namespace
目录下创建 demo3.php
文件
use think\Container;
require __DIR__ . '/Employee.php';
require __DIR__ . '/Container.php';
echo Container::show(); // 输出: app\index\controller\Employee
在模型层类文件 Employee.php
中添加命名空间,由于存在局部命名空间, 需要引用全局空间成员 mysqli
,否则会显示错误
namespace app\employee\model;
use mysqli;
在控制器层 Employee.php
中添加命名空间
namespace app\employee\controller;
修改控制器层类文件 Employee.php
namespace app\employee\controller;
use app\employee\model\Employee as EmployeeModel;
class Employee
{
public function index()
{
// 通过命名空间引入了模型层
// require MODULE_PATH . 'model/EmployeeModel.php';
$model = new EmployeeModel();
$data = $model->getAll();
require MODULE_PATH . 'view/employee.html';
}
}
修改入口文件 index.php
通过命名空间形式导入相关的类
$pathinfo = !empty($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
// 定义路由规则
$route = [
'index' => '/employee/employee/index',
];
$pathinfo = trim($pathinfo, '/');
$pathinfo = $route[$pathinfo] ?? '';
$arr = explode('/', trim($pathinfo, '/'));
if (!isset($arr[2])) {
exit('该操作不存在!');
}
list ($module, $controller, $action) = $arr;
// 目录改变 需从上一级目录进入 application
define('MODULE_PATH', '../application/' . $module . '/');
// 以命名空间的方式引入控制器类
$controllerName = '\\app\\' . $module . '\\controller\\' . ucwords($controller);
// 控制层、模型层类名称更改后相应代码也要做改变
$controllerPath = MODULE_PATH . 'controller/' . ucwords($controller) . '.php';
$empolyee = new $controllerName();
$empolyee->$action();
本作品采用《CC 协议》,转载必须注明作者和本文链接