在上一章,我们写了一个建立用户user类,直接使用user类读取用户信息的类。假设我们又有了新的需求。
任何用户都可以查看别的用户的信息,当然不能看到别人的密码。
任何用户都可以修改自己的密码。
于是我们对第一章的类做些改动,首先我们在userInfo类中,将获得密码的方法隐藏。
我们再写一个UserChange类继承自userInfo,在UserChange中增加修改密码的方法。并将获取密码的方法重写为public权限。
这样,在你的页面中,就可以创建两种user。一种是只能看到信息不能看到密码、不能修改密码的userInfo的实例。另外一种是比userInfo功能更强的UserChange类,这个实例可以修改密码,可以获得密码。
在合适的位置创建不同的user,就是你的业务逻辑的内容了。
同时,我们独立出一个数据库连接类,数据库连接类比较完善的网上有很多,大家学习完毕面向对象后,自己也可以写出更完善的数据库类。
数据库配置类 db_config.php
// 数据库配置文件, db_config.php
$db_server = "localhost";
$db_user = "root";
$db_pwd = "123";
$db_name = "test";
?>
Mysql连接类
class MysqlConn {
private $conn;
private $my_db;
private $result;
public function __construct() {
require_once("db_config.php");
$this->conn = mysql_pconnect($db_server, $db_user, $db_pwd);
$this->my_db = mysql_select_db($db_name,$this->conn);//选择数据库
}
public function query($sql){
$this->result = mysql_query($sql, $this->conn); // 执行查询语句
return $this->result;
}
public function next(){
return $row = mysql_fetch_array($this->result);
}
public function close(){
mysql_free_result($this->result);
}
//使用转义字符,保证系统安全.
public function escapeString($str){
return mysql_escape_string($str);
}
}
?>
父类User类
// class_user.php
require_once("class_mysqlConn.php");
class UserInfo{
protected $userName; //属性,用户名
protected $userPSW ; //属性,用户密码
protected $userAge ; //属性,用户年龄
protected $userGrade ; //属性,用户级别
protected $userInfo; //存储数据库返回信息的数组变量.
protected $mysqlConn;
public function __construct($name){
$this->mysqlConn = new MysqlConn();
$sql = "select * from e_user where username='$name' "; //查询的sql
$rs = $this->mysqlConn->query($sql);
$this->userInfo = $this->mysqlConn->next();
$this->getInfo(); //调用传递信息的方法.
}
// 获取信息传递给属性的方法
protected function getInfo(){
$this->userName = $this->userInfo["username"];
$this->userPSW = $this->userInfo["userpsw"];
$this->userAge = $this->userInfo["userage"];
$this->userGrade = $this->userInfo["usergrade"];
}
//返回每个属性的public 方法.
public function getUserName(){
return $this->userName;
}
protected function getUserPSW(){
return $this->userPSW;
}
public function getUserAge(){
return $this->userAge;
}
public function getUserGrade(){
return $this->userGrade;
}
}
?>
子类 class_userChange.php 类
添加了修改密码的方法,重写并公开了获取密码的方法。
// class_userChange.php
require_once("class_user.php");
class UserChange extends UserInfo {
public function setUserPSW($pws){
$pws = $this->mysqlConn->escapeString($pws); // 过滤特殊字符
$username = $this->mysqlConn->escapeString($this->userName);// 过滤
$sql = "Update e_user set userpsw ='$pws' ";
$sql .= " where username = '$username'"; //查询的sql
$rs = $this->mysqlConn->query($sql); //执行
if($rs){
$this->userPSW = $pws;
}
return $rs;
}
public function getUserPSW(){ //重写的getUserPSW方法。
return $this->userPSW;
}
}
?>
在任何位置都可以放心使用userInfo类。
//viewuser.php
require_once("class_user.php");
$user = new UserInfo("Tom"); //创建一个user对象.
$username = $user->getUserName(); //分别调用方法取得数据
$userage = $user->getUserAge();
$usergrade = $user->getUserGrade();
echo "$username name is ".$username."
"; //输出数据
echo "$username age is ".$userage."
" ;
echo "$username grade is ".$usergrade."
" ;
?>
可以重设密码的Userchange类的实例。
$password = "898"; //重设的密码
require_once("class_userChange.php");
$user = new UserChange("Jack"); //创建一个可以修改密码的user对象.
$username = $user->getUserName(); //分别调用方法取得数据
$userpsw = $user->getUserPSW();
$userage = $user->getUserAge();
$usergrade = $user->getUserGrade();
//这些和user类的一样,用起来很舒服。
echo "your name is ".$username."
"; //输出数据
echo "your password is ".$userpsw."
" ;
echo "your age is ".$userage."
" ;
echo "your grade is ".$usergrade."
" ;
//如果设置成功,显示新的密码。
if($user->setUserPSW($password)){
echo "you password be changed to ".$userpsw = $user->getUserPSW();
//这里,密码被重设了。
}
?>
延伸阅读
此文章所在专题列表如下: