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