以下是摜蛋游戲WEB版的部分后臺(tái)源碼,全部源碼陸續(xù)發(fā)布。當(dāng)有大量的類(lèi)文件要包含的時(shí)候,我們只要確定相應(yīng)的規(guī)則,然后在__autoload()函數(shù)中,將類(lèi)名與實(shí)際的磁盤(pán)文件對(duì)應(yīng)起來(lái),就可以實(shí)現(xiàn)lazy loading的效果。從這里我們也可以看出__autoload()函數(shù)的實(shí)現(xiàn)中最重要的是類(lèi)名與實(shí)際的磁盤(pán)文件映射規(guī)則的實(shí)現(xiàn)。?
但現(xiàn)在問(wèn)題來(lái)了,假如在一個(gè)系統(tǒng)的實(shí)現(xiàn)中,假如需要使用很多其它的類(lèi)庫(kù),這些類(lèi)庫(kù)可能是由不同的開(kāi)發(fā)工程師開(kāi)發(fā),其類(lèi)名與實(shí)際的磁盤(pán)文件的映射規(guī)則不盡相同。這時(shí)假如要實(shí)現(xiàn)類(lèi)庫(kù)文件的自動(dòng)加載,就必須在__autoload()函數(shù)中將所有的映射規(guī)則全部實(shí)現(xiàn),因此__autoload()函數(shù)有可能會(huì)非常復(fù)雜,甚至無(wú)法實(shí)現(xiàn)。最后可能會(huì)導(dǎo)致__autoload()函數(shù)十分臃腫,這時(shí)即便能夠?qū)崿F(xiàn),也會(huì)給將來(lái)的維護(hù)和系統(tǒng)效率帶來(lái)很大的負(fù)面影響。在這種情況下,在php5引入spl標(biāo)準(zhǔn)庫(kù),一種新的解決方案,即spl_autoload_register()函數(shù)。
2、spl_autoload_register()函數(shù)
此函數(shù)的功能就是把函數(shù)注冊(cè)至SPL的__autoload函數(shù)棧中,并移除系統(tǒng)默認(rèn)的__autoload()函數(shù)。下面的例子可以看出:
[cpp] view plaincopyprint?
function __autoload($class_name) { echo '__autload class:', $class_name, '<br />'; } function classLoader($class_name) { echo 'SPL load class:', $class_name, '<br />'; } spl_autoload_register('classLoader'); new Test();//結(jié)果:SPL load class:Test
語(yǔ)法:bool??spl_autoload_register?( [callback $autoload_function] )??? 接受兩個(gè)參數(shù):一個(gè)是添加到自動(dòng)加載棧的函數(shù),另外一個(gè)是加載器不能找到這個(gè)類(lèi)時(shí)是否拋出異常的標(biāo)志。第一個(gè)參數(shù)是可選的,并且默認(rèn)指向spl_autoload()函數(shù),這個(gè)函數(shù)會(huì)自動(dòng)在路徑中查找具有小寫(xiě)類(lèi)名和.php擴(kuò)展或者.ini擴(kuò)展名,或者任何注冊(cè)到spl_autoload_extensions()函數(shù)中的其它擴(kuò)展名的文件。
[php] view plaincopyprint?
<?php class CalssLoader { public static function loader($classname) { $class_file = strtolower($classname).".php"; if (file_exists($class_file)){ require_once($class_file); } } } // 方法為靜態(tài)方法 spl_autoload_register('CalssLoader::loader'); $test = new Test();
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
[php] view plaincopyprint?
if(false === spl_autoload_functions()){ if(function_exists('__autoload')){ spl_autoload_registe('__autoload',false); } }
spl_autoload_functions()函數(shù)會(huì)返回已注冊(cè)函數(shù)的一個(gè)數(shù)組,如果SPL自動(dòng)加載棧還沒(méi)有被初始化,它會(huì)返回布爾值false。然后,檢查是否有一個(gè)名為_(kāi)_autoload()的函數(shù)存在,如果存在,可以將它注冊(cè)為自動(dòng)加載棧中的第一個(gè)函數(shù),從而保留它的功能。之后,可以繼續(xù)注冊(cè)自動(dòng)加載函數(shù)。
還可以調(diào)用spl_autoload_register()函數(shù)以注冊(cè)一個(gè)回調(diào)函數(shù),而不是為函數(shù)提供一個(gè)字符串名稱。如提供一個(gè)如array('class','method')這樣的數(shù)組,使得可以使用某個(gè)對(duì)象的方法。
下一步,通過(guò)調(diào)用spl_autoload_call('className')函數(shù),可以手動(dòng)調(diào)用加載器,而不用嘗試去使用那個(gè)類(lèi)。這個(gè)函數(shù)可以和函數(shù)class_exists('className',false)組合在一起使用以嘗試去加載一個(gè)類(lèi),并且在所有的自動(dòng)加載器都不能找到那個(gè)類(lèi)的情況下失敗。
[php] view plaincopyprint?
f(spl_autoload_call('className') && class_exists('className',false)){ } else { }
??
以上就介紹了摜蛋游戲WEB版——PHP后臺(tái)實(shí)現(xiàn)源碼,包括了方面的內(nèi)容,希望對(duì)PHP教程有興趣的朋友有所幫助。
PHP怎么學(xué)習(xí)?PHP怎么入門(mén)?PHP在哪學(xué)?PHP怎么學(xué)才快?不用擔(dān)心,這里為大家提供了PHP速學(xué)教程(入門(mén)到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)