基礎教程力薦
碼農必須擁有一本屬於自己的教科書,當你基礎忘記了,也可以直接拿起來閱讀,鞏固基礎
文章正文
作者:cyw
來源:博客
原文:https://www.cnblogs.com/martin-tan/p/4864539.html
概要:
1. 聲明了命名空間之後,下面的const, function, class都會劃歸到該命名空間。
2. 只有聲明過命名空間的PHP 文件才能加載有命名空間的PHP文件。
3. PHP 5.3 及以上才能使用命名空間
名詞:
關鍵字:namespace 用來聲明 本PHP文件的命名空間
常量:__NAMESPACE__ 用來返回當前命名空間的名稱 默認為空字符串
操作符: use 默認以最後一個\後的字符串為別名,配合 as 則為 as後的字符串,與MySQL的欄位別名一致。
為什麼使用命名空間我們的代碼可能和其他開發者的代碼使用相同的類名、接口名、函數或常量名,如果不使用命名空間,名稱會起衝突,導致PHP執行出錯。而使用命名空間將代碼放到唯一的廠商命名空間,我們的代碼就可以和其他開發者使用相同的類名、接口名、函數或常量名。
當然如果你開發的是小型個人項目,只有少量的依賴,類名衝突可能不是問題,但是如果在團隊中工作,開發用到許多第三方依賴的大型項目,就要認真對待命名衝突問題,因為你無法控制項目依賴在全局命名空間中引入的類、接口、函數和常量,這也是為什麼要使用命名空間的原因。
實際操作如下:
在apache目錄下建立如下文件:index.php,Order.php,User.php
Order.php 的內容為
<?php
namespace Order;
const STR = 'order list<br />';
function detail()
{
return 'order detail<br />';
}
function call_by_self()
{
return 'call by self<br />';
}
class Orderlist
{
public function __construct()
{
echo 'Class NameSpace is "', __NAMESPACE__, '"';
}
public function show_list()
{
for ($i = 0; $i < 5; $i++) {
echo "<ul><li>this is order$i<br />";
echo detail();
echo "</li></ul>";
}
}
}
echo \Order\call_by_self();
index.php 內容為:
<?php
namespace index;
include_once('Order.php');
use Order\Orderlist;
$orderlist = new orderlist;
$orderlist->show_list();
use Order;
echo Order\STR;
echo Order\detail();
列印結果為:
以上內容包含了:通過命名空間來訪問文件和直接實例化訪問,以及本空間直接訪問。
命名空間的存在是為了防止兩個同名的class都被載入,使用命名空間在加載第三方的類時能避免同名衝突。
下面來說一下自動加載
SPL 的全稱是:Standard PHP Library PHP標準庫,在PHP5以後已經內置在PHP中,無需另外安裝。
SPL包含了一套針對數據結構、迭代器、異常、文件處理等的函數庫。
自動裝載庫有以下函數
spl_autoload_call:嘗試調用所有已註冊的__autoload()函數來裝載請求類
User.php 內容為:
namespace User;
spl_autoload_register(function($className) {
var_dump($className);
});
spl_autoload_call('Order');
列印結果為:
SPL自動載入函數包含如下:
spl_autoload_extensions: 註冊並返回spl_autoload函數使用的默認文件擴展名。
get_include_path: 設置默認引用的文件夾
spl_autoload_register: 自動引入文件
實際操作如下:
我們重新調整目錄結構和並複製order 到 lib下面 如下:
修改User.php 如下:
namespace User;
define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR);
spl_autoload_register(function ($class) {
$path = LIB_DIR . $class . '.lib.php';
include ($path);
});
spl_autoload_call('Order');
use Order;
$orderList = new \Order\Orderlist();
$orderList->show_list();
列印結果為:
注意:
當採用SPL載入文件時,use並不能觸發spl_autoload_register函數,他會被new觸發,這樣就會提示找不到文件,
所有採用spl_autoload_call 來提前觸發自動載入。
以上是文章全部內容,有學習與經驗交流的可以加PHP自學中心。一起學習,交流與進步!