<?php
namespace MyProject;
class MyClass { /* ... */ }
function myFunction() { /* ... */ }
const MY_CONST = 1;
**規則**:`namespace` 必須是檔案**第一行**程式碼(前面只能有 `declare`)。
namespace MyProject\Helper\Http;
class Request { /* ... */ }
<?php
namespace A { class Foo {} }
namespace B { class Bar {} }
僅適用於合併多個舊腳本,現代專案**一檔一命名空間**。
| 方式 | 範例 | 解析說明 |
|---|---|---|
| 非限定名稱 | `$a = new Foo();` | 目前命名空間下的 `Foo`,若無則找全域 |
| 限定名稱 | `$a = new Sub\Foo();` | 目前命名空間下的 `Sub\Foo` |
| 完全限定名稱 | `$a = new \Global\Foo();` | 絕對路徑,前導 `\` 代表全域空間 |
<?php
namespace App;
use My\Full\Classname as Another; // 類別別名
use My\Full\NSname; // 等同 use My\Full\NSname as NSname
use \ArrayObject; // 匯入全域類別
// PHP 7.0+ 群組導入
use My\Full\{ClassA, ClassB, ClassC as C};
use function My\Full\{funcA, funcB};
use const My\Full\{CONST_A, CONST_B};
**注意**:PHP **不支援**導入函式或常數到別名(僅支援類別/介面/Traits)。
<?php
namespace A;
use B\D, C\E as F;
// 函式呼叫
foo(); // 1. A\foo() 2. 全域 foo()
\foo(); // 全域 foo()
my\foo(); // A\my\foo()
F(); // 1. A\F() 2. 全域 F()
// 類別實例化
new B(); // A\B -> autoload A\B
new D(); // B\D (匯入規則)
new F(); // C\E (匯入規則)
new \B(); // 全域 B
new \D(); // 全域 D
// 靜態方法
B\foo(); // A\B\foo()
B::foo(); // A\B::foo() -> autoload A\B
D::foo(); // B\D::foo() (匯入)
\B\foo(); // 全域 B\foo()
\B::foo(); // 全域 B::foo()
現代專案配合 Composer 自動載入,目錄結構對應命名空間:
src/
├── App/
│ ├── Controller/
│ │ └── UserController.php // namespace App\Controller;
│ └── Model/
│ └── User.php // namespace App\Model;
// composer.json
"autoload": {
"psr-4": {
"App\\": "src/App/"
}
}