php类中定义变量必须使用public、protected或private访问修饰符,php 7.4+严格要求;静态变量属类本身,需用self::或static::访问;属性类型声明须与默认值兼容,复杂初始化应在__construct()中完成。

PHP类中定义变量必须用访问修饰符
不加 public、protected 或 private 的变量在类里直接报错,PHP 7.4+ 会直接拒绝解析。这不是风格问题,是语法硬性要求。
-
public $name;:外部可读可写,适合配置项或简单数据透出 -
private $cache;:仅本类可用,避免被子类意外覆盖或误用 -
protected $connection;:本类 + 子类可用,继承场景下最常用 - 不能写
var $old_style;—— 这是 PHP 4 的遗留写法,已废弃且在严格模式下报错
静态变量和普通变量别混用
静态变量属于类本身,不是某个实例;普通变量属于每个对象实例。用错会导致状态污染或空指针。
-
public static $counter = 0;:所有实例共享一份,适合计数器、单例句柄 -
public $id;:每个new MyClass()都有独立一份 - 错误示例:
$this::$counter是错的,应该用self::$counter或static::$counter - 静态变量不能用
$this->访问,否则运行时报Fatal error: Using $this when not in object context
类型声明和默认值要对齐
PHP 7.4+ 支持属性类型声明,但和默认值配合时容易踩坑:类型必须能容纳默认值,且 null 值需显式允许。
升级说明:1.头像上传部分浏览器没法选择bug2.后台增加会员登录次数,后台修改会员密码功能3.b2c广告后台可以控制4.商品详情页面显示b2c返利价格和淘宝返积分bug5.修复360安全检测检测出的 注册页面有跨站脚本攻击漏洞bug6.邀请好友链接地址bug7.后台自定义采集bug, 采集后商品分类的数量不变bug8.后台30天推广量 单位错误bug9.修复用户中心修改emali不起作用的b
-
public string $name = '';✅ 合法 -
public int $count = null;❌ 报错:null 不是 int -
public ?int $count = null;✅ 允许 null,但注意这是可空类型,调用方需判空 -
public array $items = [];✅ 空数组合法;但= new ArrayObject()就不行,因为类型是array,不是对象
构造函数里赋值比声明时更灵活
声明时设默认值适合固定常量;但涉及依赖注入、条件初始化、或需要调用方法时,得在 __construct() 里做。
立即学习“PHP免费学习笔记(深入)”;
- 声明期只能用字面量:
public string $env = 'dev';✅;public string $now = date('Y-m-d');❌ 不允许函数调用 - 想用
new DateTime()或读配置?必须放构造函数:$this->logger = new Logger($config['level']); - 如果变量可能为 null,又不想强制类型声明,可以只声明类型,不设默认值:
private Logger $logger;,然后在__construct()中赋值(PHP 8.0+ 支持)
private 或漏掉 ? 都会立刻暴露问题,而不是等到运行时才发现。









