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;
}
}