记录学习与后端知识并分享学习代码过程(会飞的鱼Blog)

PHP字符串处理函数实战指南

会飞的鱼 0 12 2026年6月17日

PHP字符串处理函数实战指南

表单验证类

<?php
class FormValidator {
    private $errors = [];
    private $data = [];

    public function required($field, $label, $value) {
        if (empty(trim($value))) {
            $this->errors[$field] = "{$label}不能为空";
            return false;
        }
        $this->data[$field] = trim($value);
        return true;
    }

    public function email($field, $label, $value) {
        if (!filter_var(trim($value), FILTER_VALIDATE_EMAIL)) {
            $this->errors[$field] = "{$label}格式不正确";
            return false;
        }
        $this->data[$field] = strtolower(trim($value));
        return true;
    }

    public function minLength($field, $label, $value, $min) {
        if (strlen(trim($value)) < $min) {
            $this->errors[$field] = "{$label}最少{$min}个字符";
            return false;
        }
        return true;
    }

    public static function safeOutput($data) {
        return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
    }

    public function passes() {
        return empty($this->errors);
    }

    public function getErrors() {
        return $this->errors;
    }
}
?>

PDO数据库类

<?php
class Database {
    private $pdo;
    private static $instance = null;

    private function __construct() {
        $dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
        $options = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false,
        ];
        $this->pdo = new PDO($dsn, 'user', 'pass', $options);
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function fetchOne($sql, $params = []) {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetch();
    }

    public function fetchAll($sql, $params = []) {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }

    public function insert($table, $data) {
        $columns = implode(', ', array_keys($data));
        $placeholders = ':' . implode(', :', array_keys($data));
        $sql = "INSERT INTO {$table} ({$columns}) VALUES ({$placeholders})";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($data);
        return $this->pdo->lastInsertId();
    }

    public function update($table, $data, $where, $whereParams) {
        $sets = [];
        foreach (array_keys($data) as $k) {
            $sets[] = "{$k} = :{$k}";
        }
        $sql = "UPDATE {$table} SET " . implode(', ', $sets) . " WHERE {$where}";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute(array_merge($data, $whereParams));
        return $stmt->rowCount();
    }
}
?>

文件上传类

<?php
class FileUploader {
    private $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
    private $maxSize = 2097152;
    private $uploadDir = 'uploads/';

    public function upload($fileField) {
        if (!isset($_FILES[$fileField]) || $_FILES[$fileField]['error'] !== UPLOAD_ERR_OK) {
            return ['success' => false, 'message' => '上传失败'];
        }

        $file = $_FILES[$fileField];
        $finfo = new finfo(FILEINFO_MIME_TYPE);
        $mimeType = $finfo->file($file['tmp_name']);

        if (!in_array($mimeType, $this->allowedTypes)) {
            return ['success' => false, 'message' => '文件类型不允许'];
        }

        if ($file['size'] > $this->maxSize) {
            return ['success' => false, 'message' => '文件超过大小限制'];
        }

        $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
        $filename = uniqid() . '.' . $extension;
        $filepath = $this->uploadDir . $filename;

        if (!is_dir($this->uploadDir)) {
            mkdir($this->uploadDir, 0755, true);
        }

        if (move_uploaded_file($file['tmp_name'], $filepath)) {
            return ['success' => true, 'filename' => $filename, 'path' => $filepath];
        }
        return ['success' => false, 'message' => '保存失败'];
    }
}
?>

用户认证类

<?php
class Auth {
    public function login($username, $password) {
        $user = Database::getInstance()->fetchOne(
            "SELECT * FROM users WHERE username = ?",
            [$username]
        );

        if (!$user || !password_verify($password, $user['password'])) {
            return false;
        }

        $_SESSION['user_id'] = $user['id'];
        $_SESSION['username'] = $user['username'];
        return $user;
    }

    public function register($username, $email, $password) {
        $hashed = password_hash($password, PASSWORD_DEFAULT);
        return Database::getInstance()->insert('users', [
            'username' => $username,
            'email' => $email,
            'password' => $hashed,
            'created_at' => date('Y-m-d H:i:s')
        ]);
    }

    public function logout() {
        session_destroy();
    }

    public function check() {
        return isset($_SESSION['user_id']);
    }
}
?>

分页类

<?php
class Paginator {
    private $total;
    private $perPage;
    private $currentPage;

    public function __construct($total, $perPage = 10) {
        $this->total = $total;
        $this->perPage = $perPage;
        $this->currentPage = max(1, intval($_GET['page'] ?? 1));
    }

    public function getOffset() {
        return ($this->currentPage - 1) * $this->perPage;
    }

    public function getLimit() {
        return $this->perPage;
    }

    public function getTotalPages() {
        return ceil($this->total / $this->perPage);
    }

    public function render() {
        $html = '<div class="pagination">';
        for ($i = 1; $i <= $this->getTotalPages(); $i++) {
            $active = $i == $this->currentPage ? 'active' : '';
            $html .= "<a href="?page={$i}" class="{$active}">{$i}</a>";
        }
        $html .= '</div>';
        return $html;
    }
}
?>

缓存类

<?php
class Cache {
    private $path = 'cache/';

    public function get($key) {
        $file = $this->path . md5($key) . '.cache';
        if (!file_exists($file)) return null;

        $data = unserialize(file_get_contents($file));
        if ($data['expire'] < time()) {
            unlink($file);
            return null;
        }
        return $data['content'];
    }

    public function set($key, $content, $ttl = 3600) {
        if (!is_dir($this->path)) {
            mkdir($this->path, 0755, true);
        }
        $data = [
            'expire' => time() + $ttl,
            'content' => $content
        ];
        file_put_contents($this->path . md5($key) . '.cache', serialize($data));
    }
}
?>

最佳实践

始终验证和过滤用户输入,使用预处理语句防止SQL注入,开启OPcache获得性能提升,记录错误日志,使用Composer自动加载遵循PSR-4规范。


技术分享,欢迎评论区交流讨论。

本文由 @会飞的鱼 于 2026-6-17 发布在 会飞的鱼Blog,如无特别说明,本博文章均为原创,转载请保留出处。

网友评论

    暂无评论

会飞的鱼 在线咨询

在线时间:9:00-22:00
周六、周日:14:00-22:00