php spl 擴充套件,PHP SPL擴充套件庫簡單使用

2021-10-25 21:38:45 字數 3564 閱讀 7515

1. __autoload

這是乙個自動載入函式,在php5中,當我們例項化乙個未定義的類時,就會觸發此函式。看下面例子:

./myclass.php

class myclass {

public function __construct() {

echo "myclass init'ed successfuly!!!";

./index.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函式

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擴充套件學習筆記

一.spl是幹嘛的 spl是用於解決典型問題 standard problems 的一組介面與類的集合。資料結構 1.實現雙向列表 spldoublylinkedlist implements iterator arrayaccess countable 2 splstack extends spl...

php SPL學習筆記

宣告 此文只是對spl的認識有乙個初步的記載,並沒有對spl的詳細用法給出 解釋。1.什麼是spl 官方給出的解釋 spl是用於解決典型問題 standard problems 的一組介面與類的集合。當然這樣有點抽象。具體有什麼作用呢?典型問題又是什麼呢?經過研究文件,發現其實就是對常用的功能進行了...

PHP SPL,遺落的寶石

英文原文 standard php library spl spl,php 標準庫 standard php library 此從 php 5.0 起內建的元件和介面,並且從 php5.3 已逐漸的成熟。spl 其實在所有的 php5 開發環境中被內建,同時無需任何設定。似乎眾多的 php 開發人員...