国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 後端開(kāi)發(fā) php教程 PHP資料庫(kù)操作物件導(dǎo)向的優(yōu)點(diǎn)_PHP教程

PHP資料庫(kù)操作物件導(dǎo)向的優(yōu)點(diǎn)_PHP教程

Jul 21, 2016 pm 04:11 PM
mysql php 優(yōu)點(diǎn) 如何 物件 我們 操作 數(shù)據(jù) 資料庫(kù) 知道 獲取 記錄 讀取 面向


我們都知道如何從Mysql獲取我們需要的行(記錄),讀取數(shù)據(jù),然後訪問(wèn)一些改動(dòng)。很明顯也很直接,過(guò)程背後也沒(méi)有什麼拐彎抹角的。然而對(duì)於我們使用面對(duì)物件的程式設(shè)計(jì)(OOP)來(lái)管理我們資料庫(kù)中的資料時(shí),這個(gè)過(guò)程就需要大幅改進(jìn)一下了。這篇文章將對(duì)如何設(shè)計(jì)一個(gè)面對(duì)物件的方式來(lái)管理資料庫(kù)的記錄做一個(gè)簡(jiǎn)單的描述。你的數(shù)據(jù)當(dāng)中的所有內(nèi)部邏輯關(guān)係將被封裝到一個(gè)非常條理的記錄對(duì)象,這個(gè)對(duì)象能夠提供專門(專一)的確認(rèn)代碼系統(tǒng),轉(zhuǎn)換以及數(shù)據(jù)處理。隨著Zend Engine2 和PHP5的發(fā)布,PHP開(kāi)發(fā)者將擁有更強(qiáng)大的面對(duì)物件的工具來(lái)輔助工作,這將使這個(gè)過(guò)程(面對(duì)物件地管理資料庫(kù))更有吸引力。


以下列出了一些使用物件來(lái)描敘你的資料庫(kù)的有利方面:


存取方法(Accessor methods)將會(huì)使你對(duì)屬性的讀取和寫入過(guò)程做到完全的控制
每一級(jí)的每個(gè)記錄和屬性(的操作)都有確認(rèn)過(guò)程
從關(guān)係表中智能的獲取對(duì)象
重複使用的邏輯方法意味著所有的資料互動(dòng)都要通過(guò)相同的基礎(chǔ)程式碼(codebase),這將使維護(hù)變得更加簡(jiǎn)單
程式碼簡(jiǎn)單,因?yàn)椴煌挠涗浀膬?nèi)部邏輯都已經(jīng)包含在各自所處的類別(class)當(dāng)中,而不是繁瑣的函式庫(kù)(lib)檔案
在手工編寫程式碼和SQL查詢語(yǔ)句時(shí),出錯(cuò)的機(jī)會(huì)將更少


存取方法(Accessor methods)

存取方式是透過(guò)類別給實(shí)例(instance)的變數(shù)賦值。一個(gè)例子,我有一個(gè)叫User的類,並且有一個(gè)實(shí)例$username,我會(huì)寫這樣的存取方法(函數(shù)),User->username()和User->setUsername()用來(lái)傳回和給實(shí)例賦值。



class User {
var $username;

function username() {
return $this->username; ??>}

function setUsername($newUsername) {
$this->username = $newUsername;
}
}
?>




這裡有很好的理由讓我們寫這樣的「特別的程式碼」。它將使開(kāi)發(fā)者更靈活的改變類別的繁瑣的工作,因?yàn)檫@個(gè)過(guò)程將不需要其他的使用類別的php程式碼。讓我們來(lái)看看下面這個(gè)更加完善的可信賴的User類別。


變數(shù)$username將不復(fù)存在,所有的東西都被整合的放在數(shù)組$_data當(dāng)中
如果username是空的話,username()函數(shù)將提供一個(gè)缺省(默認(rèn))的值給它
setUsername()過(guò)程將在接受值之前確認(rèn)username是否合乎標(biāo)準(zhǔn)格式(如字長(zhǎng)等)

class User {
var $_data = array(); // associative array containing all the attributes for the User

function username() {
return !empty($this->_data['username']) ? $this-> _data['username'] : '(no name!)';
}

function setUsername($newUsername) {
if ($this->validateUsername($newUsername)) {
$this->_data['username'] = $newUsername;
}
}

function validateUsername(&$someName) {
if (strlen($someName) > 12) {
throw new Exception('Your username is too long'); // PHP5 only
}
return true;
}
}
?>


}
?>



?>

顯而易見(jiàn),這對(duì)我們控制存取物件的資料有很大幫助。如果一個(gè)程式設(shè)計(jì)師已經(jīng)直接存取username的訊息,以上程式碼的變更將會(huì)破壞他的程式碼。然而我們可以使用(類別的)訪問(wèn)方法,就像上面程式碼中註釋的那樣,添加一個(gè)驗(yàn)證的功能而不需要改變?nèi)魏纹渌臇|西。注意username的驗(yàn)證(範(fàn)例當(dāng)中是不能超過(guò)12位元組)程式碼是獨(dú)立在setUsername()方法之外的。從驗(yàn)證到儲(chǔ)存到資料庫(kù)的過(guò)程輕而易舉。而且,這是一個(gè)非常好的單憑經(jīng)驗(yàn)的方法,一個(gè)方法或一個(gè)類別需要做的越少,它的重複使用的機(jī)會(huì)將會(huì)越大。這在你開(kāi)始寫一個(gè)子類時(shí)更加明顯,假如你需要一個(gè)子類,並且又要跳過(guò)(忽略)父類方法(行為)中的一些特殊的細(xì)節(jié),如果(針對(duì)這個(gè)細(xì)節(jié)的)方法很小而又精細(xì),(修改它)只是一瞬間的過(guò)程,而如果這個(gè)方法非常臃腫,針對(duì)多種目的,你可能將在複製子類中大量代碼中鬱悶而終。

比方說(shuō),假如Admin是User類別的子類別。我們對(duì)adamin的用戶可能會(huì)有不同的,相對(duì)苛刻一些的密碼驗(yàn)證方法。最好是跨過(guò)父類別的驗(yàn)證方法和整個(gè)setUsername()方法(在子類別中重寫)。

更多關(guān)於存取器(Accessor)
以下是一些其他的例子來(lái)說(shuō)明如何讓存取器用的更有效果。很多時(shí)候我們可能要計(jì)算結(jié)果,而不是簡(jiǎn)單的回傳數(shù)組中的靜態(tài)資料。存取方法還能做的一個(gè)有用的事情就是更新(updating)快取中的值。當(dāng)所有的變動(dòng)(對(duì)資料的所有操作)都要通過(guò)setX()方法的時(shí)候,這正是我們根據(jù)X來(lái)重置快取中的值的時(shí)刻。 於是我們的這個(gè)類別層次變得更加明了:內(nèi)部變數(shù)$_data的處理被替換成受保護(hù)的私有方法(private methods)_getData()和_setData() 這類方法被轉(zhuǎn)移到被稱作記錄(Record)的抽象的超級(jí)類別(super class),當(dāng)然它是User類別下的子類別這個(gè)記錄類別(Record class)掌握所有存取陣列$ _data的細(xì)節(jié),在內(nèi)容被修改之前呼叫驗(yàn)證的方法,以及將變更的通知發(fā)給記錄(Records),就像發(fā)給中心物件儲(chǔ)存(ObjectStore)實(shí)例。

class User extends Record {

// --- 省略程式碼--- //

/**
* 不顯示使用者的實(shí)際密碼,僅顯示一些與密碼值相同 strlen 的星號(hào)。
*/
函數(shù)password() {
$passLength = strlen($this->_getData('password'));
return str_repeat('*', $passLength);
}
/* *
* 設(shè)定使用者密碼不受影響。
*/
function setPassword($newPassword) {
$this->_setData('password', $newPassword);
}

/**
* fullName 是從firstName 和lastName
* 派生的屬性,不需要儲(chǔ)存為變數(shù)。
* 因此它是唯讀的,並且沒(méi)有「setFullname()」存取器方法。
* /
function fullName() {
return $this->firstName() . 」 「。 $this->lastName();
}

/**
* 支出限額回傳用戶支出限額的金錢價(jià)值。
* 該值作為 INT 儲(chǔ)存在資料庫(kù)中,無(wú)需
* 更昂貴的 DECIMAL 或 DOUBLE 列類型。
*/
function SpendingLimit() {
return $this->_getData('spendingLimit') / 100 ;
}

/**
* set 存取器將貨幣值乘以 100,因此它可以再次作為 INT 值儲(chǔ)存在資料庫(kù)中
*。
*/
function setSpendingLimit($newSpendLimit) {
$this->_setData('spendingLimit', $newSpendLimit * 100); >}

/**
* validateSpendingLimit 不在此類中調(diào)用,而是由 Record 超類中的 _setData() 方法自動(dòng)調(diào)用
* ,而 Record 超類別又由 setSpendingLimit() 方法調(diào)用。
*/
function validateSpendingLimit(&$someLimit) {
if (is_numeric($someLimit) AND $someLimit >= 0) {
回真?? >回真;
} else {
throw new Exception("支出限額必須為非負(fù)整數(shù)"); //僅PHP5
}
}
}

/**
* Record 是所有資料庫(kù)物件的超類別。
*/
抽象類別Record {
var $_data = array();
var $_modifiedKeys = array(); // 追蹤自建立/取得記錄以來(lái)哪些欄位已變更

/**
* 傳回 $_data 關(guān)聯(lián)數(shù)組中的一個(gè)元素。
*/
function _getData($attributeName) {
return $this->_data[ $屬性名稱];
}

/**
* 如果提供的值通過(guò)驗(yàn)證,則此
* 設(shè)定 $_data 關(guān)聯(lián)數(shù)組中的值。
*/
function _setData($attributeName, $value) {
if ($this->validateAttribute($attributeName, $value)) {
if ($value != $this->_data[ $attributeName]) {
$this->_data[$attributeName] = $value;
$this->_modifiedKeys[] = $attributeName;
$this->didChange();
} else {
// 新值與目前值相同
// 不需要更改
}
}
}

/**
* 對(duì)於名為「foo」的屬性,它將尋找名為「validateFoo()」的方法
* 並呼叫它(如果存在)。否則傳回 true(表示驗(yàn)證通過(guò))。
*/
function validateAttribute($attributeName, &$value) {
$methodName = 'validate' . $屬性名稱;
if (method_exists($this, $methodName)) {
return $this->$methodName( $value);
} else {
回傳true;
}
}

function didChange() {
//通知objectStore這條記錄發(fā)生了變化
}
}
?>



現(xiàn)在我們擁有了一個(gè)抽象的超級(jí)類別(Record),我們可以將User類別裡面大量的程式碼轉(zhuǎn)移出來(lái),而讓這個(gè)User的子類別來(lái)關(guān)注User的特殊項(xiàng)目如存取和驗(yàn)證方法。您可能已經(jīng)注意到在我們的這個(gè)記錄類別(隱藏類別)中沒(méi)有任何 SQL 程式碼。這不是疏忽或遺漏!物件儲(chǔ)存類別(ObjectStore 類別)(在第二部分)將負(fù)責(zé)所有和資料庫(kù)的交互,以及我們的超級(jí)類別記錄的實(shí)例化。這樣使我們的記錄類別更加精簡(jiǎn)有效率,而這對(duì)於評(píng)估我們處理大量物件的效率的時(shí)候是個(gè)重要因素。

http://www.bkjia.com/PHPjc/313989.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/313989.htmlTechArticle我們都如何從Mysql獲取我們需要的行(記錄),讀取數(shù)據(jù),然後進(jìn)行一些訪問(wèn)。很明顯也很直接,在這個(gè)過(guò)程背後也沒(méi)有什麼拐彎抹角...
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

在C中使用std :: Chrono 在C中使用std :: Chrono Jul 15, 2025 am 01:30 AM

std::chrono在C 中用於處理時(shí)間,包括獲取當(dāng)前時(shí)間、測(cè)量執(zhí)行時(shí)間、操作時(shí)間點(diǎn)與持續(xù)時(shí)間及格式化解析時(shí)間。 1.獲取當(dāng)前時(shí)間使用std::chrono::system_clock::now(),可轉(zhuǎn)換為可讀字符串但係統(tǒng)時(shí)鐘可能不單調(diào);2.測(cè)量執(zhí)行時(shí)間應(yīng)使用std::chrono::steady_clock以確保單調(diào)性,並通過(guò)duration_cast轉(zhuǎn)換為毫秒、秒等單位;3.時(shí)間點(diǎn)(time_point)和持續(xù)時(shí)間(duration)可相互操作,但需注意單位兼容性和時(shí)鐘紀(jì)元(epoch)

PHP如何處理環(huán)境變量? PHP如何處理環(huán)境變量? Jul 14, 2025 am 03:01 AM

toAccessenvironmentVariablesInphp,useGetenv()或$ _envsuperglobal.1.getEnv('var_name')retievesSpecificvariable.2。 $ _ en v ['var_name'] accessesvariablesifvariables_orderInphp.iniincludes“ e” .setVariablesViaCliWithvar = vualitephpscript.php,inapach

