原生PHP如何封装一个用户模型
代码:
<?php
/**
* 用户对象,代表一个注册用户
*
* @property int $id 用户唯一标识 ID,仅设置时被写入数据库
* @property string $username 用户名
* @property string $password 密码的哈希形式
* @property string $email 电子邮箱
* @property string $created_at 注册时间的字符串表示
*/
class User {
/** @var PDO 数据库连接 */
private $pdo;
/** @var int|null 用户 ID */
private $id;
/** @var string 用户名 */
private $username;
/** @var string 密码的哈希形式 */
private $password;
/** @var string 电子邮箱 */
private $email;
/** @var string 注册时间的字符串表示 */
private $created_at;
/**
* 构建一个新的 User 实例
* @param PDO $pdo 一个 PDO 连接对象
* @param string $username 用户名
* @param string $password 密码
* @param string $email 电子邮件
*/
public function __construct(PDO $pdo, string $username, string $password, string $email) {
$this->pdo = $pdo;
$this->username = $username;
$this->setPassword($password);
$this->email = $email;
}
/**
* 设置密码,密码会自动哈希加密
* @param string $password 要设置的密码
*/
public function setPassword(string $password) {
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
/**
* 将 User 实例写入数据库中
* @return bool 是否成功写入数据库
*/
public function save() {
$statement = $this->pdo->prepare('INSERT INTO `users` (`username`, `password`, `email`) VALUES (?, ?, ?)');
$result = $statement->execute([
$this->username,
$this->password,
$this->email,
]);
if ($result) {
$this->id = $this->pdo->lastInsertId();
}
return $result;
}
/**
* 从数据库中读取 User 实例信息
* @param int $id 查询用的 ID
* @return User|null 用户实例,未查询到时返回 null
*/
public static function getById(PDO $pdo, int $id) {
$statement = $pdo->prepare('SELECT * FROM `users` WHERE `id` = ?');
$statement->execute([$id]);
$result = $statement->fetch();
if (!$result) {
return null;
}
$user = new self($pdo, $result['username'], $result['password'], $result['email']);
$user->created_at = $result['created_at'];
$user->id = $result['id'];
return $user;
}
/**
* 从数据库中读取 User 实例信息
* @param string $username 查询用的用户名
* @return User|null 用户实例,未查询到时返回 null
*/
public static function getByUsername(PDO $pdo, string $username) {
$statement = $pdo->prepare('SELECT * FROM `users` WHERE `username` = ?');
$statement->execute([$username]);
$result = $statement->fetch();
if (!$result) {
return null;
}
$user = new self($pdo, $result['username'], $result['password'], $result['email']);
$user->created_at = $result['created_at'];
$user->id = $result['id'];
return $user;
}
/**
* 删除当前 User 实例
* @return bool 是否成功删除当前 User 实例
*/
public function delete() {
if (!$this->id) {
return false;
}
$statement = $this->pdo->prepare('DELETE FROM `users` WHERE `id` = ?');
return $statement->execute([$this->id]);
}
/**
* @return int 用户的唯一 ID
*/
public function getId() {
return $this->id;
}
/**
* @return string 用户名
*/
public function getUsername() {
return $this->username;
}
/**
* @return string 用户注册用的电子邮箱
*/
public function getEmail() {
return $this->email;
}
/**
* 返回注册时间的字符串表示
* @return string 字符串表示
*/
public function getCreatedAt() {
return $this->created_at;
}
}
使用:
<?php
// 创建 PDO 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8mb4', 'myuser', 'mypassword');
// 创建一个新用户
$newuser = new User($pdo, 'testuser', 'password123', 'testuser@example.com');
// 尝试将用户写入数据库
// 若返回值为真,则写入新数据成功
$success = $newuser->save();
if ($success) {
// 从数据库中读取特定用户的信息
$user = User::getByUsername($pdo, 'testuser');
echo "User ID is " . $user->getId() . "\n";
echo "User name is " . $user->getUsername() . "\n";
echo "User email is " . $user->getEmail() . "\n";
echo "User was created at " . $user->getCreatedAt() . "\n";
// 更新用户密码
$user->setPassword('betterpassword');
$user->save();
// 删除用户
$user->delete();
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。