
namespace 防止重名
首先,namespace就是為了解決項(xiàng)目中類(lèi)的重名問(wèn)題。 了解了目的后,就可以知道namespace的影響就 僅僅是限制在和類(lèi)名相關(guān)的操作上。
- namespace后命名的定義不區(qū)分大小寫(xiě)。這就是要求我們?cè)诙x命名空間的時(shí)候要注意別定義了相同命名空間。以下就是等效的命名空間
namespace one;
namespace One;
namespace ONE;
- 和Linux文件目錄不同的事命名空間采用的事反斜杠 ""。
- 沒(méi)有定義命名空間,就默認(rèn)理解為使用頂級(jí)命名空間。在命名空間中的定義中,針對(duì)沒(méi)有命名空間的php文件,會(huì)默認(rèn)虛擬一個(gè)頂層命名空間 \ 。
- 如果一個(gè)類(lèi)在定義的時(shí)候指定了命名空間,new類(lèi)時(shí),一定要帶上指定的命名空間。 這個(gè)意思是如果這個(gè)類(lèi)指定了命名空間,那么相當(dāng)于在整個(gè)項(xiàng)目中這個(gè)類(lèi)必須以命名空間的方式被聲明和使用。 不能單獨(dú)只依靠類(lèi)名來(lái)調(diào)用了。 可以理解成名稱(chēng)替換,這個(gè)替換就是命名空間設(shè)計(jì)的初衷,防止類(lèi)名重復(fù)。
//1.php
namespace one;
class Person{
function __construct(){
echo 'I am one!';
}
}
//name.php
require_once './1.php';
new \one\Person(); //輸出 I am one!;使用person需要這樣來(lái)聲明,在項(xiàng)目中person的名字被固定成這個(gè)樣子。
- 在使用命名命名空間的時(shí)候,如果直接new 一個(gè)類(lèi),PHP解釋器會(huì)默認(rèn)嘗試在當(dāng)前命名空間中尋找這個(gè)類(lèi),如果能找到就new成功,如果失敗就拋出錯(cuò)誤
//1.php
namespace one;
class Person{
function __construct(){
echo 'I am one!';
}
}
//name.php
namespace test;
require_once './1.php';
new \one\Person(); //成功,輸出 I am one!;
new \Person(); //代碼報(bào)錯(cuò):Fatal error: Class 'Person' not found
new Person(); //代碼報(bào)錯(cuò):Fatal error: Class 'test\Person' not found
注意后另個(gè)錯(cuò)誤,第一個(gè)錯(cuò)誤解釋器會(huì)去頂層命名空間尋找,顯然不能找到拋出錯(cuò)誤;第二個(gè)會(huì)從默認(rèn)的test命名空間中尋找。
對(duì)于同一上面的name。php ,如果去掉了namespace test;這段會(huì)怎么樣呢。結(jié)果如下,可以看到此時(shí)沒(méi)有顯示聲明命名空間,那么久開(kāi)始選用默認(rèn)頂層命名空間,所以后面連個(gè)的結(jié)果是一樣的。
//name.php
namespace test;
require_once './1.php';
new \one\Person(); //成功,輸出 I am one!;
new \Person(); //代碼報(bào)錯(cuò):Fatal error: Class 'Person' not found
new Person(); //代碼報(bào)錯(cuò):Fatal error: Class 'Person' not found
- 一個(gè)php文件中可以存在多個(gè)命名空間,第一個(gè)命名空間前不能有任何代碼。(這個(gè)不常用,不建議這樣編碼)
總結(jié)一下:對(duì)于namespace 的掌握就是記住以下幾點(diǎn):
一個(gè)目的: 解決重名問(wèn)題
兩個(gè)默認(rèn): 默認(rèn)頂層虛擬;默認(rèn)當(dāng)前空間尋找;
一個(gè)符號(hào): "\"
use 簡(jiǎn)寫(xiě)類(lèi)名
use 關(guān)鍵字是用來(lái)導(dǎo)入命名空間的,或者說(shuō)就是偷懶簡(jiǎn)寫(xiě)類(lèi)名的功能,他并不能加載文件,加載還要靠其他機(jī)制。 從上面的namespace的介紹中,我們已經(jīng)可以避免重名這個(gè)現(xiàn)象了。但是人們總是偷懶的,每次聲明一個(gè)類(lèi)的時(shí)候還需要寫(xiě)那么長(zhǎng)的命名空間是不能忍受的,隱藏use 和as 就登場(chǎng)了
use one;
require_once './1.php';
new Person();
psr-2的相關(guān)規(guī)定 :
命名空間(namespace)的聲明后面必須有一行空行。
所有的導(dǎo)入(use)聲明必須放在命名空間(namespace)聲明的下面。
一句聲明中,必須只有一個(gè)導(dǎo)入(use)關(guān)鍵字。
在導(dǎo)入(use)聲明代碼塊后面必須有一行空行。
require 導(dǎo)入文件
通過(guò)上面的介紹,我們了解到了類(lèi)的名稱(chēng)在使用時(shí)候的方法。但是無(wú)論namespace 還是use 都不能真的找到這個(gè)php文件把代碼引入,可以看上面的每段代碼都有require 的使用。下面看一個(gè)例子
1.php
<?php
$b = require('ext.php');
echo "---------\r\n";
echo $_SERVER['SCRIPT_FILENAME'];
ext.php
<?php
echo $_SERVER['SCRIPT_FILENAME'];
echo 'I am ext!';
輸出
./1.php
I am ext!
---------
./1.php
- 從這里可以看到require導(dǎo)入后,代碼識(shí)別的腳本是導(dǎo)入后的。從這個(gè)角度也可以部分理解require是對(duì)導(dǎo)入文件直接替換。
- 但是當(dāng)有命名空間就不一樣了。并不是簡(jiǎn)單替換,而是引入保存了命名空間的屬性。
手動(dòng)引入會(huì)使得開(kāi)發(fā)者崩潰的,這時(shí)候命名空間和導(dǎo)入就可以結(jié)合起來(lái)。
psr-4
在說(shuō)啥是PSR-[0-4]規(guī)范的之前,我覺(jué)得我們有必要說(shuō)下它的發(fā)明者和規(guī)范者:PHP-FIG,它的網(wǎng)站是:www.php-fig.org。就是這個(gè)聯(lián)盟組織發(fā)明和創(chuàng)造了PSR-[0-4]規(guī)范,膜拜吧,屌絲們!
FIG 是 Framework Interoperability Group(框架可互用性小組)的縮寫(xiě),由幾位開(kāi)源框架的開(kāi)發(fā)者成立于 2009 年,從那開(kāi)始也選取了很多其他成員進(jìn)來(lái),雖然不是 “官方” 組織,但也代表了社區(qū)中不小的一塊。組織的目的在于:以最低程度的限制,來(lái)統(tǒng)一各個(gè)項(xiàng)目的編碼規(guī)范,避免各家自行發(fā)展的風(fēng)格阻礙了程序設(shè)計(jì)師開(kāi)發(fā)的困擾,于是大伙發(fā)明和總結(jié)了PSR,PSR是Proposing a Standards Recommendation(提出標(biāo)準(zhǔn)建議)的縮寫(xiě),截止到目前為止,總共有5套PSR規(guī)范,分別是:
PSR-0 (Autoloading Standard) 自動(dòng)加載標(biāo)準(zhǔn)
PSR-1 (Basic Coding Standard) 基礎(chǔ)編碼標(biāo)準(zhǔn)
PSR-2 (Coding Style Guide) 編碼風(fēng)格向?qū)?
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自動(dòng)加載的增強(qiáng)版,可以替換掉PSR-0了。
雖然psr-0 已經(jīng)被廢棄,但是還是應(yīng)該先看psr-0協(xié)議:
1. 一個(gè)完全合格的namespace和class必須符合這樣的結(jié)構(gòu):“\< Vendor Name>(< Namespace>)*< Class Name>”
2. 每個(gè)namespace必須有一個(gè)頂層的namespace("Vendor Name"提供者名字)
3. 每個(gè)namespace可以有多個(gè)子namespace
4. 當(dāng)從文件系統(tǒng)中加載時(shí),每個(gè)namespace的分隔符(/)要轉(zhuǎn)換成 DIRECTORY_SEPARATOR(操作系統(tǒng)路徑分隔符)
5. 在類(lèi)名中,每個(gè)下劃線(xiàn)(_)符號(hào)要轉(zhuǎn)換成DIRECTORY_SEPARATOR(操作系統(tǒng)路徑分隔符)。在namespace中,下劃線(xiàn)(_)符號(hào)是沒(méi)有(特殊)意義的。
6. 當(dāng)從文件系統(tǒng)中載入時(shí),合格的namespace和class一定是以 .php 結(jié)尾的
7. verdor name,namespaces,class名可以由大小寫(xiě)字母組合而成(大小寫(xiě)敏感的)
psr-1 規(guī)范
1. PHP源文件必須只使用 <?php 和 <?= 這兩種標(biāo)簽。
2. 源文件中php代碼的編碼格式必須是不帶字節(jié)順序標(biāo)記(BOM)的UTF-8。
3. 一個(gè)源文件建議只用來(lái)做聲明(類(lèi)(class),函數(shù)(function),常量(constant)等)或者只用來(lái)做一些引起副作用的操作(例如:輸出信息,修改.ini配置等),但不建議同時(shí)做這兩件事。
4. 命名空間(namespace)和類(lèi)(class) 必須遵守PSR-0標(biāo)準(zhǔn)。
5. 類(lèi)名(class name) 必須使用駱駝式(StudlyCaps)寫(xiě)法 (注:駝峰式(cameCase)的一種變種,后文將直接用StudlyCaps表示)。
6. 類(lèi)(class)中的常量必須只由大寫(xiě)字母和下劃線(xiàn)(_)組成。
7. 方法名(method name) 必須使用駝峰式(cameCase)寫(xiě)法。
psr-4
1. 廢除了PSR-0中_就是目錄分割符的寫(xiě)法,_下劃線(xiàn)在完全限定類(lèi)名中是沒(méi)有特殊含義了。
2. 類(lèi)文件名要以 .php 結(jié)尾。
3. 類(lèi)名必須要和對(duì)應(yīng)的文件名要一模一樣,大小寫(xiě)也要一模一樣。
自動(dòng)加載
由于時(shí)間原因可以暫時(shí)先看這篇博客
【參考資料】
https://www.cnblogs.com/drunkhero/p/namespace.html
https://www.cnblogs.com/JohnABC/p/6595075.html
https://www.cnblogs.com/woider/p/6443854.html
https://www.php-fig.org/psr/psr-0/ psr-0 官方文檔