php类中声明成员变量必须使用public、protected或private修饰符,不可裸写$name = 'xxx';属性初始化仅支持字面量,动态值须在__construct()中赋值;static变量需显式声明并用self::或static::访问;php 7.4+支持类型声明但限制严格。

PHP类中声明成员变量必须用public、protected或private
PHP不允许在类里直接写$name = 'xxx';这种裸变量。不加访问修饰符的变量声明会报致命错误:Parse error: syntax error, unexpected '$name'。
这是初学者最常卡住的地方——以为和函数内定义变量一样自由,其实类上下文完全不一样。
-
public:外部可读可写,子类可继承可访问 -
protected:仅本类及子类可访问,外部不可见 -
private:仅本类内部可用,连子类都访问不到
示例:
class User {
public $id;
protected $email;
private $password;
}
不能在声明时用函数或表达式初始化public/protected/private变量
PHP类属性声明阶段只支持字面量(string、int、null、array等),不能调用time()、new DateTime()或任何函数。
立即学习“PHP免费学习笔记(深入)”;
否则会报错:Parse error: syntax error, unexpected 'new' (T_NEW) 或类似提示。
- ✅ 允许:
public $created_at = null;、public $tags = []; - ❌ 禁止:
public $now = time();、public $dt = new DateTime();
需要动态值?统一放进__construct()里赋值。
static成员变量要显式加static关键字,且访问方式不同
静态变量不属于某个实例,而是整个类共享。漏写static就变成普通属性;写了却不加self::或static::去访问,运行时会出错或取到错误值。
- 声明:
public static $count = 0; - 读取:
self::$count(当前类)或static::$count(后期静态绑定) - 外部访问:
User::$count,不是$user->count
常见误操作:$this->count++ 对静态变量无效,会静默创建一个同名实例属性,原静态值不变。
PHP 7.4+ 支持属性类型声明,但有严格限制
从 PHP 7.4 开始可以写public string $name;,但注意:它不支持默认值为null以外的混合类型,也不能省略访问修饰符。
- ✅ 合法:
public ?string $name = null;、protected int $age = 0; - ❌ 非法:
public $name = 'abc';(无类型)、public string $name = 'abc';(非null默认值需配合?string或类型允许)
类型声明后,赋值时类型不匹配会触发Fatal error,不是警告——这点比函数参数类型更严格。
实际项目里,如果团队还在用 PHP 7.3 或更低版本,这类语法会直接导致解析失败,上线前务必确认环境版本。









