PHP 實(shí)例化類(lèi)的一點(diǎn)摘記
下面是調(diào)用一個(gè)模型(Module)的函數(shù)。這個(gè)函數(shù)的基本功能是指定一個(gè)模型(抽象化為類(lèi))的名稱(chēng),然后它會(huì)在模型目錄下面尋找這個(gè)類(lèi)的腳本實(shí)例化以后返回。這樣的做法有一點(diǎn)好處就是載入和實(shí)例化是自動(dòng)的,你可以獲得最大的靈活性。下面請(qǐng)看下面的代碼,它并不長(zhǎng)而且不復(fù)雜:
function &load_class($class_name, $param = null, $instantiate = true)
{
static $objects = array();
$class_name = ucfirst(strtolower($class_name));
if (isset($objects[$class_name])) {
return $objects[$class_name];
}
$class_file = DIR_MODELS . "/{$class_name}.inc.php";
if (file_exists($class_file)) {
require_once $class_file;
if (!class_exists($class_name)) {
return false;
} else {
$objects[$class_name] =& new $class_name($param);
return $objects[$class_name];
}
} else {
if ($instantiate) {
$objects[$class_name] = null;
}
return null;
}
}函數(shù)只有三個(gè)參數(shù),分別是 $class_name 、$param 以及 $instaniate ,其中 $param 是構(gòu)造函數(shù)的參數(shù),$instaniate 是可選的。請(qǐng)注意函數(shù)中的 $objects 數(shù)組是一個(gè)靜態(tài)變量,也就是當(dāng)調(diào)用完這個(gè)函數(shù)的時(shí)候數(shù)組并不會(huì)釋放,下次調(diào)用此函數(shù)時(shí)這個(gè)數(shù)組的數(shù)據(jù)是會(huì)保存的。這樣做的好處就是可以將大部分的類(lèi)實(shí)例了以后,如需要重復(fù)調(diào)用則直接返回這個(gè)類(lèi)的實(shí)例就可以了,避免了重復(fù)調(diào)用,提高了性能。代碼如下:
static $objects = array();
if (isset($objects[$class_name])) {
return $objects[$class_name];
}其它繼續(xù)的代碼就是檢測(cè)是否有這個(gè)類(lèi)名稱(chēng)的文件,如果有載入這個(gè)文件并尋找指定名稱(chēng)的類(lèi),如找到了這個(gè)類(lèi)以后就實(shí)例化。這要求腳本中類(lèi)的名稱(chēng)必須和腳本的文件名是一致的。我想這也有利于以后的代碼管理。
$instaniate 參數(shù)這個(gè)時(shí)候就發(fā)揮了功效,這個(gè)參數(shù)會(huì)告訴函數(shù)如果未找到則在 $objects 下面做一個(gè)標(biāo)記位(null)避免函數(shù)又重復(fù)的尋找文件名并重復(fù)載入和尋找。
$class_file = DIR_MODELS . "/{$class_name}.inc.php";
if (file_exists($class_file)) {
require_once $class_file;
if (!class_exists($class_name)) {
return false;
} else {
$objects[$class_name] =& new $class_name($param);
return $objects[$class_name];
}
} else {
if ($instantiate) {
$objects[$class_name] = null;
}
return null;
}其中語(yǔ)句:
$objects[$class_name] =& new $class_name($param);可以多次的推敲一下。$class_name 在函數(shù)中是一個(gè)字符串變量。關(guān)鍵字 new 可以動(dòng)態(tài)的實(shí)例化指定字符串的類(lèi)(如果存在的話(huà))。有關(guān)此調(diào)用方法可以參見(jiàn) PHP 手冊(cè)和這里。
此函數(shù)的不足之處就是如何去考慮傳遞不同個(gè)數(shù)的參數(shù)給每個(gè)不同的類(lèi)的構(gòu)造函數(shù)。或許可以使用 call_user_func_array 等函數(shù)實(shí)現(xiàn),但是這樣的做法非常的不 Grace。在這里需要推敲一下。其實(shí) file_exists 等文件存在的測(cè)試可以交給 __autoload 函數(shù)處理,不過(guò)由于其他的函數(shù)比如 interface_exists 等也會(huì)調(diào)用 __autolaod 函數(shù),出于兼容性的考慮,所以只在函數(shù)內(nèi)做一個(gè)簡(jiǎn)單的測(cè)試。
PHP5 相對(duì) PHP4 而言更加的面向?qū)ο蟆N蚁胧菚r(shí)候更新我們我們的編碼思想了。有關(guān) PHP5 的類(lèi)和對(duì)象,這里有一個(gè)非常好的教程。
- PHP類(lèi)的聲明與實(shí)例化及構(gòu)造方法與析構(gòu)方法詳解
- php實(shí)例化一個(gè)類(lèi)的具體方法
- PHP實(shí)現(xiàn)一個(gè)限制實(shí)例化次數(shù)的類(lèi)示例
- php反射學(xué)習(xí)之不用new方法實(shí)例化類(lèi)操作示例
- php學(xué)習(xí)筆記 類(lèi)的聲明與對(duì)象實(shí)例化
- PHP閉包函數(shù)傳參及使用外部變量的方法
- php使用$_POST或$_SESSION[]向js函數(shù)傳參
- PHP傳參之傳值與傳址的區(qū)別
- 實(shí)例化php類(lèi)時(shí)傳參的方法分析
相關(guān)文章
Zend Framework入門(mén)應(yīng)用實(shí)例詳解
這篇文章主要介紹了Zend Framework入門(mén)應(yīng)用,結(jié)合實(shí)例形式詳細(xì)講述了Zend Framework應(yīng)用的創(chuàng)建步驟、相關(guān)命令、控制器及視圖文件代碼實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-12-12TP5框架實(shí)現(xiàn)一次選擇多張圖片并預(yù)覽的方法示例
這篇文章主要介紹了TP5框架實(shí)現(xiàn)一次選擇多張圖片并預(yù)覽的方法,結(jié)合實(shí)例形式詳細(xì)分析了thinkPHP5基于ajax數(shù)據(jù)提交上傳多張圖片與本地預(yù)覽相關(guān)操作技巧,需要的朋友可以參考下2020-04-04PHP把網(wǎng)頁(yè)保存為word文件的三種方法
最近工作遇到關(guān)于生成word的問(wèn)題,現(xiàn)在總結(jié)一下生成word的三種方法的相關(guān)資料,需要的朋友可以參考下2014-04-04在Mac OS的PHP環(huán)境下安裝配置MemCache的全過(guò)程解析
這篇文章主要介紹了在Mac OS的PHP環(huán)境下安裝配置MemCache的全過(guò)程解析,MemCache是一套分布式的高速緩存系統(tǒng),需要的朋友可以參考下2016-02-02Thinkphp5.1獲取項(xiàng)目根目錄以及子目錄路徑的方法實(shí)例講解
這篇文章主要介紹了Thinkphp5.1獲取項(xiàng)目根目錄以及子目錄路徑的方法實(shí)例講解,希望正在學(xué)習(xí)TP框架的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)研究下2021-03-03如何使用PHP file_exists函數(shù)檢查文件是否存在
這篇文章主要為大家介紹了PHP函數(shù)file_exists檢查文件是否存在實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Thinkphp5分頁(yè)后攜帶參數(shù)跳轉(zhuǎn)傳遞功能實(shí)現(xiàn)
這篇文章主要介紹了Thinkphp5分頁(yè)后攜帶參數(shù)進(jìn)行跳轉(zhuǎn)傳遞,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06PHP利用pdo_odbc實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)示例【基于ThinkPHP5.1搭建的項(xiàng)目】
這篇文章主要介紹了PHP利用pdo_odbc實(shí)現(xiàn)連接數(shù)據(jù)庫(kù),結(jié)合實(shí)例形式分析了基于ThinkPHP5.1框架使用pdo_odbc連接數(shù)據(jù)庫(kù)相關(guān)操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-05-05