仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1448|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页设计PHP数据库操作面向对象的长处

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
应该大致熟悉了一些学习过程,也许我的过程和你的有些出路,但是不管怎么样是殊途同归,我写这么多,也只是给大家一个借鉴的机会,至于好与不好,默默不敢打包票^0^对象|数据|数据库   咱们都晓得若何从Mysql获得咱们需求的行(纪录),读取数据,然后存取一些修改。很分明也很直接,在这个进程面前也没有甚么借题发挥的。但是关于咱们利用面临对象的法式设计(OOP)来办理咱们数据库中的数据时,这个进程就需求大大改善一下了。这篇文章将对若何设计一个面临对象的体例来办理数据库的纪录做一个复杂的描写。你的数据傍边的一切外部逻辑关系将被封装到一个十分层次的纪录对象,这个对象可以供应专门(专注)切实其实认代码体系,转化和数据处置。跟着Zend Engine2 和PHP5的宣布,PHP开辟者将会具有更壮大的面临对象的东西来帮助任务,这将使这个进程(面临对象地办理数据库)更有吸引力。


以以下出了一些利用对象来描叙你的数据库的有益方面:


存取办法(Accessor methods)将会使你对属性的读取和写入进程做到完整的掌握
每级的每一个纪录和属性(的操作)都有确认进程
从关系表中智能的获得对象
反复利用的逻辑办法意味着一切的数据交互都要经由过程不异的基本代码(codebase),这将使保护变得加倍复杂
代码复杂,由于分歧的纪录的外部逻辑都已包括在各自所处的类(class)傍边,而不是繁琐的库(lib)文件
在手工编写代码和SQL查询语句时,失足的时机将更少


存取办法(Accessor methods)

存取体例是经由过程类给实例(instance)的变量赋值。一个例子,我有一个叫User的类,而且有一个实例$username,我会写如许的存取办法(函数),User->username()和User->setUsername()用来前往和给实例赋值。



<?php
class User {
var $username;

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

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




这里有很好的来由让咱们编写如许的“出格的代码”。它将使开辟者更天真的改动类的繁琐的任务,由于这一进程将不需求其他的利用类的php代码。让咱们来看看上面这个加倍完美的可托赖的User类。


变量$username将不复存在,一切的器材都被整合的放在数组$_data傍边
假如username是空的话,username()函数将供应一个缺省(默许)的值给它
setUsername()进程将在承受值之前确认username是不是符合尺度格局(如字长等)

<?php
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)实例。

<?php
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类加倍肥大而又无效率,而这关于评价咱们处置大批对象的效力的时分是个主要要素。
  我是根据自己的成长历程来写的,如有不对的还请指正。
飘灵儿 该用户已被删除
沙发
发表于 2015-2-4 10:30:27 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
若天明 该用户已被删除
板凳
发表于 2015-2-9 15:31:53 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
只想知道 该用户已被删除
地板
发表于 2015-2-26 21:11:39 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
老尸 该用户已被删除
5#
发表于 2015-3-2 02:08:18 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
乐观 该用户已被删除
6#
发表于 2015-3-4 14:41:40 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
蒙在股里 该用户已被删除
7#
发表于 2015-3-10 13:03:38 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
简单生活 该用户已被删除
8#
发表于 2015-3-13 02:24:30 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
因胸联盟 该用户已被删除
9#
发表于 2015-3-17 09:31:09 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
10#
发表于 2015-3-21 01:52:15 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
第二个灵魂 该用户已被删除
11#
发表于 2015-3-24 00:18:00 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
小女巫 该用户已被删除
12#
发表于 2015-3-27 08:42:06 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
小妖女 该用户已被删除
13#
发表于 2015-4-1 12:35:27 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
爱飞 该用户已被删除
14#
发表于 2015-4-12 20:07:43 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
透明 该用户已被删除
15#
发表于 2015-4-22 05:14:49 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
愤怒的大鸟 该用户已被删除
16#
发表于 2015-4-24 08:32:26 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
海妖 该用户已被删除
17#
发表于 2015-4-26 13:57:55 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
灵魂腐蚀 该用户已被删除
18#
发表于 2015-5-10 19:28:59 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
精灵巫婆 该用户已被删除
19#
发表于 2015-6-16 17:22:09 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
分手快乐 该用户已被删除
20#
发表于 2015-6-22 23:07:33 | 只看该作者
做为1门年轻的语言,php一直很努力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 13:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表