PHP字符串处理函数实战指南
0
12
2026年6月17日
表单验证类
<?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规范。
技术分享,欢迎评论区交流讨论。
在线咨询
上一个应该是我,我买了一年,实在没价值,...