摘要:看到一篇不錯的博文,轉(zhuǎn)載過來,可以通過這個自動加載函數(shù)來理解的類自動加載原理。在了解這個函數(shù)之前先來看另一個函數(shù)。調(diào)用靜態(tài)方法另一種寫法小結(jié)實(shí)例化時會被自動觸發(fā)該函數(shù),如果沒有執(zhí)行的對象時,就會執(zhí)行該方法。
看到一篇不錯的博文,轉(zhuǎn)載過來,可以通過這個自動加載函數(shù)spl_autoload_register()來理解PHP的類自動加載原理。
在了解這個函數(shù)之前先來看另一個函數(shù):__autoload。
一、__autoload這是一個自動加載函數(shù),在PHP5中,當(dāng)我們實(shí)例化一個未定義的類時,就會觸發(fā)此函數(shù)??聪旅胬樱?/p>
printit.class.php index.php function __autoload( $class ) { $file = $class . ".class.php"; if ( is_file($file) ) { require_once($file); } } $obj = new PRINTIT(); $obj->doPrint(); ?>
運(yùn)行index.php后正常輸出hello world。在index.php中,由于沒有包含printit.class.php,在實(shí)例化printit時,自動調(diào)用__autoload函數(shù),參數(shù)$class的值即為類名printit,此時printit.class.php就被引進(jìn)來了。
二、spl_autoload_register()在面向?qū)ο笾羞@種方法經(jīng)常使用,可以避免書寫過多的引用文件,同時也使整個系統(tǒng)更加靈活。
再看 spl_autoload_register(),這個函數(shù)與__autoload有與曲同工之妙,看個簡單的例子:
function loadprint( $class ) { $file = $class . ".class.php"; if (is_file($file)) { require_once($file); } } spl_autoload_register( "loadprint" ); $obj = new PRINTIT(); $obj->doPrint(); ?>
將__autoload換成loadprint函數(shù)。但是loadprint不會像__autoload自動觸發(fā),這時spl_autoload_register()就起作用了,它告訴PHP碰到?jīng)]有定義的類就執(zhí)行l(wèi)oadprint()。
spl_autoload_register() 調(diào)用靜態(tài)方法
class test { public static function loadprint( $class ) { $file = $class . ".class.php"; if (is_file($file)) { require_once($file); } } } spl_autoload_register( array("test","loadprint") ); //另一種寫法:spl_autoload_register( "test::loadprint" ); $obj = new PRINTIT(); $obj->doPrint(); ?>
小結(jié):實(shí)例化時__autoload會被自動觸發(fā)該函數(shù), 如果沒有執(zhí)行的對象時,就會執(zhí)行spl_autoload_register該方法。
三、composer類自動加載研究vendor/autoload.php
autoload_real.php
= 50600 && !defined("HHVM_VERSION") && (!function_exists("zend_loader_file_encoded") || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . "/autoload_static.php"; call_user_func(ComposerAutoloadComposerStaticInit83cb48187cf44a304a7a6be5e700ede3::getInitializer($loader)); } else { $map = require __DIR__ . "/autoload_namespaces.php"; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . "/autoload_psr4.php"; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . "/autoload_classmap.php"; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); return $loader; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30586.html
摘要:在了解這個函數(shù)之前先來看另一個函數(shù)。一這是一個自動加載函數(shù),在中,當(dāng)我們實(shí)例化一個未定義的類時,就會觸發(fā)此函數(shù)。在中,由于沒有包含,在實(shí)例化時,自動調(diào)用函數(shù),參數(shù)的值即為類名,此時就被引進(jìn)來了。 在了解這個函數(shù)之前先來看另一個函數(shù):__autoload。 一、__autoload 這是一個自動加載函數(shù),在PHP5中,當(dāng)我們實(shí)例化一個未定義的類時,就會觸發(fā)此函數(shù)。看下面例子: pr...
摘要:但現(xiàn)在問題來了,如果在一個系統(tǒng)的實(shí)現(xiàn)中,如果需要使用很多其它的類庫,這些類庫可能是由不同的開發(fā)人員編寫的,其類名與實(shí)際的磁盤文件的映射規(guī)則不盡相同。 PHP在魔術(shù)函數(shù)__autoload()方法出現(xiàn)以前,如果你要在一個程序文件中實(shí)例化100個對象,那么你必須用include或者require包含進(jìn)來100個類文件,或者你把這100個類定義在同一個類文件中——相信這個文件一定會非常大。但...
摘要:本文將會介紹自起,直至中增加的新特征。棄用的功能以下幾個功能被棄用,若在配置文件中啟用,則會在運(yùn)行時發(fā)出警告。該類的完整限定名是其中第一個反斜杠表示全局命名空間。目的在于模仿的不對,目的是為了讓發(fā)布應(yīng)用程序更加方便。 截至目前(2014.2), PHP 的最新穩(wěn)定版本是 PHP5.5, 但有差不多一半的用戶仍在使用已經(jīng)不在維護(hù) [注] 的 PHP5.2, 其余的一半用戶在使用 PHP5...
摘要:索性讀一下它的源碼。行載入類載入類,這個類比較重要,實(shí)現(xiàn)了自動加載。注冊錯誤和異常處理機(jī)制加載慣例配置文件接下來我們看一下自動加載的實(shí)現(xiàn)方法。所以借助此函數(shù)可以達(dá)到自動加載。博客鏈接解讀源碼一自動加載 聽說 TP5 已經(jīng) RC4 了,曾經(jīng)在 RC3 的時候用它寫過一個小東西。官方說從 RC4 以后改動不是太大。索性讀一下它的源碼。然后順便記錄一下,如有錯漏,請路過大神多多指正! 入口 ...
閱讀 745·2021-11-11 16:54
閱讀 3066·2021-09-26 09:55
閱讀 2016·2021-09-07 10:20
閱讀 1211·2019-08-30 10:58
閱讀 1057·2019-08-28 18:04
閱讀 708·2019-08-26 13:57
閱讀 3598·2019-08-26 13:45
閱讀 1164·2019-08-26 11:42