PHP 7.3 不允许无访问修饰符的类属性声明,必须显式使用 public/protected/private;var $name; 虽可运行但已过时并触发 E_DEPRECATED 警告。

PHP 7.3 中类属性没有显式声明访问修饰符时,默认是 public,这不是“新特性”,而是沿袭自 PHP 5.x 的历史行为,且在 PHP 7.3 中依然有效——但需注意:这种写法已被标记为过时(deprecated)并强烈不推荐。
默认是 public,但 var 写法已过时
在 PHP 7.3(及更早版本),以下两种写法等价:
class User {
var $name; // ✅ 语法合法,但已过时(deprecated)
public $email; // ✅ 推荐写法,明确意图
}-
var $name;是 PHP 4 风格的旧语法,PHP 5.0 起就支持public/protected/private,而从 PHP 7.2 开始,var已被官方文档明确标注为 obsolete; - PHP 7.3 并未移除
var,但使用它会触发E_DEPRECATED警告(运行时可见); - 若未写任何修饰符(如直接写
$name;),PHP 7.3 会报解析错误(Parse error),不再容忍无修饰符的属性声明。
⚠️ 所以严格来说:PHP 7.3 不存在“隐式默认 public” ——你必须显式写
public、protected或private,否则代码无法通过语法检查。var是唯一能“绕过修饰符”的旧入口,但它不是“默认”,而是被保留的兼容写法。
为什么设计成必须显式声明?
- 强化封装意识:强制开发者思考“这个属性该不该被外部访问”;
-
提升类型安全基础:为 PHP 7.4+ 的类型化属性(如
public string $name;)铺路; -
避免歧义:
$name;看似简洁,实则语义缺失,易引发维护风险。
实际验证示例
// PHP 7.3 下运行以下代码:
class Test {
$a; // Parse error: syntax error, unexpected '$a' (T_VARIABLE)
var $b; // Warning: Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP
}✅ 正确写法(PHP 7.3 兼容且无警告):
立即学习“PHP免费学习笔记(深入)”;
class Test {
public $a;
protected $b;
private $c;
}小结关键点
- PHP 7.3 不允许无修饰符的属性(如
$name;),会直接报错; -
var $name;仍可运行,但触发E_DEPRECATED警告,属于技术债; - 唯一合规、无警告、面向未来的写法是显式使用
public/protected/private; - 这一规则不是“原理深奥”,而是语言演进中对代码可维护性与静态分析友好的主动约束。



















