
在php面向对象编程中,方法内定义的局部变量无法被同一类的其他方法访问;若需跨方法共享数据,必须将其声明为类的属性(如private $worker = [];),并通过$this->访问。
在php面向对象编程中,方法内定义的局部变量无法被同一类的其他方法访问;若需跨方法共享数据,必须将其声明为类的属性(如private $worker = [];),并通过$this->访问。
上述代码的核心问题在于:$worker 数组在 populate() 方法内部被定义为局部变量,因此它仅在该方法执行期间存在,作用域不延伸至 checkTaxes()。当 checkTaxes() 尝试访问 $worker[$i] 时,PHP 报错“Undefined variable”,因为该变量根本未在此作用域中声明。
✅ 正确做法是将 $worker 声明为类的实例属性(推荐 private 或 protected),使其成为对象状态的一部分:
class Employee {
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 = $salary;
}
function get_salary() {
return $this->salary;
}
function populate() {
// ✅ 使用 $this->workers 操作对象属性
$this->workers[0] = new self();
$this->workers[0]->set_name('Linda');
$this->workers[0]->set_salary(5800);
$this->workers[1] = new self();
$this->workers[1]->set_name('Manuel');
$this->workers[1]->set_salary(2750);
$this->workers[2] = new self();
$this->workers[2]->set_name('Luis');
$this->workers[2]->set_salary(3200);
$this->workers[3] = 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: " . $this->workers[$i]->get_name();
echo " - Salary: " . $this->workers[$i]->get_salary();
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 = [];),不可依赖方法内临时变量;
- 使用 $this-> 访问属性是强制要求,它明确指向当前对象实例;
- self() 替代 employee() 提升可维护性(避免硬编码类名,支持继承);
- 推荐用 for 循环 + count($this->workers) 替代硬编码 4,增强健壮性;
- 类名建议遵循 PascalCase 规范(如 Employee),符合 PSR-1 标准。
通过合理设计属性作用域,可确保对象状态一致性,避免“变量未定义”等常见作用域陷阱。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











