DIY 實現 ThinkPHP 核心框架(四)名稱空間

cn-five發表於2020-08-27

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 協議》,轉載必須註明作者和本文連結

相關文章