Archive for the ‘面向对象’ Category

用PHP现实J2ee持久化访问模式-DAO

星期五, 04月 4th, 2008

通过“用户”来举例:

< ?php
#模型
class Member
{
private $uid;
private $username;
private $password;

public function setUid($_uid)
{
$this->uid = $_uid;
}

public function getUid()
{
return $this->uid;
}

public function setUsername($_username)
{
$this->username = $_username;
}
public function getUsername()
{
return $this->username;
}

public function setPassword($_password)
{
$this->password = $_password;
}
public function getPassword()
{
return $this->password;
}
}

#DAO
class MemberDAO
{
#基本变量
public $dbhost;
public $dbuser;
public $dbpassword;
public $dbname;

//构造函数为连接数据库
public function __construct($_dbhost,$_dbuser,$_dbpassword,$_dbname)
{
$this->dbhost=$_dbhost;
$this->dbuser=$_dbuser;
$this->dbpassword=$_dbpassword;
$this->dbname=$_dbname;
$this->conn= mysql_connect($this->dbhost,$this->dbuser,$this->dbpassword) or die(’连接数据库失败!’);
mysql_select_db($this->dbname);
}

//查询用户
public function getMember($_uid=”)
{
$members = array();

//如果参数uid为空,则查询全部
if(empty($_uid))
{
$res=mysql_query(”select * From members”);
}
else
{
$res=mysql_query(”select * From members WHERE uid = $uid”);
}

while($rows=mysql_fetch_assoc($res))
{
$member = new Member();
$member->setUid($row['uid']);
$member->setUsername($row['username']);
$member->setPassword($row['password']);

//追加到成员列表,如果不考虑查询多个用户则可不必这么麻烦
array_push($members,$member);
}
return $members;
}

//添加用户
public function addMember(Member $_member)
{
$uid = $_member->getUid();
$username = $_member->getUsername();
$password = md5($_member->getPassword());

$sql = “INSERT INTO members(uid,username,password) VALUES($uid,’$username’,'$password’)”;
mysql_query($sql_str) or die(mysql_error());
}

//修改资料
public function updateMember(Member $_member);
{
$uid = $_member->getUid();
$username = $_member->getUsername();
$password = md5($_member->getPassword());

$sql = “UPDATE members SET username=’$username’,password=’$password’ WHERE uid = $uid limit 1″;
mysql_query($sql_str) or die(mysql_error());
}

//删除用户………..
//其他操作用户的方法,不一一列举了
}

下面开始使用DAO

include ‘member.php’;
include ‘memberDAO.php’;
#创建DAO
$memberDAO = new memberDAO(’localhost’,'root’,'159753′,’test’);

#创建一个用户
$member = $new Member();
$member->setUid(911);
$member->setUsername(’tester’);
$member->setPassword(’321′);

#test 1
#添加到数据库
$memberDAO->addMember($member);

#test 2
#修改这个用户的密码
$member->setPassword(’123′);
$memberDAO->updateMember($member);

#test 3
#得到所有用户的列表
$members = $memberDAO->getMember();
#显示,这里假如不使用任何模版,只是测试显示数据,如果使用smrty模版引擎,更加方便,直接把$members传过去

foreach($members as $TmpMember)
{
echo ‘Uid:’.$TmpMember->getUid().’
‘;
echo ‘Username:’.$TmpMember->getUsername().’
‘;
echo ‘Password:’.$TmpMember->getPassword().’

‘;
}
?>

注意,示例代码仅供参考测试用,并不能直接使用在生产用途中。
推荐阅读:J2ee中DAO设计模式

什么时候使用抽象类,什么时候使用接口?

星期三, 03月 12th, 2008

抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。动物类要有呼吸方法。怎么呼吸就是子类的事了。
现在有很多讨论和建议提倡用interface代替abstract类,两者从理论上可以做一般性的混用,但是在实际应用中,他们还是有一定区别的。抽象类一般作为公共的父类为子类的扩展提供基础,这里的扩展包括了属性上和行为上的。而接口一般来说不考虑属性,只考虑方法,使得子类可以自由的填补或者扩展接口所定义的方法,就像JAVA王子所说的事件中的适配器就是一个很好的应用。
用一个简单的例子,比如说一个教师,我们把它作为一个抽象类,有自己的属性,比如说年龄,教育程度,教师编号等等,而教师也是分很多种类的,我们就可以继承教师类而扩展特有的种类属性,而普遍属性已经直接继承了下来。
而接口呢~还是拿教师做例子,教师的行为很多,除了和普通人相同的以外,还有职业相关的行为,比如改考卷,讲课等等,我们把这些行为定义成无body的方法,作为一个集合,它是一个interface。而教师张三李四的各自行为特点又有不同,那么他们就可以扩展自己的行为body。从这点意义上来说,interface偏重于行为。
总之,在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。
 推荐阅读:详细解析抽象类和接口的区别

推荐阅读:详细解析抽象类和接口的区别