php类属性声明必须带访问修饰符且类型紧随其后,未初始化或类型不匹配会报错。例如public int $id;合法,而private $email;非法;默认值仅支持字面量和null,不可调用函数。

必须带访问修饰符,不能裸写 $name
PHP 类中声明属性时,public、protected、private 三者缺一不可。直接写 $id = 123 会报 Parse error: syntax error, unexpected '$id' —— 这是初学者最常卡住的地方。
-
public int $id;✅ 合法:修饰符 + 类型 + 变量名 -
protected array $tags = [];✅ 合法:支持字面量默认值 -
private $email;❌ 非法:无类型且无修饰符(PHP 7.4+ 要求类型或至少显式修饰符) -
var $count;⚠️ 不推荐:等价于public,但已被标记为过时
int、?string 等类型写在修饰符后面,顺序不能颠倒
类型声明位置固定:必须紧接在访问修饰符之后、变量名之前。写成 public $name: string 或 string public $name 都会解析失败。
-
public bool $active = true;✅ -
private ?DateTime $createdAt;✅ 注意:类名类型(如DateTime)不需要引号 -
public string|null $note;❌ 错误:PHP 7.4 不支持联合类型语法,要用?string -
protected int $id = "123";❌ 运行时报TypeError:类型检查在赋值时触发,哪怕构造函数里也一样
默认值只允许 null、字面量,不能调用函数
属性初始化阶段不执行任何表达式,仅接受编译期可确定的值。试图写 time()、new DateTime() 或 __DIR__ 都会触发解析错误。
-
public string $env = 'production';✅ -
public ?string $token = null;✅?Type形式必须配= null -
public array $config = ['debug' => false];✅ 支持数组字面量 -
public int $ts = time();❌ 报Parse error: syntax error, unexpected 'time' -
public static $counter = 0;✅static是额外修饰符,要放在最前面:public static int $counter;
未初始化就访问会直接抛 Error,不是 Notice
PHP 7.4+ 对类型属性做了更严格的生命周期约束:声明了类型,就必须在对象实例化完成前完成初始化,否则运行时崩溃。
- 构造函数里漏赋值:
$this->id没设值 → 实例化后读取$user->id抛Error: Typed property User::$id must be initialized - 使用
??或isset()无法绕过:类型属性不存在“未定义”状态,只有“已初始化”或“未初始化”两种 - 解决方案只有两个:
public int $id = 0;(给默认值),或确保__construct()中赋值
private array $data,你就不能再往里面塞字符串,也不能在子类里直接读它,连 IDE 补全都会按这个契约工作。最容易被忽略的是初始化时机:不是“声明即存在”,而是“声明即承诺已准备好”。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











