PHP 命名空間 Namespace
- 每支PHP建議都需要有 namespace,避免與其他檔案衝突。
- PHP namepace 可以將相關的檔案和類別(classes, interfaces, functions and constants.)做很好的管理。
- 原生的PHP對於 namespace 並沒有強制的要求,但強烈建議遵循PSR-4 autoloader的規範
- 命名原則:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
- NamespaceName: 第一層是 vendor name. Ex: EHS
- SubNamespaceNames: 可以有多層,通常以模組\功能來劃分。 EX: Log\Writer, Core\, or Web\
- 最後為 ClassName
Fully Qualified Class Name | Namespace Prefix | Base Directory | Resulting File Path |
---|---|---|---|
\Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
\Aura\Web\Response\Status | Aura\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php |
\Symfony\Core\Request | Symfony\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
\Zend\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php |
Namespace 範例 - Hello World
檔案目錄的結構
- Project folder name: PHP7StudyGroup
- src: 程式碼
- vendor: 共用的 PHP packages 自己的或是第三方套件。
可以參考檔案 Say.php
<?php namespace StudyGroup\LanguageFeatures\Say; require_once('SayHi.php'); require_once('SayHello.php'); $sayHi = new SayHi; $sayHello = new SayHello; echo $sayHi->sayHi() . "\n"; echo $sayHello->sayHello() . "\n";
- 注意: Say.php 檔案中還是需要使用
require() or include()
的指令,因為 namespace 只是宣告工作空間,但是相關的實體檔案,還是需要載入,這樣 PHP 才會正確執行。 - 注意:
SayHi.php
SayHello.php
andSayWorld.php
遵循SPR-1規範,就是單純的 classes 宣告,沒有 side-effects (like echo output). - 注意: 遵從SRP-4規範,ClassName和PHP檔案名稱相通。檔案放置位置和folder命名,也與Namespace相通。
Composer
- composer 並不是什麼特殊的黑魔法,他只是減少程式中使用
require() or include()
可以閱讀這篇 如何使用 composer autoloading 和 簡易 composer 和 namespace 對應
第一步: 需要編寫 composer.json
{ "autoload": { "psr-4": { "StudyGroup\\": "src/" } } }
第二步: 執行composer 將PHP modules做更新
composer dump-autoload -o
第三步: include 產生的 vendor/autoload.php,並且加上
use statement
,請參考 HelloWorld.php<?php require __DIR__ . '/../vendor/autoload.php'; // name space alias use StudyGroup\LanguageFeatures\Say as Say; // the same as use StudyGroup\LanguageFeatures\Say\SayHi as SayHi; use StudyGroup\LanguageFeatures\Say\SayHi; use StudyGroup\LanguageFeatures\Say\SayHello; $sayHi = new SayHi; $sayHello = new SayHello; $sayWorld = new Say\SayWorld; echo $sayHi->sayHi() . "\n"; echo $sayHello->sayHello() . "\n"; echo $sayWorld->sayWorld() . "\n";
composer.json schedma 相關的說明特別注意: