php的類裝載的步驟,設計PHP自動類裝載功能

在使用面向對象方法做PHP開發時,可能會經常使用到各個路徑中的類文件,這就需要大量的 include 或 require,而 PHP 提供了一個比較快捷的方式,就是利用函數 __autoload 可以編程實現動態的類裝載功能,這樣就不需要手動的編寫大量include 或 require,好了,下面切入正題。

設計思路:如果想實現自動類裝載功能,就必須使用 PHP 提供的 __autoload 函數,該函數只有一個參數,即我們在程序編寫時所涉及到的類名稱,當函數被調用時,我們要做的就是利用傳入的類名加載這個類所在的文件。

第一個問題就是,我們如何得知類屬于哪個文件名呢?在做 Java 或 .Net 程序時,整個運行的程序會根據類名在內存中查找對應的類型信息(常常會伴隨著命名空間作為限定),內存的類型信息來自于應用程序初始化時的類文件裝載,這點與 PHP 是有區別的,PHP 程序不會裝載所有內容,它只是在代碼運行到某處需要裝載必要的文件時才會發出裝載請求。暫時拋棄何時裝載這個問題,再次回到裝載類文件,不管是 .Net 還是 Java,它們在裝載類型信息的時候,都是類名查找類型信息的,從這點看來 __autoload 采用的也是相同的方法,但是 PHP 在定義類時并不要求文件名與類名保持一致,這就有可能造成文件與類雜亂無章,給類裝載實現帶來麻煩,所以有必要人為的規定類定義與其所在的文件需要采用相同的名稱,或者兩者之間按照某種規則可以互相映射,這樣就很容易。

第二個問題,類所在的文件名已經可以確定,但是這個文件是屬于哪個目錄呢?Java 可以根據包名來進行查找,.Net 有命名空間,雖然新版本的 PHP 引入了命名空間的概念,但是既存的服務器也許會因為多種原因不能為每個客戶提供最新的環境,所以還是得從 PHP 本身下手比較實用。雖然沒有命名空間,但是可以借鑒操作系統的環境變量概念,將不同的路徑名放入環境變量中,這樣就可以從環境變量中讀取各個目錄,然后找到目標類所在的文件。

一、類名與文件名映射

這一步要做的就是定義文件名與類名映射規則,類名采用駝峰命名法,即類名的每個單詞首字母需大寫,而文件的命名則采用全部單詞小寫,單詞之間以下劃線分割,后綴名為 .class.php 。

二、在環境變量中進行路徑遍歷

仿照 UNIX 或 Windows 的環境變量的定義方式,將多個文件夾以分號或冒號分隔,羅列在 CLASSPATH 中。當程序讀取時,可以將文件夾路徑放入數組中。

三、開始裝載

調用函數 require 或 include 并利用組合好的文件路徑進行文件裝載,但是有兩處需要注意,首先需要判斷組合好的路徑是否有效,其次,文件成功裝載后,為了效率問題,可以馬上退出 __autoload 函數。

define(CLASSPATH, dirname(__FILE__).'/entity'.':'.dirname(__FILE__).'/meta');function __autoload($classname) {

$filename = strtolower(preg_replace('/(?<=/B)([A-Z])/s', '_$1', $classname)) . ".class.php";

foreach (preg_split('/:/',CLASSPATH) as $cp) {

if (file_exists("$cp/$filename")) {

require_once ("$cp/$filename");

break;

}

}

}

四、啟用自動類裝載功能

主動式:將該函數直接或間接包含在當前文件中,之后無論在文件何處編寫代碼,類文件都可以自動裝載。

被動式:將該函數直接或間接包含在當前文件中,以當前文件為主控制程序,然后調用其它業務實現,這樣在其他業務實現文件中就無需考慮類裝載的問題了。

501e70f9505b3b440080bc4e17c4785e.png

在圖中采用的是主動式,question_parser.php 通過創建 meta 中存放的類,這些類又調用 entity 中的內容,這個過程僅僅在 question_parser.php 包含了定義 __autoload 的 question_sysext.php,關系圖如下:

question_parser.php -> question_sysext.php

||

//

meta* => entity*

五、擴展思考

