php對象好用嗎,在數據庫中使用對象的好處_php

我們都知道如何從mysql獲取我們需要的行(記錄),讀取數據,然后存取一些改動。很明顯也很直接,在這個過程背后也沒有什么拐彎抹角的。然而對于我們使用面對對象的程序設計(OOP)來管理我們數據庫中的數據時,這個過程就需要大大改進一下了。這篇文章將對如何設計一個面對對象的方式來管理數據庫的記錄做一個簡單的描述。你的數據當中的所有內部邏輯關系將被封裝到一個非常條理的記錄對象,這個對象能夠提供專門(專一)的確認代碼系統,轉化以及數據處理。隨著Zend Engine2 和php5的發布,PHP開發者將會擁有更強大的面對對象的工具來輔助工作,這將使這個過程(面對對象地管理數據庫)更有吸引力。

以下列出了一些使用對象來描敘你的數據庫的有利方面:

http://www.gaodaima.com/46136.html在數據庫中使用對象的好處_php

存取方法(accessor methods)將會使你對屬性的讀取和寫入過程做到完全的控制

每一級的每個記錄和屬性(的操作)都有確認過程

從關系表中智能的獲取對象

重復使用的邏輯方法意味著所有的數據交互都要通過相同的基礎代碼(codebase),這將使維護變得更加簡單

代碼簡單,因為不同的記錄的內部邏輯都已經包含在各自所處的類(class)當中,而不是繁瑣的庫(lib)文件

在手工編寫代碼和SQL查詢語句時,出錯的機會將更少

存取方法(Accessor methods)

存取方式是通過類給實例(instance)的變量賦值。一個例子,我有一個叫User的類,并且有一個實例$username,我會寫這樣的存取方法(函數),User->username()和User->setUsername()用來返回和給實例賦值。

class User {

var $username;

function username() {

return $this->username;

}

function setUsername($newUsername) {

$this->username = $newUsername;

}

}

?>

這里有很好的理由讓我們編寫這樣的“特別的代碼”。它將使開發者更靈活的改變類的繁瑣的工作,因為這一過程將不需要其他的使用類的php代碼。讓我們來看看下面這個更加完善的可信賴的User類。

變量$username將不復存在,所有的東西都被整合的放在數組$_data當中

如果username是空的話,username()函數將提供一個缺省(默認)的值給它

setUsername()過程將在接受值之前確認username是否合乎標準格式(如字長等)

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;

}

}

?>

顯而易見,這對我們控制存取對象的數據有很大幫助。如果一個程序員已經直接地存取username的信息,以上代碼的變化將會破壞他的代碼。然而我們可以使用(類的)存取方法,就像上面代碼中注釋的那樣,添加一個驗證的功能而不需要改變任何其他的東西。注意username的驗證(例子當中是不能超過12字節)代碼是獨立在setUsername()方法之外的。從驗證到存儲到數據庫的過程輕而易舉。而且,這是個非常好的單憑經驗的方法,一個方法或一個類需要做的越少,它的重復使用的機會將會越大。這在你開始寫一個子類時更加明顯,假如你需要一個子類,并且又要跳過(忽略)父類方法(行為)中的一些特殊的細節,如果(針對這個細節的)方法很小而又精細,(修改它)只是一瞬間的過程,而如果這個方法非常臃腫,針對多種目的,你可能將在復制子類中大量代碼中郁悶而終。

比方說,假如Admin是User類的一個子類。我們對adamin的用戶可能會有不同的,相對苛刻一些的密碼驗證方法。最好是跨過父類的驗證方法和整個setUsername()方法(在子類中重寫)。

更多關于存取器(Accessor)

下面是一些其他的例子來說明如何使存取器用的更有效果。很多時候我們可能要計算結果,而不是簡單的返回數組中的靜態數據。存取方法還能做的一個有用的事情就是更新(updating)緩存中的值。當所有的變動(對數據的所有操作)都要通過setX()方法的時候,這正是我們根據X來重置緩存中的值的時刻。

于是我們的這個類層次變得更加明了:

內部變量$_data的處理被替換成受保護的私有方法(private methods)_getData()和_setData()

這類方法被轉移到被稱作記錄(Record)的抽象的超級類(super class),當然它是User類下的子類

這個記錄類(Record class)掌握所有存取數組$_data的細節,在內容被修改之前調用驗證的方法,以及將變更的通知發給記錄(Records),就像發給中心對象存儲(ObjectStore)實例。

class User extends Record {

// --- OMITTED CODE --- //

/**

* Do not show the actual password for the user, only some asterixes with the same strlen as the password value.

*/

function password() {

$passLength = strlen($this->_getData('password'));

return str_repeat('*', $passLength);

}

/**

* Setting the user password is not affected.

*/

function setPassword($newPassword) {

$this->_setData('password', $newPassword);

}

/**

* fullName is a derived attribute from firstName and lastName

* and does not need to be stored as a variable.

* It is therefore read-only, and has no 'setFullname()' accessor method.

*/

function fullName() {

return $this->firstName() . " " . $this->lastName();

}

/**

* Spending limit returns the currency value of the user's spending limit.

* This value is stored as an INT in the database, eliminating the need

* for more expensive DECIMAL or DOUBLE column types.

*/

function spendingLimit() {

return $this->_getData('spendingLimit') / 100;

}

/**

* The set accessor multiplies the currency value by 100, so it can be stored in the database again

* as an INT value.

*/

function setSpendingLimit($newSpendLimit) {

$this->_setData('spendingLimit', $newSpendLimit * 100);

}

/**

* The validateSpendingLimit is not called in this class, but is called automatically by the _setData() method

* in the Record superclass, which in turn is called by the setSpendingLimit() method.

*/

function validateSpendingLimit(&$someLimit) {

if (is_numeric($someLimit) AND $someLimit >= 0) {

return true;

} else {

throw new Exception("Spending limit must be a non-negative integer"); //PHP5 only

}

}

}

/**

* Record is the superclass for all database objects.

*/

abstract class Record {

var $_data = array();

var $_modifiedKeys = array(); // keeps track of which fields have changed since record was created/fetched

/**

* Returns an element from the $_data associative array.

*/

function _getData($attributeName) {

return $this->_data[$attributeName];

}

/**

* If the supplied value passes validation, this

* sets the value in the $_data associative array.

*/

function _setData($attributeName, $value) {

if ($this->validateAttribute($attributeName, $value)) {

if ($value != $this->_data[$attributeName]) {

$this->_data[$attributeName] = $value;

$this->_modifiedKeys[] = $attributeName;

$this->didChange();

} else {

// the new value is identical to the current one

// no change necessary

}

}

}

/**

* For an attribute named "foo", this looks for a method named "validateFoo()"

* and calls it if it exists. Otherwise this returns true (meaning validation passed).

*/

function validateAttribute($attributeName, &$value) {

$methodName = 'validate' . $attributeName;

if (method_exists($this, $methodName)) {

return $this->$methodName($value);

} else {

return true;

}

}

function didChange() {

// notify the objectStore that this record changed

}

}

?>

現在我們擁有了一個抽象的超級類(Record),我們可以將User類里面大量的代碼轉移出來,而讓這個User的子類來關注User的特殊項目如存取和驗證方法。你可能已經注意到在我們的這個紀錄類(Record class)沒有任何的SQL代碼。這并不是疏忽或者遺漏!對象存儲類(ObjectStore class)(隱藏在第二部分)將負責所有和數據庫的交互,還有我們的超級類Record的實例化。這樣使我們的Record類更加瘦小而又有效率,而這對于評價我們處理大量對象的效率的時候是個重要因素。

如果你有興趣看看這篇文章基于的完整的代碼(不會出現如文中出現的所有的語法錯誤),可以給我的郵箱發信sam@360works.com

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

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

相關文章

linux apache php顯示源碼,linux 源碼安裝apache PHP 問題

sudo ./configure --prefix/var/php --with-apxs2/usr/local/apache2/bin/apxsLoadModule php5_module modules/libphp5.soDirectoryIndex index.html index.html.var .phpa-bash-3.2$ pwd/usr/local/apache2/htdocs-bash-3.2$ cat info.phpphpinfo();?>打開info.ph…

mysql臨時表的的理解,如何理解存儲過程中已存在的mysql臨時表?

它在創建表時具有IF NOT EXISTS(13.1.17. CREATE TABLE Syntax)選項,在這種情況下可以使用.例:DELIMITER $$CREATE PROCEDURE temp_sp1()BEGINCREATE TEMPORARY TABLE IF NOT EXISTS temp_table (col2 int(11) DEFAULT NULL,col3 int(11) DEFAULT NULL);INSERT INTO…

python 發郵件 抄送,Python調用outlook發送郵件,發送給多人、抄送給多人并帶上附件...

我的報告目錄具體解釋在代碼中有詳細注釋import win32com.client as win32import datetime, osaddressee test01qq.com;test02jd.com#收件人郵箱列表cc test02163.com;test03alibaba.com#抄送人郵件列表mail_path os.path.join(rC:\Users\songlihui\PycharmProjects\test001…

php阻止輸入sql,在PHP中全面阻止SQL注入式攻擊之三

一、 建立一個安全抽象層我們并不建議你手工地把前面介紹的技術應用于每一個用戶輸入的實例中,而是強烈推薦你為此創建一個抽象層。一個簡單的抽象是把你的校驗方案加入到一個函數中,并且針對用戶輸入的每一項調用這個函數。當然,我們還可以創…

Oracle12081,【Oracle介質】Oracle 12C Linux x86-64 最新OPatch patch 6880880 12.2.0.1.7

天萃荷凈Linux x86-64 補丁程序6880880: OPatch patch of version 12.2.0.1.7 for Oracle software releases 12.1.0.x (installer) and 12.2.0.x (AUG 2016)上次更新時間 2016-8-26 上午1:48 (8 天前)產品 Oracle Global Lifecycle Management OPatc…

如何使用oracle ebs,Oracle EBS進行集成的實際操作步驟

我們今天主要向大家介紹的是如何使用WebService和Oracle EBS進行集成,以及在使用WebService和Oracle EBS進行集成時,所需要的一些項目的描述,以下的文章就是對相關內容的描述。架構系統從總體上分為兩部分,一部為企業的EBS及接口系…

linux nls_lang oracle,linux操作系統環境變量LANG和NLS_LANG的區別

例如:復制代碼代碼如下:export LANGzh_CN.GB2312export NLS_LANGAMERICAN_AMERICA.ZHS16GBK$export LANGzh_CN.GB2312$date2012年 11月 27日 星期二 16:20:35 CST顯示是中文界面。復制代碼代碼如下:$export NLS_LANGAMERICAN_AMERICA.ZHS16GBK$sqlplus / as sysdbaS…

oracle監聽 3個配置文件,Oracle 11g 監聽 配置修改 說明

這里我們看2個比較常用的操作。1. 停止寫listener log在某些特定的場合可能會有這樣的需求。控制這個功能的參數是LOG_STATUS。 官網對這個參數的說明:To turn listenerlogging on or off.--在OS層面直接使用:lsnrctl SET LOG_STATUS {on | off}--在LSNR…

suse linux如何重置密碼忘記,SUSE?Linux忘記root密碼的處理辦法

GRUB修改法注意:此辦法僅適用SLES8、SLES9,不適用于SLES10,SLES10請用光盤修改法。此辦法不適合用于grub啟動超時時間為0的機器,因為grub超時時間設置為0后,不能編輯grub選項,此類機器必須使用光盤或網絡引…

linux怎么啟動端口服務,Linux 根據端口快速停止服務并啟動的辦法

ll /proc/7167結果為:[rootcentos76 deploy]# ll /proc/7167total 0dr-xr-xr-x 2 root root 0 Jun 25 11:13 attr-rw-r--r-- 1 root root 0 Jun 25 11:13 autogroup-r-------- 1 root root 0 Jun 25 11:13 auxv-r--r--r-- 1 root root 0 Jun 25 11:05 cgroup--w------- 1 root …

