PHP 命名空间

命名空间解决了大型项目中类名、函数名冲突的问题,是现代 PHP 开发的基础。

为什么需要命名空间

PHP 实例
// 没有命名空间时,两个库都有 User 类会冲突
// require 'library1/User.php'; // class User {}
// require 'library2/User.php'; // class User {} ← 致命错误!
``

定义命名空间

`php // 必须是文件第一行(除注释外) namespace App\Models;

class User { public function __construct(public string $name) {} } `

`php namespace App\Controllers;

class UserController { public function index(): void { echo '用户列表'; } } `

使用命名空间

`php namespace App;

// 方式一:完全限定名称 $user = new \App\Models\User('张三');

// 方式二:use 导入 use App\Models\User; use App\Controllers\UserController;

$user = new User('张三'); $controller = new UserController(); `

别名

`php use App\Models\User as UserModel; use App\Models\AdminUser as Admin; use App\Http\Request;

// 解决同名冲突 use Database\Query as DBQuery; use Illuminate\Database\Query as EloquentQuery; `

子命名空间

`php namespace App\Http\Controllers\Api\V1;

class ProductController { // ... } `

`php use App\Http\Controllers\Api\V1\ProductController;

$ctrl = new ProductController(); `

命名空间与文件结构

现代 PHP 项目遵循 PSR-4 规范,命名空间与目录结构对应:

` src/ ├── Models/ │ ├── User.php → namespace App\Models; │ └── Product.php → namespace App\Models; ├── Controllers/ │ └── UserController.php → namespace App\Controllers; └── Services/ └── MailService.php → namespace App\Services; `

全局命名空间

`php namespace App\Utils;

// 访问全局类/函数需要加反斜杠 $date = new \DateTime(); // 全局 DateTime 类 $arr = \json_decode($json, true); // 全局函数 $e = new \Exception('错误');

// 或者 use 导入 use DateTime; use Exception;

$date = new DateTime(); `

命名空间函数与常量

`php namespace App\Utils;

function formatMoney(float $amount): string { return '¥' . number_format($amount, 2); }

const VERSION = '1.0.0'; `

`php use function App\Utils\formatMoney; use const App\Utils\VERSION;

echo formatMoney(9999); // ¥9,999.00 echo VERSION; // 1.0.0 `

实际项目结构示例

``php // composer.json 中配置 PSR-4 自动加载 // "autoload": { "psr-4": { "App\\": "src/" } }

// src/Models/User.php namespace App\Models;

class User { public static function find(int $id): ?static { // 查询数据库... return null; } }

// src/Controllers/UserController.php namespace App\Controllers;

use App\Models\User;

class UserController { public function show(int $id): void { $user = User::find($id); if (!$user) { http_response_code(404); return; } echo $user->name; } }