外观
常见问题
约 643 字大约 2 分钟
2025-06-19
本文记录 PHP 开发中常见问题的解决方法。
修改 PHP 默认版本
Windows
- 右键"此电脑" → 属性 → 高级系统设置 → 环境变量
- 编辑 Path 变量,调整 php.exe 所在路径的顺序
宝塔面板
修改软连接指向目标版本:
rm -f /usr/bin/php
ln -sf /www/server/php/82/bin/php /usr/bin/php
php -vPDOStatement::bindParam 的陷阱
使用 foreach 配合 bindParam 时容易踩坑,因为 bindParam 第二个参数是引用传递。
问题代码:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', "test");
$query = "INSERT INTO `user` (`username`, `password`) VALUES (:username, :password)";
$statement = $dbh->prepare($query);
$bind_params = [':username' => "laruence", ':password' => "weibo"];
foreach( $bind_params as $key => $value ){
$statement->bindParam($key, $value);
}
$statement->execute();
// 实际执行: VALUES ("weibo", "weibo") - 两个值都是最后一个循环的值!原因:$value 在每次循环中被重新赋值,而 bindParam 保存的是引用,最终两个参数都指向同一个变量。
解决方案:
- 使用
bindValue代替bindParam(推荐) - 直接在
execute()中传递参数数组:
$statement->execute([':username' => 'laruence', ':password' => 'weibo']);- 手动绑定:
$statement->bindParam(':username', $bind_params[':username']);
$statement->bindParam(':password', $bind_params[':password']);PHP 8 常见变更
参数解包语法
// PHP 8.0+ 支持
array(...$array);
func(...$array);named arguments(命名参数)
// PHP 8.0+
str_contains($haystack, $needle);
// 可以这样调用
str_contains(needle: 'o', haystack: 'hello');match 表达式
// PHP 8.0+,替代 switch
$result = match($status) {
'active' => '启用',
'inactive' => '停用',
default => '未知',
};构造函数返回值
// PHP 8.0+ 构造函数不能再返回 string/int 等值
class User {
public function __construct(string $name) {
// 错误:return "ok";
}
}常见报错排查
Allowed memory size exhausted
内存溢出,排查方向:
- 增加
memory_limit:php -d memory_limit=512M script.php - 检查是否有大文件读取/大数据查询未分页
- 使用生成器(
yield)替代一次性加载大数组
Call to undefined function
- 检查扩展是否启用:
php -m - 确认
php.ini中对应扩展已取消注释 - Nginx + PHP-FPM 环境下修改
php.ini后需重启 php-fpm
Headers already sent
输出已发送到浏览器后无法再设置 header。
排查:
- 检查文件开头是否有 BOM 头
- 检查
echo/var_dump是否在header()之后 - 使用输出缓冲:
ob_start()
时区设置
// 方式一:php.ini
date.timezone = Asia/Shanghai
// 方式二:代码中设置
date_default_timezone_set('Asia/Shanghai');
// 方式三:ENV 环境变量
$_ENV['TZ'] = 'Asia/Shanghai';中文乱码
确保以下环节均为 UTF-8:
- 数据库连接:
SET NAMES utf8mb4 - HTML 页面:
<meta charset="utf-8"> - PHP 文件本身:保存为 UTF-8 无 BOM 格式
