DIY 实现 ThinkPHP 核心框架(四)命名空间

PHP 中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

  1. 用户编写的代码与 PHP 内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

命名空间的使用

/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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!