在工做平常開發中,我最經常使用的文件引用莫過於include(include_once),以及require(require_once),這兩種引用已經知足了平常簡單CGI的開發須要,可是當深刻了解PHP框架的內容,就會發現單單這兩個關鍵字遠遠不夠,本文整理了部分php文件引用所涉及的知識。php
首先簡要的介紹一下include和require的用法框架
1.include函數
被包含文件先按參數給出的路徑尋找,若是沒有給出目錄(只有文件名)時則按照 include_path(定義於php配置文件)指定的目錄尋找。若是在 include_path 下沒找到該文件則 include 最後纔在調用腳本文件所在的目錄和當前工做目錄下尋找。ui
2.require語句this
require 和 include 幾乎徹底同樣,除了處理失敗的方式不一樣以外。require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。換句話說將致使腳本停止,而 include 只產生警告(E_WARNING),腳本會繼續運行。spa
3.autoload機制code
__autoloader函數是默認用於載入未知PHP類的函數,當再php代碼中出現了未知類時,程序將會自動調用該函數,函數原型及一種簡單的實現以下blog
function __autoload($classname) { $filename = "./". $classname .".php"; include_once($filename); }
一般在各個類型不一樣的類中能夠實現本身的__autoload()函數,若是但願註冊本身的__autoLoade函數則可使用spl中的spl_autoload_register(),該函數能夠將自定義的函數放入autoloader隊列當中,當autoloader被觸發是,將會依次調用隊列中的函數。隊列
spl_autoload_register()原型以下開發
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
spl_autoload_register能夠被調用屢次,將多個自定義的回調函數插入到autoload函數隊列當中。
__autoloader()函數在ZEND引擎中有一個默認的實現,就是spl_autoload(),當不肯意本身實現__autoloader()函數的時候,可使用這個php自帶的載入函數,一般該函數會和spl_autoload_extensions()函數一塊兒使用,spl_autoloader_extensions()能夠指定所包含類所在文件的擴展名,spl_autoload()函數會依據類名+擴展名的形式,在include_path當中尋找對應類所在的文件。以後在代碼中調用不含參數的spl_autoload_register()就能夠在該程序中調用默認的spl_autoload()函數。
A. class.php
<?php class A{ function write(){ echo 「I am A」; } } ?>
B.php
<?php spl_autoload_extensions(「.class.php」); spl_autoload_register(); $a=new A(); $a->write(); // I am A ?>
spl_autoload_call()函數的目的是爲了讓咱們能夠手動去調用spl_autoload_register()註冊隊列中的回調函數,常規狀況下,只有遇到未知類纔會調用autoloader隊列中的回調函數,spl_autoload_call能夠實現手動調用,依次調用隊列中的回調函數直到成功加載到未知類。
A. php
<?php class A{} ?>
B. php
<?php function A($class){ echo "A";}; function B($class) {echo "B";include($class.".php");}; spl_autoload_register(A); spl_autoload_register(B); spl_autoload_call("A"); //輸出 AB ?>
4.use 關鍵字
use語句能夠引用其餘名空間中的類。Php名空間的做用跟其餘語言的名空間做用同樣,用於解決第三方的類中變量及函數的衝突問題。
A.php
<?php namespace TEST; class A{ function myfunc(){ echo "this A::myfunc \n"; } }
B.php
<?php use TEST\A; require_once("A.php"); class B{ function myfunc(){ print "this B::myfunc \n"; } } $b=new B(); $b->myfunc(); $a=new A; $a->myfunc();
輸出:
this B::myfunc
this A::myfunc