php公有属性必须用public关键字显式声明,如public $name;或public $count = 0;,不可省略修饰符或使用var、函数调用等非法写法。

PHP公有属性怎么写才合法
PHP里公有属性必须用 public 关键字显式声明,不能省略,也不能靠“不加修饰符”来默认实现——那是PHP 4的老习惯,早就不支持了。
常见错误是直接写 $name = 'test'; 在类里,结果报错 Parse error: syntax error, unexpected '='。因为PHP要求所有属性必须先声明访问控制符,再声明变量名和可选默认值。
-
public $name;—— 合法,未初始化,值为null -
public $count = 0;—— 合法,支持标量、数组、null、string、int等字面量,默认值(PHP 7.4+ 支持array和[]) -
public $now = time();—— 非法,函数调用不能作为属性默认值 -
public static $cache;—— 这是静态属性,不是实例公有属性,别混用
public 属性和没加修饰符的区别
在PHP 8中,类里写 $id = 1; 直接报错;PHP 7.4 会触发 E_COMPILE_ERROR。所谓“默认 public”只存在于 PHP 4 的历史文档里,现代PHP一律不认。
有人从老项目抄代码,看到没加 public 就以为能跑,实际一执行就挂。这不是兼容性问题,是语法错误。
立即学习“PHP免费学习笔记(深入)”;
- 没加任何修饰符 → 解析失败,根本加载不了类
- 写了
var $data;→ PHP 7.4+ 已废弃,会警告Deprecated: Using "var" is deprecated - 写了
public $data;→ 唯一安全、明确、可读的写法
public 属性在继承和外部访问时要注意什么
公有属性可以被子类直接读写,也能被实例外任意代码修改,这是它最核心的特点,也是最大风险点。
比如你定义了 public $status;,别人 new 出对象后直接赋值 $obj->status = 'deleted';,你完全拦不住。不像 private 或 protected 至少能用 getter/setter 控制逻辑。
- 子类中重写同名
public属性,不会覆盖父类声明,而是各自独立存在(PHP 不支持属性重载) - 如果父类用
public $config;,子类也写public $config;,那只是两个同名但无关的属性 - 想让子类强制校验赋值?必须改用
protected+public function setConfig()
PHP 8.2+ 属性类型声明要不要加
加类型声明不是必须的,但加上之后,PHP 会在赋值时做运行时检查,能提前暴露很多问题。
比如 public string $name;,如果后续写了 $obj->name = null;,PHP 8.2+ 会直接报 TypeError。没加类型的话,这个 null 就静默进去了,后面调用 strlen($obj->name) 才崩。
-
public ?string $desc;—— 允许null,推荐用于可能为空的字段 -
public array $items = [];—— PHP 8.1+ 支持,比public $items = [];更安全 - 不要写
public mixed $data;来图省事,这等于放弃类型约束,跟不写一样
类型声明不是装饰,它是运行时真实生效的检查机制。不加,就等于把数据校验责任全甩给业务代码自己扛。









