亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP autoload機制詳解

2019-11-08 19:42:48
字體:
來源:轉載
供稿:網友

1. 最原始的時候OOP思想: 將每個類的實現都存放在一個單獨的文件里,這樣會很容易實現對類進行復用,同時將來維護時也很便利

<?phpclass Person {var $name, $age;function __construct ($name, $age){$this->name = $name;$this->age = $age;}}?>/* no_autoload.php */<?phprequire_once (”Person.class.php”);$person = new Person(”Altair”, 6);var_dump ($person);?>

2. PHP5提供類的自動裝載(autoload)機制。autoload機制可以使得PHP程序有可能在使用類時才自動包含類文件,而不是一開始就將所有的類文件include進來,這種機制也稱為lazy loading。下面是使用autoload機制加載Person類的例子:<?phpfunction __autoload($classname) {require_once ($classname . “class.php”);}$person = new Person(”Altair”, 6);var_dump ($person);?>

autoload機制的主要執行過程為:(1) 檢查執行器全局變量函數指針autoload_func是否為NULL。(2) 如果autoload_func==NULL, 則查找系統中是否定義有__autoload()函數,如果沒有,則報告錯誤并退出;如果定義了__autoload()函數,則執行__autoload()嘗試加載類,并返回加載結果。(3) 如果autoload_func不為NULL,則直接執行autoload_func指針指向的函數用來加載類。注意此時并不檢查__autoload()函數是否定義。

PHP提供了兩種方法來實現自動裝載機制,一種是使用用戶定義的__autoload()函數,這通常在PHP源程序中來實現;另外一種就是設計一個函數,將autoload_func指針指向它,這通常使用C語言在PHP擴展中實現。如果既實現了__autoload()函數,又實現了autoload_func(將autoload_func指向某一PHP函數),那么只執行autoload_func函數。

3. SPL autoload機制的實現

SPL 是Standard PHP Library(標準PHP庫)的縮寫。它是PHP5引入的一個擴展庫,其主要功能包括autoload機制的實現及包括各種Iterator接口或類。 SPL autoload機制的實現是通過將函數指針autoload_func指向自己實現的具有自動裝載功能的函數來實現的。SPL有兩個不同的函數 spl_autoload, spl_autoload_call,通過將autoload_func指向這兩個不同的函數地址來實現不同的自動加載機制。spl_autoload 是SPL實現的默認的自動加載函數,它的功能比較簡單。它可以接收兩個參數,第一個參數是$class_name,表示類名,第二個參數$file_extensions是可選的,表示類文件的擴展名,可以在$file_extensions中指定多個擴展名,護展名之間用分號隔開即可;如果不指定的話,它將使用默認的擴展名.inc或.php。spl_autoload首先將$class_name變為小寫,然后在所有的 include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數的話),如果找到,就加載該類文件。你可以手動使用spl_autoload(”Person”, “.class.php”)來加載Person類。實際上,它跟require/include差不多,不同的它可以指定多個擴展名。怎 樣讓spl_autoload自動起作用呢,也就是將autoload_func指向spl_autoload?答案是使用 spl_autoload_register函數。在PHP腳本中第一次調用spl_autoload_register()時不使用任何參數,就可以將 autoload_func指向spl_autoload。通過上面的說明我們知道,spl_autoload的功能比較簡單,而且它是在SPL擴展中實現的,我們無法擴充它的功能。如果想實現自己的更靈活的自動加載機制怎么辦呢?這時,spl_autoload_call函數閃亮登場了。我 們先看一下spl_autoload_call的實現有何奇妙之處。在SPL模塊內部,有一個全局變量autoload_functions,它本質上是一個HashTable,不過我們可以將其簡單的看作一個鏈表,鏈表中的每一個元素都是一個函數指針,指向一個具有自動加載類功能的函數。spl_autoload_call本身的實現很簡單,只是簡單的按順序執行這個鏈表中每個函數,在每個函數執行完成后都判斷一次需要的類是否已經加載,如果加載成功就直接返回,不再繼續執行鏈表中的其它函數。如果這個鏈表中所有的函數都執行完成后類還沒有加載,spl_autoload_call就直接 退出,并不向用戶報告錯誤。因此,使用了autoload機制,并不能保證類就一定能正確的自動加載,關鍵還是要看你的自動加載函數如何實現。那 么自動加載函數鏈表autoload_functions是誰來維護呢?就是前面提到的spl_autoload_register函數。它可以將用戶定義的自動加載函數注冊到這個鏈表中,并將autoload_func函數指針指向spl_autoload_call函數(注意有一種情況例外,具體是哪 種情況留給大家思考)。我們也可以通過spl_autoload_unregister函數將已經注冊的函數從autoload_functions鏈表 中刪除。上節說過,當autoload_func指針非空時,就不會自動執行__autoload()函數 了,現在autoload_func已經指向了spl_autoload_call,如果我們還想讓__autoload()函數起作用應該怎么辦呢?當然還是使用spl_autoload_register(__autoload)調用將它注冊到autoload_functions鏈表中?,F在回到第一節最后的問題,我們有了解決方案:根據每個類庫不同的命名機制實現各自的自動加載函數,然后使用spl_autoload_register分別將其注冊到SPL自動加載函數隊列中就可了。這樣我們就不用維護一個非常復雜的__autoload函數了。

