真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP類的自動加載和命名空間的簡單介紹

這篇文章主要介紹“PHP類的自動加載和命名空間的簡單介紹”,在日常操作中,相信很多人在PHP類的自動加載和命名空間的簡單介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP類的自動加載和命名空間的簡單介紹”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)公司主營清苑網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都app軟件開發(fā),清苑h5微信平臺小程序開發(fā)搭建,清苑網(wǎng)站營銷推廣歡迎清苑等地區(qū)企業(yè)咨詢

淺析PHP類的自動加載和命名空間

php是使用require(require_once)include(include_once)關鍵字加載類文件。但是在實際的開發(fā)工程中我們基本上不會去使用這些關鍵字去加載類。 因為這樣做會使得代碼的維護相當?shù)睦щy。實際的開發(fā)中我們會在文件的開始位置用use關鍵字使用類,然后直接new這個類就可以了. 至于類是怎么加載的,一般都是框架或者composer去實現(xiàn)的。

自動加載

我們可以通過一段偽代碼來模擬一下在類的實例化工程中類是如何工作的

function instance($class)
{
    // 如果類已加載則返回其實例
    if (class_exists($class, false)) {
        return new $class();
    }
    // 查看 autoload 函數(shù)是否被用戶定義
    if (function_exists('__autoload')) {
        __autoload($class); // 最后一次加載類的機會
    }
    // 再次檢查類是否存在
    if (class_exists($class, false)) {
        return new $class();
    } else { // 系統(tǒng):我實在沒轍了
        throw new Exception('Class Not Found');
    }
}

php在語言層面提供了**__autoload** 魔術方法給用戶來實現(xiàn)自己的自動加載邏輯。當用戶去new一個類的時候,如果該類沒有被加載,php會在拋出錯誤前調用**__autoload方法去加載類。下面的例子中的__autoload**方法只是簡單的輸出要加載類的名稱, 并沒有去實際的加載對應的類, 所以會拋出錯誤。

運行結果

Illuminate\Container\Container
Fatal error: Uncaught Error: Class 'Illuminate\Container\Container' not found in D:\project\php\laravel_for_ci_cd\test\ClassLoader.php:5
Stack trace:
#0 {main}
  thrown in D:\project\php\laravel_for_ci_cd\test\ClassLoader.php on line 5
 */

明白了 **__autoload** 函數(shù)的工作原理之后,我們來用它去實現(xiàn)一個最簡單自動加載。我們會有index.php和Person.php兩個文件在同一個目錄下。

//index.php
' . __CLASS__ . '';
    }
}
/**運行結果
 * 輸出 

Person

 */

命名空間

命名空間并不是什么新鮮的事務,很多語言都早就支持了這個特性(只是叫法不相同),它主要解決的一個問題就是命名沖突! 就好像日常生活中很多人都會重名,我們必須要通過一些標識來區(qū)分他們的不同。比如說現(xiàn)在我們要用php介紹一個叫張三的人 ,他在財務部門工作。我們可以這樣描述。

namespace 財務部門;
 
class 張三
{
    function __construct()
    {
        echo '財務部門的張三';
    }
}

這就是張三的基本資料 , namespace是他的部門標識,class是他的名稱. 這樣大家就可以知道他是財務部門的張三而不是工程部門的張三。

非限定名稱,限定名稱和完全限定名稱

1.非限定名稱,或不包含前綴的類名稱,例如 $comment = new Comment(); 如果當前命名空間是Blog\Article,Comment將被解析為、\Blog\Article\Comment。如果使用Comment的代碼不包含在任何命名空間中的代碼(全局空間中),則Comment會被解析為\Comment。

注意: 如果文件的開頭有使用use關鍵字 use one\two\Comment; 則Comment會被解析為 **one\two\Comment**。

2.限定名稱,或包含前綴的名稱,例如 $comment = new Article\Comment(); 如果當前的命名空間是Blog,則Comment會被解析為\Blog\Article\Comment。如果使用Comment的代碼不包含在任何命名空間中的代碼(全局空間中),則Comment會被解析為\Article\Comment。

3.完全限定名稱,或包含了全局前綴操作符的名稱,例如 $comment = new \Article\Comment(); 在這種情況下,Comment總是被解析為\Article\Comment。

spl_autoload

接下來讓我們要在含有命名空間的情況下去實現(xiàn)類的自動加載。我們使用 spl_autoload_register() 函數(shù)來實現(xiàn),這需要你的 PHP 版本號大于 5.12。spl_autoload_register函數(shù)的功能就是把傳入的函數(shù)(參數(shù)可以為回調函數(shù)或函數(shù)名稱形式)注冊到 SPL __autoload 函數(shù)隊列中,并移除系統(tǒng)默認的 **__autoload()** 函數(shù)。一旦調用 spl_autoload_register() 函數(shù),當調用未定義類時,系統(tǒng)就會按順序調用注冊到 spl_autoload_register() 函數(shù)的所有函數(shù),而**不是自動調用 __autoload()** 函數(shù)。

現(xiàn)在, 我們來創(chuàng)建一個 Linux 類,它使用 os 作為它的命名空間(建議文件名與類名保持一致):

' . __CLASS__ . '';
    }
}

接著,在同一個目錄下新建一個 index.php文件,使用 spl_autoload_register 以函數(shù)回調的方式實現(xiàn)自動加載:

 文件路徑
        'os\\Linux' => './Linux.php',
    );
    /* 根據(jù)類名確定文件路徑 */
    $file = $class_map[$class];
    /* 引入相關文件 */
    if (file_exists($file)) {
        include $file;
    }
});
 
new \os\Linux();

這里我們使用了一個數(shù)組去保存類名與文件路徑的關系,這樣當類名傳入時,自動加載器就知道該引入哪個文件去加載這個類了。但是一旦文件多起來的話,映射數(shù)組會變得很長,這樣的話維護起來會相當麻煩。如果命名能遵守統(tǒng)一的約定,就可以讓自動加載器自動解析判斷類文件所在的路徑。接下來要介紹的PSR-4 就是一種被廣泛采用的約定方式

PSR-4規(guī)范

PSR-4 是關于由文件路徑自動載入對應類的相關規(guī)范,規(guī)范規(guī)定了一個完全限定類名需要具有以下結構:

<頂級命名空間>(<子命名空間>)*<類名>

PSR-4 規(guī)范中必須要有一個頂級命名空間,它的意義在于表示某一個特殊的目錄(文件基目錄)。子命名空間代表的是類文件相對于文件基目錄的這一段路徑(相對路徑),類名則與文件名保持一致(注意大小寫的區(qū)別)。

舉個例子:在全限定類名 \app\view\news\Index 中,如果 app 代表 C:\Baidu,那么這個類的路徑則是 C:\Baidu\view\news\Index.php.我們就以解析 \app\view\news\Index 為例,編寫一個簡單的 Demo:

 'C:\Baidu',
);
 
/* 解析類名為文件路徑 */
$vendor = substr($class, 0, strpos($class, '\\')); // 取出頂級命名空間[app]
$vendor_dir = $vendor_map[$vendor]; // 文件基目錄[C:\Baidu]
$rel_path = dirname(substr($class, strlen($vendor))); // 相對路徑[/view/news]
$file_name = basename($class) . '.php'; // 文件名[Index.php]
 
/* 輸出文件所在路徑 */
echo $vendor_dir . $rel_path . DIRECTORY_SEPARATOR . $file_name;

到此,關于“PHP類的自動加載和命名空間的簡單介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
分享名稱:PHP類的自動加載和命名空間的簡單介紹
文章路徑:http://weahome.cn/article/isgiej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部