
本文讲解在 PHP 类中如何将外部变量(如 $quantity)安全、灵活地赋值给类内的公共或受保护数组属性,重点介绍构造函数注入和 setter 方法两种推荐实践,并包含输入验证与使用示例。
本文讲解在 php 类中如何将外部变量(如 `$quantity`)安全、灵活地赋值给类内的公共或受保护数组属性,重点介绍构造函数注入和 setter 方法两种推荐实践,并包含输入验证与使用示例。
在 PHP 面向对象编程中,类属性不能直接引用外部作用域的变量(如 $quantity),因此你无法在类定义体内直接使用 [$quantity value here] 这样的写法——这会导致语法错误或未定义变量警告。正确的做法是将值通过运行时机制传入类实例,而非编译期静态初始化。
✅ 推荐方案:构造函数初始化 + 受保护属性 + 验证型 Setter
为兼顾安全性与灵活性,应避免将 $inventory 声明为 public array 并直接暴露修改入口。更专业的设计是:
- 使用 protected 修饰数组属性,防止外部直接篡改;
- 通过构造函数支持初始化;
- 提供带校验逻辑的 setQuantity() 方法,确保数据合法性(例如禁止负数库存)。
以下是完整可运行的实现:
<?php
class QuantityLeft {
protected array $inventory = [];
public function __construct(int $quantity = 0) {
$this->setQuantity($quantity);
}
public function setQuantity(int $quantity): void {
if ($quantity < 0) {
throw new InvalidArgumentException('Quantity must be non-negative');
}
$this->inventory['Bag'] = $quantity;
}
// 可选:提供安全读取方法
public function getInventory(): array {
return $this->inventory;
}
public function getBagQuantity(): int {
return $this->inventory['Bag'] ?? 0;
}
}
// ✅ 使用示例
$quantity = 10;
// 方式1:构造时传入
$obj1 = new QuantityLeft($quantity);
var_dump($obj1->getInventory()); // ['Bag' => 10]
// 方式2:先创建再设置
$obj2 = new QuantityLeft();
$obj2->setQuantity(50);
var_dump($obj2->getBagQuantity()); // int(50)
// ❌ 以下会抛出异常
// $obj3 = new QuantityLeft(-5); // InvalidArgumentException
?>⚠️ 注意事项
- 不要在属性声明中使用变量:public array $inventory = ['Bag' => $quantity]; 是非法的,PHP 不允许在类属性默认值中引用变量或函数。
- 类型声明增强健壮性:为构造函数参数和 setter 方法添加 int 类型提示(PHP 7.0+),配合严格模式可提前捕获类型错误。
- 扩展性考虑:若需支持多种商品(如 'Shoe', 'Hat'),可将 setQuantity() 改为 setStock(string $item, int $qty),并用 isset($this->inventory[$item]) 做存在性检查。
- 序列化兼容性:protected 属性在 serialize() / JSON 转换时默认包含,如需控制输出,可实现 JsonSerializable 接口。
通过上述方式,你不仅能正确实现 Bag => 10 的预期效果,还能构建出可维护、可验证、符合 PSR-12 规范的现代 PHP 类结构。
立即学习“PHP免费学习笔记(深入)”;



