linux進程增刪改查,iptables的增刪改查

iptables是自帶的防火墻,功能強大,學習起來需要一段時間,下面是一些習iptables的時候的記錄。如果iptables不熟悉的話可以用apf,是一款基于iptables的防火墻,挺好用的。一,安裝并啟動防火墻[root ~]# /etc/init.d/ipta…

重裝系統 linux啟動windows系統文件在哪里,Win-Lin雙系統重裝Windows找回Linux啟動

第一系統Windows,第二系統Linux:Ubuntu18.10;1. 重新安裝Windows系統后,使用Ubuntu的安裝光盤,或啟動U盤啟動電腦;2. 選擇:Try Ubuntu ;3. 進入Ubuntu界面,打開命令行終端(Ctrl Alt…

linux遠程監控畢業設計,畢業設計論文:基于嵌入式Linux遠程監控系統的設計與實現.doc...

摘 要可編程邏輯控制器(PLC)不僅在工業控制中應用越來越廣泛,而且在其他領域的應用也逐漸擴大,例如:電力、化工、能源、水利等。由于它的功能比較強大、使用安全可靠、維護簡單方便的優點,在很多地方已經取代了繼電器電路的邏輯控…

linux卡死在選擇內核界面,求助:am3352 linux內核啟動時卡在 Starting kernel ...

這是用光盤里的uImage的輸出信息:U-Boot# tftp 0x82000000 bakuImagelink up on port 0, speed 100, full duplexUsing cpsw deviceTFTP from server 192.168.0.231; our IP address is 192.168.0.224Filename bakuImage.Load address: 0x82000000Loading: ########…

u盤分為windows和linux啟動,【電腦軟件】Ventoy 官方版,一個U盤,同時擁有啟動win+linux+Ubuntu...

軟件介紹:Ventoy是一個制作可啟動U盤的開源工具。有了Ventoy你就無需反復地格式化U盤,你只需要把ISO文件拷貝到U盤里面就可以啟動了,無需其他操作。 你可以一次性拷貝很多個不同類型的ISO文件,在啟動時Ventoy會顯示一個菜單來選擇…

linux cpu頻率軟件,linux cpu頻率控制

安裝cpufrequtils: sudo apt-get install cpufrequtils查看cpu: sudo cpufreq-info設置cpu模式: cpufreq-set -g {powersave, userspace, ondemand, conservative, performance}對應于{最省電(最低頻率)&#xff0…

linux var 空間不足,/var空間不足怎么辦?(求安全保險的方法)

最近想把Ubuntu從12.04升級到13.10,可/var目錄下的空間不足,怎么處理這個問題?提示需要850M多的空間,可從以下的信息來看,里面的東西我幾乎是沒得刪除了。# du -h --max-depth1 /var92K /var/crash4.0K /var/local4.0K…

linux 權限測試,linux下檢測root權限的shell腳本

個人心血來潮時寫的一個腳本,比較粗糙,功能也很簡單,大家有興趣的可以拿去改改。本腳本之爭對系統中UID為0的用戶#!/bin/bash #大家都知道echo test my computer is or not safety #顯示“ test my computer is or not saf…

嵌入式linux 網絡喚醒,C語言實現wake on lan(網絡喚醒...-Windows系統下用命令行編譯C/C++...-字符串常量引起的思考_169IT.COM...

前一段時間在自學linux系統,想模仿linux命令行的方式在Windows下編譯C/C程序,摸索一段時間后總算把這個解決了!(1)先用記事本編寫如下所示的代碼,并另存為hello.cpp,假設其保存路徑為C:\Users\Administrator\Desktop。…

linux更新函數,linux系統不同對象升級方法詳細介紹

當我們使用Linux一段時間以后,自然不會滿足總是在沒有任何變化的系統中工作,而是渴望能象在Windows系統中一樣,不斷對自己的Linux進行升級。另一方面,Linux本身就是一個開放的系統,每天都會有新的軟件出現,…