namespace 防止重名
首先,namespace就是為了解決項目中類的重名問題诡曙。 了解了目的后臀叙,就可以知道namespace的影響就 僅僅是限制在和類名相關的操作上。
- namespace后命名的定義不區(qū)分大小寫价卤。這就是要求我們在定義命名空間的時候要注意別定義了相同命名空間劝萤。以下就是等效的命名空間
namespace one;
namespace One;
namespace ONE;
- 和Linux文件目錄不同的事命名空間采用的事反斜杠 ""。
- 沒有定義命名空間慎璧,就默認理解為使用頂級命名空間床嫌。在命名空間中的定義中,針對沒有命名空間的php文件胸私,會默認虛擬一個頂層命名空間 \ 厌处。
- 如果一個類在定義的時候指定了命名空間,new類時岁疼,一定要帶上指定的命名空間蔓同。 這個意思是如果這個類指定了命名空間缓淹,那么相當于在整個項目中這個類必須以命名空間的方式被聲明和使用粪躬。 不能單獨只依靠類名來調(diào)用了。 可以理解成名稱替換贯要,這個替換就是命名空間設計的初衷,防止類名重復凶伙。
//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需要這樣來聲明,在項目中person的名字被固定成這個樣子函荣。
- 在使用命名命名空間的時候,如果直接new 一個類扳肛,PHP解釋器會默認嘗試在當前命名空間中尋找這個類傻挂,如果能找到就new成功,如果失敗就拋出錯誤
//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(); //代碼報錯:Fatal error: Class 'Person' not found
new Person(); //代碼報錯:Fatal error: Class 'test\Person' not found
注意后另個錯誤金拒,第一個錯誤解釋器會去頂層命名空間尋找,顯然不能找到拋出錯誤套腹;第二個會從默認的test命名空間中尋找绪抛。
對于同一上面的name。php 电禀,如果去掉了namespace test幢码;這段會怎么樣呢。結(jié)果如下尖飞,可以看到此時沒有顯示聲明命名空間症副,那么久開始選用默認頂層命名空間,所以后面連個的結(jié)果是一樣的政基。
//name.php
namespace test;
require_once './1.php';
new \one\Person(); //成功贞铣,輸出 I am one!;
new \Person(); //代碼報錯:Fatal error: Class 'Person' not found
new Person(); //代碼報錯:Fatal error: Class 'Person' not found
- 一個php文件中可以存在多個命名空間,第一個命名空間前不能有任何代碼沮明。(這個不常用辕坝,不建議這樣編碼)
總結(jié)一下:對于namespace 的掌握就是記住以下幾點:
一個目的: 解決重名問題
兩個默認: 默認頂層虛擬;默認當前空間尋找荐健;
一個符號: "\"
use 簡寫類名
use 關鍵字是用來導入命名空間的酱畅,或者說就是偷懶簡寫類名的功能,他并不能加載文件摧扇,加載還要靠其他機制圣贸。 從上面的namespace的介紹中,我們已經(jīng)可以避免重名這個現(xiàn)象了扛稽。但是人們總是偷懶的吁峻,每次聲明一個類的時候還需要寫那么長的命名空間是不能忍受的,隱藏use 和as 就登場了
use one;
require_once './1.php';
new Person();
psr-2的相關規(guī)定 :
命名空間(namespace)的聲明后面必須有一行空行。
所有的導入(use)聲明必須放在命名空間(namespace)聲明的下面用含。
一句聲明中矮慕,必須只有一個導入(use)關鍵字。
在導入(use)聲明代碼塊后面必須有一行空行啄骇。
require 導入文件
通過上面的介紹痴鳄,我們了解到了類的名稱在使用時候的方法。但是無論namespace 還是use 都不能真的找到這個php文件把代碼引入缸夹,可以看上面的每段代碼都有require 的使用痪寻。下面看一個例子
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導入后,代碼識別的腳本是導入后的虽惭。從這個角度也可以部分理解require是對導入文件直接替換橡类。
- 但是當有命名空間就不一樣了。并不是簡單替換芽唇,而是引入保存了命名空間的屬性顾画。
手動引入會使得開發(fā)者崩潰的,這時候命名空間和導入就可以結(jié)合起來匆笤。
psr-4
在說啥是PSR-[0-4]規(guī)范的之前研侣,我覺得我們有必要說下它的發(fā)明者和規(guī)范者:PHP-FIG,它的網(wǎng)站是:www.php-fig.org炮捧。就是這個聯(lián)盟組織發(fā)明和創(chuàng)造了PSR-[0-4]規(guī)范庶诡,膜拜吧,屌絲們寓盗!
FIG 是 Framework Interoperability Group(框架可互用性小組)的縮寫灌砖,由幾位開源框架的開發(fā)者成立于 2009 年,從那開始也選取了很多其他成員進來傀蚌,雖然不是 “官方” 組織基显,但也代表了社區(qū)中不小的一塊。組織的目的在于:以最低程度的限制善炫,來統(tǒng)一各個項目的編碼規(guī)范撩幽,避免各家自行發(fā)展的風格阻礙了程序設計師開發(fā)的困擾,于是大伙發(fā)明和總結(jié)了PSR箩艺,PSR是Proposing a Standards Recommendation(提出標準建議)的縮寫窜醉,截止到目前為止,總共有5套PSR規(guī)范艺谆,分別是:
PSR-0 (Autoloading Standard) 自動加載標準
PSR-1 (Basic Coding Standard) 基礎編碼標準
PSR-2 (Coding Style Guide) 編碼風格向?qū)?
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自動加載的增強版榨惰,可以替換掉PSR-0了。
雖然psr-0 已經(jīng)被廢棄静汤,但是還是應該先看psr-0協(xié)議:
1. 一個完全合格的namespace和class必須符合這樣的結(jié)構(gòu):“\< Vendor Name>(< Namespace>)*< Class Name>”
2. 每個namespace必須有一個頂層的namespace("Vendor Name"提供者名字)
3. 每個namespace可以有多個子namespace
4. 當從文件系統(tǒng)中加載時琅催,每個namespace的分隔符(/)要轉(zhuǎn)換成 DIRECTORY_SEPARATOR(操作系統(tǒng)路徑分隔符)
5. 在類名中居凶,每個下劃線(_)符號要轉(zhuǎn)換成DIRECTORY_SEPARATOR(操作系統(tǒng)路徑分隔符)。在namespace中藤抡,下劃線(_)符號是沒有(特殊)意義的侠碧。
6. 當從文件系統(tǒng)中載入時,合格的namespace和class一定是以 .php 結(jié)尾的
7. verdor name,namespaces,class名可以由大小寫字母組合而成(大小寫敏感的)
psr-1 規(guī)范
1. PHP源文件必須只使用 <?php 和 <?= 這兩種標簽缠黍。
2. 源文件中php代碼的編碼格式必須是不帶字節(jié)順序標記(BOM)的UTF-8弄兜。
3. 一個源文件建議只用來做聲明(類(class),函數(shù)(function)瓷式,常量(constant)等)或者只用來做一些引起副作用的操作(例如:輸出信息替饿,修改.ini配置等),但不建議同時做這兩件事贸典。
4. 命名空間(namespace)和類(class) 必須遵守PSR-0標準盛垦。
5. 類名(class name) 必須使用駱駝式(StudlyCaps)寫法 (注:駝峰式(cameCase)的一種變種,后文將直接用StudlyCaps表示)瓤漏。
6. 類(class)中的常量必須只由大寫字母和下劃線(_)組成。
7. 方法名(method name) 必須使用駝峰式(cameCase)寫法颊埃。
psr-4
1. 廢除了PSR-0中_就是目錄分割符的寫法蔬充,_下劃線在完全限定類名中是沒有特殊含義了。
2. 類文件名要以 .php 結(jié)尾班利。
3. 類名必須要和對應的文件名要一模一樣饥漫,大小寫也要一模一樣。
自動加載
由于時間原因可以暫時先看這篇博客
【參考資料】
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 官方文檔