
在 PHP 面向对象编程中,方法内部定义的变量(如 $worker)属于局部作用域,无法被同一类的其他方法直接访问;必须将其声明为类属性(如 private $worker = [];),并通过 $this->worker 统一管理,才能实现方法间的数据共享。
在 php 面向对象编程中,方法内部定义的变量(如 `$worker`)属于局部作用域,无法被同一类的其他方法直接访问;必须将其声明为类属性(如 `private $worker = [];`),并通过 `$this->worker` 统一管理,才能实现方法间的数据共享。
上述代码的核心问题在于:$worker 数组在 populate() 方法内被定义为局部变量,因此在 checkTaxes() 中完全不可见——PHP 会报出 Undefined variable: worker 错误。这不是语法或调用方式的问题(如 $obj 引用本身是正确的),而是典型的作用域误解:类的方法彼此独立,不自动共享局部变量。
✅ 正确做法是将 $worker 提升为类的实例属性,使其成为对象状态的一部分:
<?php class Employee {
// 实例属性(建议使用 PascalCase 命名类,snake_case 或 camelCase 命名属性/方法)
public $name;
public $salary = 0;
private $workers = []; // ✅ 声明为私有属性,初始化为空数组
function set_name($name) {
$this->name = $name;
}
function get_name() {
return $this->name;
}
function set_salary($salary) {
$this->salary = (float)$salary;
}
function get_salary() {
return $this->salary;
}
function populate() {
// ✅ 使用 $this->workers 操作类属性
$this->workers[] = new self(); // 更健壮:用 self() 替代硬编码类名
$this->workers[0]->set_name('Linda');
$this->workers[0]->set_salary(5800);
$this->workers[] = new self();
$this->workers[1]->set_name('Manuel');
$this->workers[1]->set_salary(2750);
$this->workers[] = new self();
$this->workers[2]->set_name('Luis');
$this->workers[2]->set_salary(3200);
$this->workers[] = new self();
$this->workers[3]->set_name('Carly');
$this->workers[3]->set_salary(2999);
}
function checkTaxes() {
// ✅ 现在 $this->workers 可被安全访问
for ($i = 0; $i workers); $i++) {
echo "Name: " . htmlspecialchars($this->workers[$i]->get_name());
echo " - Salary: $" . number_format($this->workers[$i]->get_salary(), 2);
if ($this->workers[$i]->get_salary() >= 3000) {
echo " - You have to pay taxes!<br><br>";
} else {
echo " - You don't have to pay taxes!<br><br>";
}
}
}
}
// 使用示例
$obj = new Employee();
$obj->populate();
$obj->checkTaxes();
?>
? 关键改进说明:
- private $workers = [];:明确声明为私有属性,避免外部意外修改,符合封装原则;
- 所有对 $worker 的读写均通过 $this->workers 进行,确保作用域一致;
- 使用 self() 替代 new employee(),提升可维护性(类重命名时无需逐处修改);
- for 循环替代 while + 手动计数,更安全且自动适配数组长度变化;
- 添加 htmlspecialchars() 和 number_format() 提升输出安全性与可读性。
⚠️ 注意事项:
- 不要将业务逻辑(如创建多个员工)全塞进单个类的 populate() 中——理想设计应由外部控制器负责实例化与组装,该类专注单一职责(描述一个员工);
- 若需批量管理,建议分离出 EmployeeManager 类,使职责更清晰;
- PHP 严格区分 public/protected/private,误用 public 属性可能破坏数据一致性,应优先用 private + 公共 getter/setter 控制访问。
掌握类属性与方法作用域的关系,是写出可维护、可扩展 OOP 代码的基础一步。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