mysql公共表表達(dá)式(CTE)示例 mysql公共表表達(dá)式(CTE)示例 Jul 14, 2025 am 02:28 AM

CTE是MySQL中用於簡(jiǎn)化複雜查詢的臨時(shí)結(jié)果集。它在當(dāng)前查詢中可多次引用,提升代碼可讀性和維護(hù)性。例如,在orders表中查找每個(gè)用戶的最新訂單時(shí),可通過(guò)CTE先獲取每個(gè)用戶的最新訂單日期,再與原表關(guān)聯(lián)獲取完整記錄。相比子查詢,CTE結(jié)構(gòu)更清晰,邏輯更易調(diào)試。使用技巧包括明確別名、串聯(lián)多個(gè)CTE以及利用遞歸CTE處理樹(shù)形數(shù)據(jù)。掌握CTE能使SQL更優(yōu)雅高效。

php準(zhǔn)備的語(yǔ)句與條款 php準(zhǔn)備的語(yǔ)句與條款 Jul 14, 2025 am 02:56 AM

使用PHP預(yù)處理語(yǔ)句執(zhí)行帶有IN子句的查詢時(shí),1.需根據(jù)數(shù)組長(zhǎng)度動(dòng)態(tài)生成佔(zhàn)位符;2.使用PDO時(shí)可直接傳入數(shù)組,用array_values確保索引連續(xù);3.使用mysqli時(shí)需構(gòu)造類型字符串並綁定參數(shù),注意展開(kāi)數(shù)組的方式及版本兼容性;4.避免拼接SQL、處理空數(shù)組和確保數(shù)據(jù)類型匹配。具體做法是:先用implode與array_fill生成佔(zhàn)位符,再依擴(kuò)展特性綁定參數(shù),從而安全執(zhí)行IN查詢。

為什麼我們?cè)u(píng)論:PHP指南 為什麼我們?cè)u(píng)論:PHP指南 Jul 15, 2025 am 02:48 AM

PHPhasthreecommentstyles://,#forsingle-lineand/.../formulti-line.Usecommentstoexplainwhycodeexists,notwhatitdoes.MarkTODO/FIXMEitemsanddisablecodetemporarilyduringdebugging.Avoidover-commentingsimplelogic.Writeconcise,grammaticallycorrectcommentsandu

如何避免PHP中未定義的索引錯(cuò)誤 如何避免PHP中未定義的索引錯(cuò)誤 Jul 14, 2025 am 02:51 AM

避免“undefinedindex”錯(cuò)誤的關(guān)鍵方法有三:首先,使用isset()檢查數(shù)組鍵是否存在並確保值不為null,適用於大多數(shù)常規(guī)場(chǎng)景;其次,使用array_key_exists()僅判斷鍵是否存在,適用於需要區(qū)分鍵不存在和值為null的情況;最後,使用空合併運(yùn)算符??(PHP7 )簡(jiǎn)潔地設(shè)置默認(rèn)值,推薦用於現(xiàn)代PHP項(xiàng)目,同時(shí)注意表單字段名拼寫、謹(jǐn)慎使用extract()及遍歷前檢查數(shù)組非空以進(jìn)一步規(guī)避風(fēng)險(xiǎn)。

為MySQL表中的列選擇適當(dāng)?shù)臄?shù)據(jù)類型 為MySQL表中的列選擇適當(dāng)?shù)臄?shù)據(jù)類型 Jul 15, 2025 am 02:25 AM

insetTingUpmysqltables,選擇theStherightDatatatPesisionCrucialForeffifeffifeffifeffificeFifeffifeFrifeFifeScalible

PHP標(biāo)頭重定向不起作用 PHP標(biāo)頭重定向不起作用 Jul 14, 2025 am 01:59 AM

header函數(shù)跳轉(zhuǎn)失敗原因及解決方法:1.header前已有輸出,需檢查並移除所有前置輸出或使用ob_start()緩衝;2.未加exit導(dǎo)致後續(xù)代碼干擾,應(yīng)在跳轉(zhuǎn)後立即添加exit或die;3.路徑錯(cuò)誤應(yīng)使用絕對(duì)路徑或動(dòng)態(tài)拼接確保正確;4.服務(wù)器配置或緩存干擾可嘗試清除緩存或更換環(huán)境測(cè)試。

See all articles