php 8.3 创建类必须显式声明属性可见性(禁用 var)、使用合法类名、构造方法需 public 且建议类型声明,属性初始化仅支持字面量,$this 访问不可省略,动态类名削弱类型安全。

PHP 8.3 创建类不是“加个 class 就完事”,关键在语法合规、可见性明确、构造逻辑可靠——漏掉 public 修饰符、误用 var 声明、或在构造方法里没校验参数,都会导致对象属性不可写、$this 报错或实例化静默失败。
class 关键字后必须跟合法类名,且不能用 var 声明属性
PHP 8.3 已完全弃用 var(自 PHP 7.4 起废弃,8.0+ 报 E_DEPRECATED,8.3 运行时直接拒绝解析)。所有属性必须显式使用 public / protected / private 修饰。
-
class User { public $name; private $id; }✅ 合法 -
class User { var $name; }❌ 解析失败,报Parse error: syntax error, unexpected 'var' - 类名必须是合法标识符:首字符为字母或下划线,后续仅含字母、数字、下划线;
UserModel可以,2User或User-Data不行 - 类定义不支持表达式初始化属性(如
public $ts = time();),只能赋字面量或null;动态值必须挪到__construct()中
__construct() 必须显式声明访问控制,且参数类型建议标注
PHP 8.3 强制要求构造方法带访问修饰符,否则默认为 public 但会触发 E_WARNING(尤其在严格模式下)。同时,类型声明能提前拦截非法传参,避免运行时崩溃。
-
public function __construct(string $name, int $age)✅ 推荐:类型安全 + 明确意图 -
function __construct($name)❌ 隐式 public,但无类型约束,new User([])不报错却埋雷 - 构造方法内可用
throw new InvalidArgumentException()主动拒绝非法值,比让属性留空更可控 - 若无需初始化,也必须写
public function __construct() {},空实现比省略更清晰
new 实例化时,类名不能是变量字符串除非明确允许
直接 new User() 最稳妥;用变量类名(如 $class = 'User'; new $class())虽语法允许,但在严格依赖注入或 IDE 补全场景下极易出错,且无法静态分析类型。
-
$u = new User('Alice', 28);✅ 直接调用,IDE 可跳转、类型推导准 -
$cls = 'User'; $u = new $cls('Alice', 28);⚠️ 可运行,但$u类型被推为object,后续调用方法无提示、无校验 - 若必须动态实例化(如工厂模式),优先用
match或配置映射,而非裸字符串拼接类名 -
clone和new self()在 8.3 中行为不变,但注意self指当前类而非实例化时的子类(需static实现后期静态绑定)
对象属性访问必须符合可见性规则,$this 是硬性要求
类内部访问自身属性/方法必须用 $this->prop 或 $this->method();漏掉 $this 会被当作局部变量处理,导致属性未设置、方法未调用却无任何报错。
-
public function setName(string $name): void { $this->name = $name; }✅ 正确 -
public function setName(string $name): void { $name = $name; }❌ 局部变量赋值,$this->name仍是null - 外部访问
private属性(如$u->name)直接报Fatal error: Cannot access private property,不会静默失败 -
isset($u->name)在 8.3 中仍受可见性限制:对private属性返回false,哪怕它已存在
最易被忽略的是构造方法参数类型与实际传入值的隐式转换边界——比如声明 int $id 却传 '123',PHP 8.3 默认启用严格类型检查(declare(strict_types=1)),此时会直接抛 TypeError;不声明则自动转整型,可能掩盖数据污染问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











