国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

詳解PHP文件的自動加載(autoloading)

2024-05-05 00:02:13
字體:
來源:轉載
供稿:網友

傳統上,在PHP里,當我們要用到一個class文件的時候,我們都得在文檔頭部require或者include一下:

<?phprequire_once('../includes/functions.php');require_once('../includes/database.php');require_once('../includes/user.php');...

但是一旦要調用的文檔多了,就得每次都寫一行,瞅著也不美觀,有什么辦法能讓PHP文檔自動加載呢?

<?phpfunction __autoload($class_name){  require "./{$class_name}.php";}

對,可以使用PHP的魔法函數__autoload(),上面的示例就是自動加載當前目錄下的PHP文件。當然,實際當中,我們更可能會這么來使用:

<?phpfunction __autoload($class_name){  $name = strtolower($class_name);  $path = "../includes/{$name}.php";    if(file_exists($path)){     require_once($path);    }else{      die("the file {$class_name} could not be found");    }}

也即是做了一定的文件名大小寫處理,然后在require之前檢查文件是否存在,不存在的話顯示自定義的信息。

類似用法經常在私人項目,或者說是單一項目的框架中見到,為什么呢?因為你只能定義一個__autoload function,在多人開發中,做不到不同的developer使用不同的自定義的autoloader,除非大家都提前說好了,都使用一個__autoload,涉及到改動了就進行版本同步,這很麻煩。

也主要是因為此,有個好消息,就是這個__autoload函數馬上要在7.2版本的PHP中棄用了。

Warning This feature has been DEPRECATED as of PHP 7.2.0. Relying on this feature is highly discouraged.
那么取而代之的是一個叫spl_autoload_register()的東東,它的好處是可以自定義多個autoloader.

//使用匿名函數來autoloadspl_autoload_register(function($class_name){  require_once('...');});
//使用一個全局函數function Custom(){  require_once('...');}spl_autoload_register('Custom');
//使用一個class當中的static方法class MyCustomAutoloader{  static public function myLoader($class_name)  {    require_once('...');      }}//傳array進來,第一個是class名,第二個是方法名spl_autoload_register(['MyCustomAutoloader','myLoader']);  
//甚至也可以用在實例化的object上class MyCustomAutoloader{  public function myLoader($class_name)  {  }}$object = new MyCustomAutoloader;spl_autoload_register([$object,'myLoader']); 

值得一提的是,使用autoload,無論是__autoload(),還是spl_autoload_register(),相比于require或include,好處就是autoload機制是lazy loading,也即是并不是你一運行就給你調用所有的那些文件,而是只有你用到了哪個,比如說new了哪個文件以后,才會通過autoload機制去加載相應文件。

當然,laravel包括各個package里也是經常用到spl_autoload_register,比如這里:

/** * Prepend the load method to the auto-loader stack. * * @return void */protected function prependToLoaderStack(){  spl_autoload_register([$this, 'load'], true, true);}


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 昌都县| 望都县| 静海县| 东台市| 海安县| 清水河县| 文成县| 阜城县| 万山特区| 盘山县| 孟津县| 道真| 河南省| 新河县| 大邑县| 富平县| 略阳县| 普安县| 天峻县| 康定县| 长沙县| 康保县| 富锦市| 体育| 岗巴县| 阿城市| 皋兰县| 交口县| 开封市| 响水县| 临西县| 万荣县| 博野县| 河源市| 遂溪县| 宁国市| 德庆县| 广安市| 关岭| 永昌县| 平昌县|