PHP Fatal error: Cannot use $this as parameter
PHP Fatal error: Cannot use $this as parameter
我有以下 PHP 方法,它是工作正常的代码库的一部分:
<?php
class HooksTest extends DrupalTestCase {
public function testPageAlterIsLoggedIn() {
$this->drupal->shouldReceive('userIsLoggedIn')
->once()
->andReturn(TRUE);
$this->drupal->shouldReceive('drupalPageIsCacheable')
->once()
->andReturnUsing(function ($this) {
return $this;
});
$page = [];
$cacheable = $this->object->pageAlter($page);
$this->assertFalse($cacheable);
}
}
代码之前通过了所有 CI 测试(使用 phpunit
)。
但是现在当我通过 php HooksTest.php
调用文件时,出现以下错误:
PHP Fatal error: Cannot use $this
as parameter in HooksTest.php
on line 11
Fatal error: Cannot use $this
as parameter in HooksTest.php
on line 11
我已经用 PHP 7.1、7.2 和同样的问题进行了测试。我相信它在 PHP 5.6.
中有效
如何将上面的代码转换成相同的意思?
从函数参数中删除 $this
是否足够?
跳过$this
参数,改变
function ($this) {
return $this;
}
至
function () {
return $this;
}
查看 示例 #5 Anonymous functions 页面上 $this
的自动绑定:
<?php
class Test
{
public function testing()
{
return function() {
var_dump($this);
};
}
}
$object = new Test;
$function = $object->testing();
$function();
?>
是的,正如 aynber 之前所说,您不能将 $this 作为函数参数传入。通过这样做,您基本上是在重新声明它。您应该将其作为函数参数删除。
如果您希望它像以前一样工作,则不应删除 $this
作为参数。你应该把参数的名字改成别的,闭包里面相应的变量名也改一下。
到 PHP 5.6,在 class 方法的闭包中使用 $this
作为参数会屏蔽引用父对象的 $this
。例如:
class Example
{
public function test ($param) {
$closure = function ($whatever) { // $this not used as parameter
return $this; // $this refers to the Example object
};
return $closure($param);
}
public function test2 ($param) {
$closure = function($this) { // $this used as parameter
return $this; // $this no longer refers to Example object
};
return $closure($param);
}
}
$ex = new Example;
$not_masked = $ex->test('foo');
$masked = $ex->test2('foo');
var_dump($not_masked, $masked);
在 PHP 5.6 中,$masked
将是字符串 'foo', 而不是 $ex
对象。
根据您在 3v4l.org link 中看到的不同版本的输出,从 7.0.0-7.0.6 有一段短暂的时间 $this
参数显然会被忽略以支持对象自引用。我假设他们不允许在以后的版本中使用 $this
作为参数,以避免 $this
在闭包范围中实际引用的内容不明确。
看起来这只是在原始代码中混淆了命名。为了让它像以前一样工作:
->andReturnUsing(function ($anyOtherName) {
return $anyOtherName;
});
我有以下 PHP 方法,它是工作正常的代码库的一部分:
<?php
class HooksTest extends DrupalTestCase {
public function testPageAlterIsLoggedIn() {
$this->drupal->shouldReceive('userIsLoggedIn')
->once()
->andReturn(TRUE);
$this->drupal->shouldReceive('drupalPageIsCacheable')
->once()
->andReturnUsing(function ($this) {
return $this;
});
$page = [];
$cacheable = $this->object->pageAlter($page);
$this->assertFalse($cacheable);
}
}
代码之前通过了所有 CI 测试(使用 phpunit
)。
但是现在当我通过 php HooksTest.php
调用文件时,出现以下错误:
PHP Fatal error: Cannot use
$this
as parameter inHooksTest.php
on line 11Fatal error: Cannot use
$this
as parameter inHooksTest.php
on line 11
我已经用 PHP 7.1、7.2 和同样的问题进行了测试。我相信它在 PHP 5.6.
中有效如何将上面的代码转换成相同的意思?
从函数参数中删除 $this
是否足够?
跳过$this
参数,改变
function ($this) {
return $this;
}
至
function () {
return $this;
}
查看 示例 #5 Anonymous functions 页面上 $this
的自动绑定:
<?php
class Test
{
public function testing()
{
return function() {
var_dump($this);
};
}
}
$object = new Test;
$function = $object->testing();
$function();
?>
是的,正如 aynber 之前所说,您不能将 $this 作为函数参数传入。通过这样做,您基本上是在重新声明它。您应该将其作为函数参数删除。
如果您希望它像以前一样工作,则不应删除 $this
作为参数。你应该把参数的名字改成别的,闭包里面相应的变量名也改一下。
到 PHP 5.6,在 class 方法的闭包中使用 $this
作为参数会屏蔽引用父对象的 $this
。例如:
class Example
{
public function test ($param) {
$closure = function ($whatever) { // $this not used as parameter
return $this; // $this refers to the Example object
};
return $closure($param);
}
public function test2 ($param) {
$closure = function($this) { // $this used as parameter
return $this; // $this no longer refers to Example object
};
return $closure($param);
}
}
$ex = new Example;
$not_masked = $ex->test('foo');
$masked = $ex->test2('foo');
var_dump($not_masked, $masked);
在 PHP 5.6 中,$masked
将是字符串 'foo', 而不是 $ex
对象。
根据您在 3v4l.org link 中看到的不同版本的输出,从 7.0.0-7.0.6 有一段短暂的时间 $this
参数显然会被忽略以支持对象自引用。我假设他们不允许在以后的版本中使用 $this
作为参数,以避免 $this
在闭包范围中实际引用的内容不明确。
看起来这只是在原始代码中混淆了命名。为了让它像以前一样工作:
->andReturnUsing(function ($anyOtherName) {
return $anyOtherName;
});