在PHP中设置/替换$ this变量

时间:2013-07-15 01:22:55

标签: php class this

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

示例

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

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

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

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

2 个答案:

答案 0 :(得分: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方式编写(传入数据或使用全局函数)

答案 1 :(得分: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);