gpt4 book ai didi

PHP fatal error : Cannot use $this as parameter

转载 作者:行者123 更新时间:2023-12-03 23:08:05 25 4
gpt4 key购买 nike

我有以下 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作为参数。您应该将参数的名称更改为其他名称,并在闭包中更改相应的变量名称。

通过 PHP 5.6,使用 $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 链接上看到的不同版本的输出,从 7.0.0 到 7.0.6 有一个短暂的时期,其中 $this参数显然会被忽略以支持对象自引用。我假设他们不允许使用 $this在以后的版本中作为参数以避免 $this 的歧义实际上是指闭包范围。

看起来这只是在原始代码中混淆命名。为了使它像以前一样工作:
->andReturnUsing(function ($anyOtherName) {
return $anyOtherName;
});

关于PHP fatal error : Cannot use $this as parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46348298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com