4. autoload效率問題及對策使用autoload機制時,很多人的第一反應就是使用autoload會降低系統效率,甚至有人干脆提議為了效率不要使用autoload。在我們了解了 autoload實現的原理后,我們知道autoload機制本身并不是影響系統效率的原因,甚至它還有可能提高系統效率,因為它不會將不需要的類加載到系統中。那么為什么很多人都有一個使用autoload會降低系統效率的印象呢?實際上,影響autoload機制效率本身恰恰是用戶設計的自動加載函數。如果它不能高效的將類名與實際的磁盤文件(注意,這里指實際的磁盤文件,而不僅僅是文件名)對應起來,系統將不得不做大量的文件是否存在(需要在每個 include path中包含的路徑中去尋找)的判斷,而判斷文件是否存在需要做磁盤I/O操作,眾所周知磁盤I/O操作的效率很低,因此這才是使得autoload機 制效率降低的罪魁禍首!因此,我們在系統設計時,需要定義一套清晰的將類名與實際磁盤文件映射的機制。這個規則越簡單越明確,autoload機制的效率就越高。結論:autoload機制并不是天然的效率低下,只有濫用autoload,設計不好的自動裝載函數才會導致其效率的降低。


上一篇:淺談PHP中的鉤子

下一篇:PHP 網絡技術

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成人在线播放| 欧美日本高清视频| 久久精品国产2020观看福利| 日韩美女在线观看一区| 一本久久综合亚洲鲁鲁| 欧洲s码亚洲m码精品一区| 自拍偷拍亚洲在线| 91精品国产九九九久久久亚洲| 成人在线精品视频| www.日韩视频| 欧美精品午夜视频| 欧美日韩一区二区免费视频| 国产精品青青在线观看爽香蕉| 欧美性猛交xxxx富婆弯腰| 久久天堂av综合合色| 欧美激情videoshd| 亚洲天堂日韩电影| 亚洲国产成人一区| 亚洲精品国精品久久99热一| 成人精品久久一区二区三区| 欧美大片在线看| 欧美一级电影免费在线观看| 中文字幕自拍vr一区二区三区| 91精品久久久久久久久久| 亚洲国产又黄又爽女人高潮的| 91中文精品字幕在线视频| 国产97在线观看| 国产精品久久久久久久久久尿| 97人人模人人爽人人喊中文字| 国产丝袜一区二区三区免费视频| 亚洲成人在线视频播放| 成人黄色片网站| 亚洲成人精品视频在线观看| 亚洲大胆人体在线| 欧美日韩一区免费| 欧美日韩高清区| 91久久久久久久久久久| 精品久久久在线观看| 精品福利视频导航| 亚洲xxx大片| 亚洲欧美日本伦理| 亚洲老头同性xxxxx| 欧美性猛交xxxx免费看| 亚洲国产一区二区三区四区| 国产成人小视频在线观看| 欧美日韩国产在线| 正在播放亚洲1区| 国产第一区电影| 色99之美女主播在线视频| 波霸ol色综合久久| 91精品视频专区| 欧美丰满少妇xxxxx做受| 久久视频精品在线| 永久免费毛片在线播放不卡| 亚洲xxx视频| 国产精品444| 精品国产福利视频| 欧美激情国产高清| 国产成人拍精品视频午夜网站| 69久久夜色精品国产69| 欧美综合在线观看| 日韩av中文字幕在线播放| 久久久精品国产亚洲| 26uuu另类亚洲欧美日本一| www.久久撸.com| 91在线无精精品一区二区| 国产乱人伦真实精品视频| 国产精品国语对白| 亚洲国产精品成人va在线观看| 精品久久久久久中文字幕| 午夜精品久久久久久久男人的天堂| 欧美性猛交xxxx乱大交| 欧美夫妻性生活视频| 国产精品久久久999| 懂色av中文一区二区三区天美| 国内精品久久久| 国内精品伊人久久| 欧美久久精品一级黑人c片| 日韩美女av在线| 亚洲а∨天堂久久精品9966| 精品女同一区二区三区在线播放| 最新国产精品拍自在线播放| 日韩精品在线免费观看| 992tv在线成人免费观看| 欧美激情视频在线免费观看 欧美视频免费一| 久久影院免费观看| 亚洲人成绝费网站色www| 青草青草久热精品视频在线观看| 国内精品久久久久久| 久久久久久久久久久免费精品| 色综合视频一区中文字幕| 国产精欧美一区二区三区| 日本人成精品视频在线| 欧美国产极速在线| 欧美日韩亚洲精品内裤| 国产精品自拍偷拍| 国产亚洲欧美另类中文| 亚洲午夜女主播在线直播| 国产精品久久久久999| 国产三级精品网站| 亚洲精品国产精品国自产在线| 羞羞色国产精品| 欧美日韩高清区| 久久久久久久久久久网站| 久久深夜福利免费观看| 欧美日韩精品在线| 亚洲欧美国产精品专区久久| 成人在线一区二区| 久久久亚洲国产天美传媒修理工| 亚洲精品一区在线观看香蕉| 国产精品一区二区女厕厕| 久久高清视频免费| 亚洲人在线视频| 国产亚洲一区二区精品| 亚洲成人精品久久| 欧美国产日本在线| 最好看的2019年中文视频| 久久天天躁狠狠躁老女人| 亚洲一区二区三区乱码aⅴ| 中文字幕亚洲欧美日韩高清| 日韩影视在线观看| 欧美激情在线观看视频| 黄色一区二区在线| 欧美激情在线狂野欧美精品| 国产专区精品视频| 日韩精品在线视频美女| 国产精品com| 亚洲国产日韩欧美在线动漫| 国产精品视频网址| 欧美国产日韩一区二区| 日韩中文字幕在线视频| 国产一区二区三区在线观看视频| 国产成人精品久久二区二区91| 国产精品ⅴa在线观看h| 欧美日韩国产精品一区二区三区四区| 日韩欧美大尺度| 亚洲国产精品久久| 亚洲高清一二三区| 亚洲a成v人在线观看| 亚洲福利视频网站| 欧美亚洲激情在线| 日韩在线观看网址| 国产亚洲精品综合一区91| 欧美猛交免费看| 国产欧美精品xxxx另类| 韩国国内大量揄拍精品视频| 国产精品xxx视频| 国产精品香蕉国产| 中文字幕一精品亚洲无线一区| 69av视频在线播放| 亚洲国产欧美一区二区三区久久| 久久久久久久成人| 国产精品1234| 久久久久久高潮国产精品视| 亚洲大尺度美女在线| 成人国产精品免费视频| 欧洲永久精品大片ww免费漫画| 国产91热爆ts人妖在线| 亚洲欧美国产精品| 日韩av网站导航| 亚洲电影免费观看高清完整版| 欧美精品午夜视频| 国产精品人成电影在线观看| 国产美女被下药99|