e_strict 是 php 5.0 引入的建议性警告级别,提示代码存在潜在兼容性或设计问题,不中断执行但需重视;php 8.0+ 已移除,相关提示转为 e_deprecated 或 e_warning。

PHP 中 E_STRICT 是什么错误级别
E_STRICT 不是运行时错误,也不会中断执行,它只是 PHP 在解析或编译阶段发出的“建议性警告”,提醒你代码写法可能在未来版本不兼容、行为不确定,或违背了当前最佳实践。它从 PHP 5.0 引入,但默认**不启用**(error_reporting 默认值不含它),所以很多人根本没见过——直到自己开了 E_ALL 或升级到 PHP 7.4+ 后某些 E_STRICT 提示被合并进 E_DEPRECATED 或直接升级为 E_WARNING。
为什么开启 E_STRICT 后突然报一堆错
常见触发场景不是语法错误,而是「写法太随意」:比如在类外部调用 self::、静态方法里用 $this、继承时方法签名不一致、未声明 public/private/protected 的方法被子类重写等。这些在旧版 PHP 能跑,但 PHP 认为它们埋了隐患。
-
date()没传时区参数 → 触发E_STRICT(PHP 5.1+) - 定义了
__toString()但没返回string→E_STRICT(PHP 5.2+) - 子类重写父类方法,但参数数量/类型提示不一致 →
E_STRICT(PHP 5.4+) - 用
new self()在静态上下文中 → PHP 5.3 开始提示
怎么关掉或过滤 E_STRICT
不建议直接关,但如果你维护的是老项目、暂时无法重构,可以精准屏蔽:
- 运行时临时关闭:
error_reporting(error_reporting() & ~E_STRICT); - 配置文件中禁用:
error_reporting = E_ALL & ~E_STRICT(php.ini或.htaccess) - 开发环境开,生产环境关:用
ini_set('error_reporting', E_ALL ^ E_STRICT)包一层条件判断
注意:E_STRICT 在 PHP 8.0+ 已被完全移除,相关提示转为 E_DEPRECATED 或 E_WARNING;所以如果看到 E_STRICT,说明你还在用 PHP 7.x 或更早版本。
立即学习“PHP免费学习笔记(深入)”;
哪些 E_STRICT 提示真该修,不能忍
别只盯着“不报错就行”。以下几类必须处理,否则升级 PHP 时大概率崩:
- 方法签名不一致(如父类
foo($a),子类foo($a, $b = null))→ PHP 7.2+ 会升级成E_WARNING - 使用已废弃的函数别名(如
mysql_connect()虽然不是E_STRICT,但类似逻辑)→ 实际上很多E_STRICT就是废弃前哨 - 类中访问未声明属性(
$this->undefined)且没定义__get()→ PHP 7.4+ 可能直接报E_WARNING - 静态方法里用
$this→ 看似能跑,但对象状态不可控,PHP 8.0+ 明确禁止
真正麻烦的从来不是报错本身,而是它背后暴露的设计松散——比如一个方法在父类里接受 array,子类却悄悄改成只收 Traversable,这种不兼容藏得深,E_STRICT 是少数能提前揪出来的机制之一。