如果文件名與類名無任何關聯性的話,可以裝載 CLASSPATH 中定義的文件夾中所有 *.php 文件或是像例子那樣裝載 *.class.php 。

緩存類裝載,當成功裝載一個類所在的文件后,可以將類名與文件名記錄下來以便下次使用,這樣就無需每次都進行循環遍歷,在某些情況下可以節省查找時間。

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

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

相關文章

python 重定向 ctf_3.CTF——python利用工具

web AWD 攻與防CTF線下賽主要考察代碼審計能力及運維能力&#xff0c;代碼審計發現漏洞&#xff0c;python寫利用漏洞&#xff0c;運維發現可疑攻擊目標&#xff0c;異常流量&#xff0c;異常權限&#xff0c;重要業務備份與還原。用運維的知識加固系統與業務。當被人攻擊以后&…

網站首頁幻燈片

Js頁面: View Code /** * 大眼睛廣告輪播 */ var indexEye {autoTime: 0,init: function () {var eyeObj $("#dyj_pics a:eq(0) img:eq(0)");eyeObj.attr("src", eyeObj.attr("data-imgSrc"));eyeObj.load(function () {indexEye.autoTime se…

【java】錯誤 找不到或無法加載主類

很詭異&#xff0c;class文件夾下的class文件沒有了&#xff0c;刪除文件夾 &#xff0c;重新編譯下。。。轉載于:https://www.cnblogs.com/merlini/p/3892719.html

Qt之QAbstractItemView視圖項拖拽(二)

一、需求說明 上一篇文章Qt之QAbstractItemView視圖項拖拽(一)講述了實現QAbstractItemView視圖項拖拽的一種方式&#xff0c;是基于QDrag實現的&#xff0c;這個類是qt自己封裝好了的&#xff0c;所以可定制性也就沒有了那么強&#xff0c;最明顯的是&#xff0c;這個類在執…

電腦控制蘋果手機_必備神器,電腦控制手機

序一款電腦端的神器&#xff0c;它可以任意的操縱你的手機。****QtScrcpy可以通過USB(或通過TCP/IP)連接Android設備&#xff0c;并進行顯示和控制。不需要root權限。單個應用程序最多支持16個安卓設備同時連接。同時支持GNU/Linux&#xff0c;Windows和MacOS三大主流桌面平臺。…

php未定義要怎樣做,php-Behat-未定義的功能步驟

我設置了一個簡單的測試場景來學習behat,但是我遇到了一些問題.我正在關注THIS教程.這是我的專題節目&#xff1a;Feature: showThis is a behat feature to test the article pages.##TODOScenario: I want to view a detailed article pageGiven I am logged inAnd Im on &qu…

CentOS 命令大全 (轉)

1、查看系統使用端口并釋放端口 [rootmy_nn_01 WEB-INF]# lsof -w -n -i tcp:80 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 24065 root 34u IPv6 269149 TCP *:http (LISTEN) [rootmy_nn_01 WEB-INF]# kill -9 24065 2、以KB/MB形式顯示文件列表…

微信接口改良

之前公司微信開發的時候 寫了個微信的接口改良版,當然好多想改進的都沒改。。大概是太懶了 &#xff08;囧 /*** Created by DFH on 13-12-16.*//*--htmlvar shareData {//分享展示圖片地址 **必須"imgUrl": "a.jpg",//分享至朋友圈鏈接 **必須&q…

生活大爆炸版石頭剪刀布

題目描述 Description石頭剪刀布是常見的猜拳游戲&#xff1a;石頭勝剪刀&#xff0c;剪刀勝布&#xff0c;布勝石頭。如果兩個人出拳一樣&#xff0c;則不分勝負。在《生活大爆炸》第二季第8集中出現了一種石頭剪刀布的升級版游戲。升級版游戲在傳統的石頭剪刀布游戲的基礎上&…

oracle18c卸載方法,在debian 10上安裝和卸載oracle數據庫快捷版18c第4版

安裝oracle-xe-18c的步驟此安裝向導依賴軟件包alien。由于oracle并未提供oracle-xe-18c的deb包&#xff0c;故需要通過alien命令將oracle-xe-18c的rpm格式的安裝包導出新的deb格式的安裝包&#xff1a;sudo alien --scripts -d oracle-database-xe-18c-1.0-1.x86_64.rpm相應rpm…

解決:缺少aclocal、autoconf、automake

下載三個包&#xff1a;autoconf-2.68.tar.bz2、automake-1.11.1.tar.bz2、m4-1.4.14.tar.bz2 1、su - root 2、tar xjf XXXXX.tar.bz2 3、cd m4/ 4、./configure make make install 5、cd autoconf/ 6、./configure make make install 7、cd automake/ 8、./configure…

jquery事件 on(),live(),delegate(),blind()

jQuery推出on()的目的有2個&#xff0c;一是為了統一接口&#xff0c;二是為了提高性能&#xff0c; 所以從現在開始用on()替換bind(), live(), delegate吧。 尤其是不要再用live()了&#xff0c;因為它已經處于不推薦使用列表了[1.7已經被刪除]。 如果只綁定一次事件&#xff…

Swift 開發的工具類,主要是提供正則表達式及其它,Github會長期維護

直接訪問 GitHub 看代碼 YYGRegular 我是&#xff1a; 語歌復制代碼It is a regular expression used on iOS, which implement by Swift 這是一個基于swift快捷開發的擴展類&#xff0c;目前的涵蓋內容包括詳細打印&#xff0c;正則表達式&#xff0c;會經常維護 介于是增加更…

用python慶祝生日_生日到底該過陰歷還是陽歷好呢?不是迷信,都怪我們大意!...

過生日到底該過陰歷還是陽歷&#xff1f;答案說出來你可能都不信在我們國家&#xff0c;過生日有兩種不同的方式&#xff0c;因為有兩種不同的日子的計算方式&#xff0c;分為陰歷和陽歷。一般來說&#xff0c;在農村和一些比較落后的地方&#xff0c;人們習慣于用陰歷來計算生…

websphere jndi oracle,websphere7.0獲得JNDI連接報invalid username/password

Exception in thread "P497968:O0:CT" java.sql.SQLException: ORA-01017: invalid username/password; logon deniedDSRA0010E: SQL 狀態&#xff1a;72000&#xff0c;錯誤碼&#xff1a;1,017at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapp…

WSS3.0自帶數據庫可以使用SQL 2005 Server Management Studio來管理

默認情況下&#xff0c;安裝完WSS3.0后&#xff0c;會自動安裝一個自帶的SQL Server 2005 Embedded Edition數據庫&#xff0c;但是此數據庫卻沒有管理工具,不像安裝SQL 2005其它版本會有管理工具。如果你要管理數據庫&#xff0c;這時怎么辦呢。經過俺試了一上午了&#xff0c…

CPU的高速緩存存儲器知識整理

基于緩存的存儲器層次結構 基于緩存的存儲器層次結構行之有效&#xff0c;是因為較慢的存儲設備比較快的存儲設備更便宜&#xff0c;還因為程序往往展示局部性&#xff1a; 時間局部性&#xff1a;被引用過一次的存儲器的位置很可能在不遠的將來被再次引用。 空間局部性&#x…

uniapp光標自動定義到文本框_word技巧自動生成畢業論文目錄

一篇word文檔&#xff0c;內容有大的章&#xff0c;小的節。如何把章節抽出來生成目錄&#xff1f;WORD →點擊需要插入的地方 → 插入菜單 → 索引和目錄 → 目錄 → 確定。1 創建標題目錄Word 一般是利用標題或者大綱級別來創建目錄的。因此&#xff0c;在創建目錄之前&#…

JSTL

2019獨角獸企業重金招聘Python工程師標準>>> 說明 JSTL 是 JAVA 中的一個定制標記庫集。實現了JSP頁面中代碼的復用&#xff0c;增加了JSP頁面的可讀性&#xff0c;方便查看和參與開發 使用 1.下載地址 http://archive.apache.org/dist/jakarta/taglibs/standard/bi…

[jQuery] event.stopPropagation()報錯

使用jQuery給一個事件加處理方法時&#xff0c;為了阻止一個事件向上冒泡&#xff0c;使用了event.stopPropagation()&#xff0c;但在IE下卻報對象不支持此屬性或方法的錯誤&#xff08;IE下是event. cancelBubbletrue&#xff09;&#xff0c;jQuery不是兼容各瀏覽器嗎&#…