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);

Working example on 3v4l.org

在 PHP 5.6 中,$masked 将是字符串 'foo', 而不是 $ex 对象。

根据您在 3v4l.org link 中看到的不同版本的输出,从 7.0.0-7.0.6 有一段短暂的时间 $this参数显然会被忽略以支持对象自引用。我假设他们不允许在以后的版本中使用 $this 作为参数,以避免 $this 在闭包范围中实际引用的内容不明确。

看起来这只是在原始代码中混淆了命名。为了让它像以前一样工作:

->andReturnUsing(function ($anyOtherName) {
    return $anyOtherName;
});