亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP SPL擴展庫的使用方法

發布時間:2021-06-26 09:56:14 來源:億速云 閱讀:143 作者:chen 欄目:大數據

本篇內容主要講解“PHP SPL擴展庫的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PHP SPL擴展庫的使用方法”吧!

1. __autoload

這是一個自動加載函數,在PHP5中,當我們實例化一個未定義的類時,就會觸發此函數。看下面例子:

./myClass.php
<?php
class myClass {
    public function __construct() {
        echo "myClass init'ed successfuly!!!";
    }
}
?>
./index.php
<?php
// we've writen this code where we need
function __autoload($classname) {
    $filename = "./". $classname .".php";
    include_once($filename);
}
// we've called a class ***
$obj = new myClass();
?>

從上面能看到這是兩個文件,下面的index.php 中,new了個 myClass類,但是明顯本文件不存在,現在就會自動調用 __autoload函數,并 把 “myClass”這個類名字符串 直接作為參數傳給__autoload, 此時自動加載函數內部就可以引入該文件了,引入后就正常初始化該類了。 該函數在PHP 7.2.0后被廢棄了。

2. spl_autoload_register

spl_autoload_register 可以將 函數自動注冊,也就是說,當PHP文件內訪問了一個不存在的類時,會自動去調用該函數,然后執行該函數內部的函數,看起來和 autoload的作用是一樣的。但是其實spl_autoload_register 這個函數功能更強大, autoload的參數 僅僅是一個函數名,這是定死的。并且只能聲明一次, 使用了autoload后,就不能再次使用該函數了。

請注意:一個項目中只能有一個__autoload, 如果在PHP在執行過程中遇到兩個__autoload會直接報錯的。

很明顯,autoload無法滿足要求, 所以就有了SPL擴展,spl_autoload_register接受函數名或閉包,或數組作為參數,在閉包內部,即可引入對應的文件了。并且spl_autoload_register可以注冊一個 自動加載隊列,先注冊的,先調用。

參數 
autoload_function
欲注冊的自動裝載函數。如果沒有提供任何參數,則自動注冊 autoload 的默認實現函數spl_autoload()。
throw
此參數設置了 autoload_function 無法成功注冊時, spl_autoload_register()是否拋出異常。
prepend
如果是 true,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。

可以結合require_once一起使用。如:

function_1(){
 	$clsName = str_replace("\\",DIRECTORY_SEPARATOR, $class_name);
    if (is_file(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName . '.php')) {
        //文件內部有類名 為 TestClass_1的類
        require_once(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName.'.php'); 
    }
}
function_2(){
 	$clsName = str_replace("\\",DIRECTORY_SEPARATOR, $class_name);
    if (is_file(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName . '.php')) {
        //文件內部有類名為TestClass_2的類
        require_once(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName.'.php');
    }
}
spl_autoload_register('function_1');
spl_autoload_register('function_2');
$obj = new TestClass_2();  //當前沒有TestClass_2這個類,于是自動調用function_1, 引入了文件,但是引入的文件中仍然沒有TestClass_2這個類,于是又自動調用function_2, 引入了文件,此時正常初始化

3.相關的其他SPL函數

PHP SPL擴展庫的使用方法

3.1 spl_autoload_call

該函數是需要用戶顯示調用所有已注冊的 autoload函數的。 作用在 spl_autoload_register之后。 傳入函數名字即可。即可手動引入文件了。

3.2 spl_autoload_functions

可以獲取到所有已經注冊的autoload函數, 也是作用在 spl_autoload_register之后的。

3.3 spl_autoload_extensions

注冊并返回spl_autoload函數使用的默認文件擴展名, 但是此接口和spl_autoload函數,用處不大。spl_autoload 是autoload的默認實現,意思就是spl_autoload對autoload進行了又一次封裝,在默認情況下,本函數先將類名轉換成小寫,再在小寫的類名后加上 .inc 或 .php 的擴展名作為文件名,然后在所有的包含路徑(include paths)中檢查是否存在該文件。

__autoload 函數是用來處理自動加載的函數,在 PHP 找不到指定類時就會去調用自動加載類,加載所需要的類。 __autoload 只是一個抽象定義,實現(實現就是定義如何加載,加載的規則是什么,加載的文件是什么等等)是交給用戶的,而 spl_autoload 則是 SPL 所定義的 autoload 一種實現。spl_autoload 函數所實現的加載規則就是去 include paths 中查找對于的類。spl_autoload 遵循是是 psr-0 的載入規則,而 include paths 就是載入時被查詢的路徑。 其他自己實現的 autoload 類都可以通過 spl_autoload_register 進行注冊,注冊之后就可以在需要類時自動調用被注冊的方法進行加載了。 spl_autoload 也是 autoload 的一種實現,按理也是需要注冊的,只不過因為是內部的默認實現,所有已經自動注冊在 PHP 里了。

spl_autoload 如今來看并沒有太多用處,應該是因為歷史問題殘留在 PHP 中的,目前絕大多數程序都沒有使用 spl_autoload 去做自動加載,因為它的規則已經定死,并不適合衍生一些功能。

因為 PHP 只有一個自動加載方法,所以 SPL 的 spl_autoload 和 spl_autoload_register 要爭搶這個方法,所以在 SPL 的 C 實現中,用了好多折衷的辦法。在沒有使用 spl_autoload_register 注冊任何自定的自動加載函數時, PHP 的自動加載方法是掛在 spl_autoload 下的,而 spl_autoload_register 注冊了自動加載函數后,PHP 的自動加載方法是掛在 spl_autoload_call 這個方法下的,而 spl_autoload 也會成為一個備選項進入 spl_autoload_register 的自動加載隊列。

到此,相信大家對“PHP SPL擴展庫的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

赤峰市| 广安市| 碌曲县| 铁岭市| 上高县| 琼海市| 邻水| 兴山县| 灌云县| 密云县| 东兰县| 江西省| 屏东市| 荣昌县| 和林格尔县| 新邵县| 怀来县| 卢氏县| 绥江县| 曲周县| 九江县| 乐业县| 永寿县| 托克托县| 张家港市| 老河口市| 中方县| 綦江县| 南宁市| 长沙县| 铁力市| 东光县| 西和县| 马鞍山市| 宝清县| 车险| 合山市| 溧水县| 米泉市| 固镇县| 札达县|