php自動加載

當實例化一個不存在的類的時候,PHP會嘗試去加載它。好比目錄下有一個test的類,它保存在test.php中。在index中,若是沒有包含test.php進來,那麼實例化test類的時候便會調用__autoload嘗試將test類加載進來。php

test.phphtml

<?php函數

class test{ui

  public fucntion index(){spa

    echo "hello word";.net

  }code

}htm

 

index.php接口

<?php隊列

header('Content-Type:text/html;charset=urf-8');

function __autoload($class){

  echo '你正在嘗試加載' . $class;

  require $class . '.php';

}

new test();

運行結果會輸出你正在嘗試加載test,而且不會出現任何的問題。另外自動加載函數的參數 $class 是實例化類的類名。

 

spl_autoload_register()  - 註冊給定函數做爲 __autoload 的實現

官方解釋:

spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool

參數:

autoload_function      欲註冊的自動裝載函數。若是沒有提供任何參數,則自動註冊 autoload 的默認實現函數spl_autoload()

throw   此參數設置了 autoload_function 沒法成功註冊時, spl_autoload_register()是否拋出異常。

prepend  若是是 true,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。

 

將函數註冊到SPL __autoload函數隊列中。若是該隊列中的函數還沒有激活,則激活它們。

若是在你的程序中已經實現了__autoload()函數,它必須顯式註冊到__autoload()隊列中。由於 spl_autoload_register()函數會將Zend Engine中的__autoload()函數取代爲spl_autoload或spl_autoload_call()

若是須要多條 autoload 函數,spl_autoload_register() 知足了此類需求。 它實際上建立了 autoload 函數的隊列,按定義時的順序逐個執行。相比之下, __autoload() 只能夠定義一次。

 

那麼什麼是spl_autoload、spl_auto_load_call呢? 官方解釋:

spl_autoload  -  __autoload()函數的默認實現

是什麼意思呢? 當不使用任何參數調用spl_autoload_register()函數,那麼在之後進行自動加載的時候回默認調用這個函數,我的理解是給autoload函數隊列裏面添加了一個默認的函數,那麼這個函數怎麼使用呢

spl_autoload ( string $class_name [, string $file_extensions ] ) : void      (相信熟悉PHP手冊的人都會看懂的)

下面來解釋一下參數:

class_name   類名

file_extensions    在默認狀況下,本函數先將類名轉換成小寫,再在小寫的類名後加上 .inc 或 .php 的擴展名做爲文件名,而後在全部的包含路徑(include paths)中檢查是否存在該文件。

 

spl_autoload_call ( string $class_name ) : void  — 嘗試調用全部已註冊的__autoload()函數來裝載請求類,  能夠直接在程序中手動調用此函數來使用全部已註冊的__autoload函數裝載類或接口。

參數   :  calss_name    搜索的類名

下面給出一些使用示例,

複製代碼以下:

<?php// function __autoload($class) {//     include 'classes/' . $class . '.class.php';// }function my_autoloader($class) {    include 'classes/' . $class . '.class.php';}spl_autoload_register('my_autoloader');// 或者,自 PHP 5.3.0 起可使用一個匿名函數spl_autoload_register(function ($class) {    include 'classes/' . $class . '.class.php';});?>

相關文章
相關標籤/搜索