php 中namespace泛豪、use 稠诲、require 和自動加載

image.png

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/woider/p/6443854.html

【參考資料】

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 官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罗标,一起剝皮案震驚了整個濱河市庸队,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闯割,老刑警劉巖彻消,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宙拉,居然都是意外死亡宾尚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門谢澈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煌贴,“玉大人,你說我怎么就攤上這事锥忿∨V#” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵敬鬓,是天一觀的道長淹朋。 經(jīng)常有香客問我笙各,道長,這世上最難降的妖魔是什么瑞你? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任酪惭,我火速辦了婚禮,結(jié)果婚禮上者甲,老公的妹妹穿的比我還像新娘春感。我一直安慰自己,他們只是感情好虏缸,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布鲫懒。 她就那樣靜靜地躺著,像睡著了一般刽辙。 火紅的嫁衣襯著肌膚如雪窥岩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天宰缤,我揣著相機與錄音颂翼,去河邊找鬼。 笑死慨灭,一個胖子當著我的面吹牛朦乏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氧骤,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呻疹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筹陵?” 一聲冷哼從身側(cè)響起刽锤,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朦佩,沒想到半個月后并思,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡吕粗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年纺荧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅筋。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡宙暇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出议泵,到底是詐尸還是另有隱情占贫,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布先口,位于F島的核電站型奥,受9級特大地震影響瞳收,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厢汹,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一螟深、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烫葬,春花似錦界弧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兑巾,卻和暖如春条获,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒋歌。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工帅掘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堂油。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓锄开,卻偏偏與公主長得像,于是被迫代替她去往敵國和親称诗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容