>您现在的位置:情感电台 > 情感障碍

PHP数据库操作面向对象的优点-php基础-PHP教程-幽默笑话

2019-07-05 07:37作者:admin

PHP数据库操作面向对象的优点-php基础-PHP教程-幽默笑话

显而易见,这对我们控制存取对象的数据有很大帮助。

如果一个程序员已经直接地存取username的信息,以上代码的变化将会破坏他的代码。 然而我们可以使用(类的)存取方法,就像上面代码中注释的那样,添加一个验证的功能而不需要改变任何其他的东西。

注意username的验证(例子当中是不能超过12字节)代码是独立在setUsername()方法之外的。 从验证到存储到数据库的过程轻而易举。

而且,这是个非常好的单凭经验的方法,一个方法或一个类需要做的越少,它的重复使用的机会将会越大。

这在你开始写一个子类时更加明显,假如你需要一个子类,并且又要跳过(忽略)父类方法(行为)中的一些特殊的细节,如果(针对这个细节的)方法很小而又精细,(修改它)只是一瞬间的过程,而如果这个方法非常臃肿,针对多种目的,你可能将在复制子类中大量代码中郁闷而终。 比方说,假如Admin是User类的一个子类。

我们对adamin的用户可能会有不同的,相对苛刻一些的密码验证方法。 最好是跨过父类的验证方法和整个setUsername()方法(在子类中重写)。

更多关于存取器(Accessor)下面是一些其他的例子来说明如何使存取器用的更有效果。 很多时候我们可能要计算结果,而不是简单的返回数组中的静态数据。 存取方法还能做的一个有用的事情就是更新(updating)缓存中的值。

当所有的变动(对数据的所有操作)都要通过setX()方法的时候,这正是我们根据X来重置缓存中的值的时刻。 于是我们的这个类层次变得更加明了:内部变量$_data的处理被替换成受保护的私有方法(privatemethods)_getData()和_setData()这类方法被转移到被称作记录(Record)的抽象的超级类(superclass),当然它是User类下的子类这个记录类(Recordclass)掌握所有存取数组$_data的细节,在内容被修改之前调用验证的方法,以及将变更的通知发给记录(Records),就像发给中心对象存储(ObjectStore)实例。 phpclassUserextendsRecord{//---OMITTEDCODE---///***Donotshowtheactualpasswordfortheuser,onlysomeasterixeswiththesamestrlenasthepasswordvalue.*/functionpassword(){$passLength=strlen($this-_getData(password));returnstr_repeat(*,$passLength);}/***Settingtheuserpasswordisnotaffected.*/functionsetPassword($newPassword){$this-_setData(password,$newPassword);}/***fullNameisaderivedattributefromfirstNameandlastName*anddoesnotneedtobestoredasavariable.*Itisthereforeread-only,andhasnosetFullname()accessormethod.*/functionfullName(){return$this-firstName()..$this-lastName();}/***Spendinglimitreturnsthecurrencyvalueoftheusersspendinglimit.*ThisvalueisstoredasanINTinthedatabase,eliminatingtheneed*formoreexpensiveDECIMALorDOUBLEcolumntypes.*/functionspendingLimit(){return$this-_getData(spendingLimit)/100;}/***Thesetaccessormultipliesthecurrencyvalueby100,soitcanbestoredinthedatabaseagain*asanINTvalue.*/functionsetSpendingLimit($newSpendLimit){$this-_setData(spendingLimit,$newSpendLimit*100);}/***ThevalidateSpendingLimitisnotcalledinthisclass,butiscalledautomaticallybythe_setData()method*intheRecordsuperclass,whichinturniscalledbythesetSpendingLimit()method.*/functionvalidateSpendingLimit($someLimit){if(is_numeric($someLimit)AND$someLimit=0){returntrue;}else{thrownewException(Spendinglimitmustbeanon-negativeinteger);//PHP5only}}}/***Recordisthesuperclassforalldatabaseobjects.*/abstractclassRecord{var$_data=array();var$_modifiedKeys=array();//keepstrackofwhichfieldshavechangedsincerecordwascreated/fetched/***Returnsanelementfromthe$_dataassociativearray.*/function_getData($attributeName){return$this-_data[$attributeName];}/***Ifthesuppliedvaluepassesvalidation,this*setsthevalueinthe$_dataassociativearray.*/function_setData($attributeName,$value){if($this-validateAttribute($attributeName,$value)){if($value!=$this-_data[$attributeName]){$this-_data[$attributeName]=$value;$this-_modifiedKeys[]=$attributeName;$this-didChange();}else{//thenewvalueisidenticaltothecurrentone//nochangenecessary}}}/***Foranattributenamedfoo,thislooksforamethodnamedvalidateFoo()*(meaningvalidationpassed).*/functionvalidateAttribute($attributeName,$value){$methodName=validate.$attributeName;if(method_exists($this,$methodName)){return$this-$methodName($value);}else{returntrue;}}functiondidChange(){//notifytheobjectStorethatthisrecordchanged}}。

随机推荐

图文聚集

热门排行

最新文章