2

有没有办法$this在 PHP 中设置或修改变量?就我而言,我需要调用一个匿名函数,其中$this引用的类不一定是发出调用的类。

示例

function test() { 
    echo $this->name;
}

$user = new stdclass;
$user->name = "John Doe";

call_user_func(array($user, "test"));

注意:这会产生错误,因为事实上,该函数需要一个包含对象和该对象中存在的方法的数组,而不是任何全局范围的方法。

4

2 回答 2

6

为什么不尝试将函数定义设置为接受一个对象作为参数呢?例如:

function test($object) {
    if (isset($object->name)) // Make sure that the name property you want to reference exists for the class definition of the object you're passing in.
        echo $object->name;
    }
}

$user = new stdclass;
$user->name = "John Doe";

test($user); // Simply pass the object into the function.

变量 $this 在类定义中使用时,指的是类的对象实例。在类定义之外(或在静态方法定义中),变量 $this 没有特殊含义。当您尝试在 OOP 模式之外使用 $this 时,它会失去意义,并且依赖于 OOP 模式的 call_user_func() 将无法按照您尝试的方式工作。

如果您以非 OOP 方式使用函数(如全局函数),则该函数不绑定到任何类/对象,并且应该以非 OOP 方式编写(传递数据或以其他方式使用全局函数)。

于 2013-07-15T01:28:16.440 回答
5

您可以在闭包对象上使用bind方法来更改this特定上下文中的含义。请注意,此功能在 PHP 5.4 中可用。

官方说明

复制具有特定绑定对象和类范围的闭包

  class TestClass {
       protected $var1 = "World";
  }
  $a = new TestClass();

  $func = function($a){ echo  $a." ".$this->var1; };
  $boundFunction = Closure::bind($func, $a, 'TestClass');

  $boundFunction("Hello");

  // outputs Hello World

此语法的替代方法是使用闭包实例的 bindTo 方法(匿名函数)

  class TestClass {
       protected $var1 = "World";
  }
  $a = new TestClass();

  $func = function($a){ echo  $a." ".$this->var1; };
  $boundFunction = $func->bindTo($a, $a);

  $boundFunction("Hello");

  // outputs Hello World

在您的示例中,相关代码将是

$test = function() {
    echo $this->name;
};

$user = new stdclass;
$user->name = "John Doe";

$bound = $test->bindTo($user, $user);
call_user_func($bound);
于 2013-07-15T01:58:46.763 回答