代码:

<?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();

}
文章目录