php自動加載機制的實現

一、什么是自動加載

自動加載就是當我們在當前文件中實例化一個不存在的類時,調用自動加載機制引入相應的類文件。

注:自動加載有兩種方式(都是php內置的),一種是通過__autoload(),另一種是通過spl_autoload_register()。

以下兩種方式的介紹中,都是執行test3.php文件。

?

?

二、通過__autoload() 實現自動加載

/data/www/test2/test2.php

<?phpclass test2
{function aa(){echo 'this is function aa';echo "<br><br>";}static function bb(){echo 'this is function bb';echo "<br><br>";}
}

/data/www/test3.php

<?php//加載過程
//1、實例化test2類,由于當前文件不存在test2類,所以會自動執行__autoload()方法,并自動將類名傳過去
//2、執行完__autoload()方法之后,會加載test2/test2.php文件
//3、由于當前文件已經通過__autoload()方式require進文件test2.php了,所以也就可以調用test2.php中的方法了$test = new test2();
$test->aa();//調用aa方法
test2::bb();//調用bb靜態類方法function __autoload($class)
{echo '當前自動加載的類名為'.$class."<br><br>";//此時,$class的值就是test2include_once __DIR__.'/test2/'.$class.'.php';//相當于加載了test2/test2.php
}

?

?

三、通過spl_autoload_register()實現自動加載【推薦的方式】

注:由于__autoload()自動加載方式已經逐漸被php官方廢棄了,所以這里采用另一種方式spl_autoload_register來實現。

這里,test2.php文件和上面一樣,只改變test3.php文件。

?

/data/www/test3.php

<?php//加載過程
//1、實例化test2類時,由于當前文件并沒有test2類,所以php會自動調用spl_autoload_register自動加載機制
//2、調用spl_autoload_register,就會調用我們自己定義的autoload_test()方法
//3、進而引入了相應的test2.php類文件
//4、引入了相應的類文件之后,自然也就可以實例化類,并調用相應的方法了spl_autoload_register(autoload_test);$test = new test2();
$test->aa();//調用aa方法
test2::bb();//調用bb靜態類方法/*** 用于實現自動加載* @param $class*/
function autoload_test($class)
{echo '當前自動加載的類名為'.$class."<br><br>";//此時,$class的值就是test2include_once __DIR__.'/test2/'.$class.'.php';//相當于加載了test2/test2.php
}

?

?

四、總結

spl_autoload_register()相比于__autoload()的優點在于:

(1)可以按需多次寫spl_autoload_register注冊加載函數,加載順序按誰先注冊誰先調用。__aotuload由于是全局函數只能定義一次,不夠靈活。

比如下面,由于需要同時加載test2.php 以及 test4.class.php,__autoload就實現不了這個需求,而使用spl_autoload_register來實現就比較合適。

test4.class.php

<?phpclass test4
{function dd(){echo "this is test4 function dd";}}

?test3.php

<?php//加載過程
//1、實例化test2類時,由于當前文件并沒有test2類,所以php會自動調用spl_autoload_register自動加載機制
//2、調用spl_autoload_register,就會調用我們自己定義的autoload_test()方法
//3、進而引入了相應的test2.php類文件
//4、之后又實例化了test4類,test4類在當前文件同樣沒有,這時php會自動調用spl_autoload_register自動加載機制
//4.1 首先調用第一個注冊自動加載函數spl_autoload_register(autoload_test),加載之后沒有找到test4類
//4.2 所以php會繼續調用第二個自動注冊函數spl_autoload_register(autoload_test4)
//4.3 這時,終于找到test4類了,也就不用繼續在往下找了
//5、引入了相應的類文件之后,自然也就可以實例化類,并調用相應的方法了spl_autoload_register(autoload_test);
spl_autoload_register(autoload_test4);$test = new test2();
$test->aa();//調用aa方法
test2::bb();//調用bb靜態類方法$test4 = new test4();
$test4->dd();/*** 用于實現自動加載* @param $class*/
function autoload_test($class)
{echo '當前自動加載的類名為'.$class."<br><br>";//此時,$class的值就是test2include_once __DIR__.'/test2/'.$class.'.php';//相當于加載了test2/test2.php
}function autoload_test4($class)
{echo '當前自動加載的類名為'.$class."<br><br>";//此時,$class的值就是test4include_once __DIR__.'/'.$class.'.class.php';//相當于加載了test4.class.php
}

(2)spl_autoload_register()可以被catch到錯誤,而__aotuload不能。

(3)spl_autoload_register注冊的加載函數可以按需被spl_autoload_unregister掉

?

還有,值得注意的是,如果對類文件加入了命名空間,就必須保證正確的加載了類文件的同時,還要通過use引入對應的命名空間。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282196.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL之 從復制延遲問題排查

一、從庫復制延遲問題 1、可能的原因如下&#xff08;1&#xff09;主從服務器處于不同的網絡之中&#xff0c;由于網絡延遲導致&#xff1b;&#xff08;2&#xff09;主從服務器的硬件配置不同&#xff0c;從服務器的硬件配置&#xff08;包括內存&#xff0c;CPU&#xff0c…

《樹莓派滲透測試實戰》——2.12 用例子總結以上步驟

本節書摘來異步社區《樹莓派滲透測試實戰》一書中的第2章&#xff0c;第2.12節&#xff0c;作者【美】Joseph Muniz&#xff08;約瑟夫 穆尼斯&#xff09; , Aamir Lakhani&#xff08;阿米爾 拉克哈尼&#xff09;&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號…

申請成為qq互聯個人開發者步驟(注意事項)2018

一、官方網址 官方地址&#xff1a;https://connect.qq.com/manage.html#/ 二、申請時注意事項&#xff1a; 1、申請時的名稱欄必須填寫身份證上的姓名&#xff0c;否則是不給通過的 2、上傳照片時&#xff0c;需要本人手持身份證&#xff0c;重點是照片中身份證上頭像的位置要…

《Swift開發實戰》——第1章,第1.4節啟動iOS 8模擬器

本節書摘來自異步社區《Swift開發實戰》一書中的第1章&#xff0c;第1.4節啟動iOS 8模擬器&#xff0c;作者 李寧&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.4 啟動iOS 8模擬器Xcode是一款功能全面的應用程序&#xff0c;通過此工具可以輕松輸入、編譯…

基于.NetCore開發博客項目 StarBlog - (18) 實現本地Typora文章打包上傳

1前言九月太忙&#xff0c;只更新了三篇文章&#xff0c;本來這個功能是從九月初就開始做的&#xff0c;結果一直拖到現在國慶假期才有時間完善并且寫文章~之前我更新了幾篇關于 Python 的文章&#xff0c;有朋友留言問是不是不更新 .Net 了&#xff0c;那肯定不能啊&#xff0…

《算法導論》讀書筆記--第1、2章課后題 (轉)

第一章 轉自http://www.cnblogs.com/batteryhp/p/4654860.html 思考題 1-1&#xff08;運行時間的比較&#xff09;確定時間t內求解的問題的最大規模。 上面是網上提供的答案。 注意點&#xff1a; 1、最左邊一列的是關于n的增長情況描述&#xff0c;值得記住的是這些增長的排…

PHP開發自己的框架必備知識點

一、PHP常用的四種數據結構 簡介&#xff1a;spl是php的一個標準庫。 官方文檔&#xff1a;http://php.net/manual/zh/book.spl.php <?php//spl&#xff08;php標準庫&#xff09;數據結構/*** 棧&#xff08;先進后出&#xff09;*/ $stack new SplStack(); $stack-&g…

Linux 環境下 jdk1.8 maven3.2.3 Git2.8.0 安裝腳本

2019獨角獸企業重金招聘Python工程師標準>>> # Author: peizhouyu # Date: 2018-09-07 14:24:11 # Last Modified by: peizhouyu # Last Modified time: 2018-09-07 16:02:58#!/bin/bash SOFT_PATH/opt/softif [ ! -d $SOFT_PATH ];then mkdir $SOFT_PATH else …

《嵌入式設備驅動開發精解》——導讀

前言 嵌入式設備驅動開發精解本書的編寫主要是針對從事嵌入式軟件開發人員。本書的內容主要涵蓋ARM CPU以及各種常用外部設備驅動開發的方方面面&#xff0c;包括各種硬件接口、硬件接口協議說明以及各種外設的使用及調試方法&#xff0c;特別是對于開發調試過程中可能遇到的各…

C# WPF通過WindowChrome自定義窗體

概述在WPF界面開發中&#xff0c;系統默認的窗口比較丑&#xff0c;有時候想自定義窗體&#xff0c;比如微信的客戶端窗口這樣&#xff1a;使得左邊的一塊頂到最上端&#xff0c;如下圖所示&#xff1a;這時候我們可以 WindowStyle"None"&#xff0c;AllowsTranspare…

【轉載】遞推公式的特征方程及通項公式

先貼上鏈接&#xff1a;http://blog.csdn.net/happykocola/article/details/73933314 因為最近在復習初賽&#xff0c;然后碰到了這道題&#xff0c;并不會做&#xff0c;才發現有這么高明的方法... 已知遞推關系式&#xff1a; f(n)5f(n-1)-6f(n-2) (n>1) f(0)1 f(1)…

【leetcode】75. Sort Colors

題目如下&#xff1a; 解題思路&#xff1a;我的解題思路是遍歷數組&#xff0c;遇到0刪除該元素并插入到數組頭部&#xff0c;遇到1則不處理&#xff0c;遇到2刪除該元素并插入到數組尾部。 代碼如下&#xff1a; class Solution(object):def sortColors(self, nums):"&q…

每日一言學做人,古之學問,博大精深

前言&#xff1a; 要成為一個有格局&#xff0c;有修養的人&#xff0c;吸納一些有道理的思想和做法&#xff0c;去逐漸提高自己是非常有必要的&#xff0c;有一言&#xff0c;做事先做人&#xff0c;意即于此。因此&#xff0c;每日將自己看到的一段有感的話記錄下來&#xf…

Seal-Report: 開放式數據庫報表工具

Seal Report是.Net的一個基于Apache 2.0 開源工具&#xff0c;完全用C# 語言編寫&#xff0c;最新的6.6 版本采用.NET 6&#xff0c;github: https://github.com/ariacom/Seal-Report。Seal Report提供了一個完整的框架&#xff0c;用于從任何數據庫或任何非SQL源生成每日報告。…

《Ceph源碼分析》——第2章,第2節Buffer

本節書摘來自華章出版社《Ceph源碼分析》一書中的第2章&#xff0c;第2.2節Buffer&#xff0c;作者常濤&#xff0c;更多章節內容可以訪問云棲社區“華章計算機”公眾號查看 2.2 BufferBuffer就是一個命名空間&#xff0c;在這個命名空間下定義了Buffer相關的數據結構, 這些數…

eclipse在server中tomcat server找不到的問題

想要在eclipse的server新建tomcat服務器然而不知道怎么回事找不到Tomcat 7.0 Server 下面的紅圈是tomcat server服務器&#xff08;更新后才出現&#xff09; 網上找的很久&#xff0c;只是找到在eclipse中安裝tomcat插件的方法 Tomcat免安裝版的環境變量配置以及Eclipse下的To…

Sysbench 1.0.15安裝及使用

Sysbench是一款開源的多線程性能測試工具&#xff0c;可以執行CPU/內存/線程/IO/數據庫等方面的性能測試&#xff0c;數據庫目前支持MySQL/Oracle/PostgreSQL。 一、安裝&#xff1a; Github地址&#xff1a;https://github.com/akopytov/sysbench RHEL/CentOS&#xff1a; cur…

PHP根據指定url生成二維碼圖片

一、composer安裝 http://packagist.p2hp.com/packages/codeitnowin/barcode 二、使用 調用generateQrCode()方法即可實現生成二維碼圖片并輸出下載給用戶 <?php namespace manage\Test;use CodeItNow\BarcodeBundle\Utils\QrCode; use common\extensions\Helper; use y…

CA 周記 - 派福利!通過 Azure 零成本進入 CUDA 編程

我們在配置深度學習環境的時候&#xff0c;除了安裝各種庫和框架外&#xff0c;如果需要 GPU 加速&#xff0c;還需要配置 CUDA 。那 CUDA 是什么 &#xff1f;它的作用是什么 &#xff1f;CUDA 編程介紹01什么是 CUDA&#xff1f;CUDA (Compute Unified Device Architecture) …

《視圖更新與關系數據庫理論》——2.1 關系和關系變量

本節書摘來自異步社區出版社《視圖更新與關系數據庫理論》一書中的第2章&#xff0c;第2.1節&#xff0c;作者&#xff1a;【美】C.J. Date&#xff08;達特&#xff09;&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.1 關系和關系變量 每一個關系都有一…