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.mzph.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本身就是一个开放的系统,每天都会有新的软件出现,…