PHP中的命名空间
1. PHP中的命名空間是什么?
官方解釋在此:?命名空間概述
命名空間用一句話說,就是:把 類、函數、變量 等放到邏輯子文件夾中去,以避免命名沖突。
注:命名空間跟實際代碼文件在文件系統中的路徑沒有任何關系,如果你感到迷茫,可以看看本文最后一節。
2. 被隱藏的第一個 \
在每個 PHP 文件的最開始定義命名空間:
<?php namespace TinyLara\TinyRoute;class TinyRoute {... }在定義命名空間之后引入命名空間:
<?php namespace TinyLara\TinyRoute;use TinyLara\TinyView\TinyView;class TinyRoute {... }上述代碼中,
namespace TinyLara\TinyRoute use TinyLara\TinyView\TinyView這兩行的真實路徑是: \TinyLara\TinyRoute、\TinyLara\TinyView\TinyView,頂級命名空間標識(第一個 \ )被省略了。
3. 被隱藏的別名
在上一節中中,這一行代碼
use TinyLara\TinyView\TinyView的完整寫法應該是:
use \TinyLara\TinyView\TinyView as TinyView;如果不指定別名,那就默認別名為類名。
4. 使用絕對路徑直接調用
?
<?php namespace TinyLara\TinyRoute;class TinyRoute {public function foo(){return \TinyLara\TinyView\TinyView::fuck();} }使用絕對路徑調用類時頂級命名空間標識(第一個 \ )不能省略。(很多人都在這個地方迷惑了)
5. 命名空間的實際價值
命名空間的存在是為了解決下面兩個問題:
目前非常流行的 Composer 就是一個基于命名空間的包管理器/依賴管理器,同樣,Laravel 能達到今天的成功,很大程度上也是因為PHP5.3的普及,生恰逢時。你可以在?https://packagist.org/?上下載到各種 composer 包,類似于 yum、npm或者gem。
6. 同一命名空間下的類可以任意相互調用
<?php namespace A;class ClassA {public static function test() {echo 'Success!';} } <?php namespace A;class ClassB {public static function test() {ClassA::test(); // 直接調用即可} }直接調用即可。
7. 關于代碼文件的結構
PSR-4 命名空間規范約定了 PHP 類的命名空間應該和實際在文件系統中的位置一致,而現實中絕大多數 PHP 框架為了方便都采納了這條規范,最明顯的就是 Laravel 4 到 5 的轉變。在這種情況下,我發現不少新手又迷茫了,錯誤地理解了我在上文中的闡述的“路徑”的概念?;诖宋乙唵沃v述一下 PHP 運行的基本流程,我相信看完你們就不會再有上面的誤解了。
PHP 運行流程
在一個典型的 Apache + ?mod_php 架構的 PHP 運行環境中,一個 PHP 網站是這樣運行的:
命名空間在哪里?
命名空間從始至終就是一個“內部偽概念”,只是用于解決類和變量的命名沖突,從來就跟實際文件結構沒有半毛錢的關系。讓大家疑惑的其實是自動加載,當它和命名空間混雜在一起的時候,就不容易理解了。命名空間從來就是一個純 PHP 內部的概念,你可以把整個 Laravel 框架的所有文件合并成一個巨大的 PHP 文件,取消自動加載,除了性能會損失一些,功能不會受到任何影響,命名空間依舊運轉良好。
轉載于:https://www.cnblogs.com/tpshop/p/8297348.html
總結
- 上一篇: 梦到好多盛开的花什么意思
- 下一篇: PHP7.2 redis