php 7.4+ 强制类属性必须显式声明 public/protected/private,var 或无修饰符将报错;public 全局可访问,protected 限类内及子类,private 仅限当前类;php 8.4 新增 set-only 可见性控制。

必须显式声明 public、protected 或 private,否则会触发严格警告或致命错误(PHP 7.4+)
PHP 类属性必须带访问修饰符
PHP 7.4 起强制要求所有类属性声明必须明确使用 public、protected 或 private。用 var 或不写修饰符会报 E_COMPILE_ERROR(PHP 8.0+)或 E_DEPRECATED(PHP 7.4–7.9)。
-
var $name是 PHP 4 遗留语法,已废弃,不要用 -
$name = 'x';(无修饰符)在 PHP 7.4+ 直接报错:「Syntax error, unexpected '$name'」 - 正确写法只有三种:
public $name、protected $age、private $id
不同修饰符的实际访问边界
不是“能不能看到”,而是“在哪段代码里能用 $this->xxx 或 $obj->xxx”——关键看调用上下文。
-
public:类内、子类中、外部实例($obj->xxx)全都能读写 -
protected:类内和子类中可用$this->xxx;但外部调用$obj->xxx会报Fatal error: Cannot access protected property -
private:仅当前类内部可用$this->xxx;子类中访问同名属性会被视为**全新属性**,不是继承;外部调用直接报错
PHP 8.4 新增:不对称属性可见性(set-only 限制)
从 PHP 8.4 开始,可以单独控制属性的「可写范围」,比如只允许类内或子类赋值,但对外只读。
- 语法:
public private(set) string $title→ 外部可读$obj->title,但不能写$obj->title = 'x' - 常见组合:
public protected(set)(子类可改,外部只读)、protected private(set)(仅本类可赋值) - 注意:
set可见性不能比默认可见性更宽,比如private public(set)是非法的 - 不支持
__set()魔术方法绕过——该限制在字节码层强制执行
容易被忽略的继承陷阱
子类重定义父类 protected 属性时,看起来像覆盖,实则是**独立存储**;而 private 根本不可见,子类声明同名属性等于新建一个。
- 父类
private $cache→ 子类无法访问,也无法重定义;子类写private $cache是另一个变量 - 父类
protected $config,子类写protected $config = []→ 子类构造时会覆盖父类初始化值,但两者内存地址不同 - 如果依赖属性引用传递(如数组引用),
protected属性在父子类中不共享底层数据结构
最常出问题的地方不在声明,而在跨类调用时误判了 $this->xxx 的实际归属——尤其当父类和子类都声明了同名 private 属性时,它们完全无关。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











