在 PHP 中,我们经常使用 array_walk 函数来对数组中的每个元素应用一个自定义的函数。然而,有时候我们可能会遇到一个问题,就是在 array_walk 函数中使用 $this 会导致错误。本文将介绍这个问题,并提供一个案例代码来说明。
问题描述在 PHP 中,$this 是一个特殊的变量,通常用于引用当前对象的实例。然而,在 array_walk 函数中,$this 并不是指向当前对象的实例,而是指向该函数所在的上下文。这意味着如果我们在 array_walk 函数中使用 $this,就会导致错误。案例代码为了更好地理解这个问题,我们来看一个案例代码。假设我们有一个名为 Person 的类,该类具有一个名为 sayHello 的方法。现在,我们想要使用 array_walk 函数来对一个人员列表中的每个人调用 sayHello 方法。下面是我们尝试实现这个功能的代码:phpclass Person { private $name; public function __construct($name) { $this->name = $name; } public function sayHello() { echo "Hello, my name is " . $this->name . "." . PHP_EOL; }}$people = [ new Person("Alice"), new Person("Bob"), new Person("Charlie")];array_walk($people, function($person) { $person->sayHello();});然而,当我们运行上述代码时,会抛出一个错误:Fatal error: Uncaught Error: Call to undefined method Closure::sayHello()。这是因为在匿名函数中使用 $this 并不会引用到 Person 对象的实例。解决方法为了解决这个问题,我们可以使用闭包函数来替代匿名函数,并通过 use 关键字将 $this 指定为闭包函数的参数。这样,我们就可以在闭包函数中访问到 Person 对象的实例了。下面是修改后的代码:phparray_walk($people, function($person) use ($this) { $person->sayHello();});现在,当我们运行修改后的代码时,就不会再出现错误了。在使用 array_walk 函数时,要注意不要在其中使用 $this,因为它并不会指向当前对象的实例。为了解决这个问题,我们可以使用闭包函数,并通过 use 关键字将 $this 指定为闭包函数的参数。这样,我们就可以在闭包函数中访问到对象的实例了。