Heim >Backend-Entwicklung >PHP-Problem >So geben Sie dies für anonyme Funktionen in PHP an

So geben Sie dies für anonyme Funktionen in PHP an

autoload
autoloadnach vorne
2021-04-06 16:45:192252Durchsuche

So geben Sie dies für anonyme Funktionen in PHP an

In Bezug auf anonyme Schließungsfunktionen besteht ein sehr typisches Problem in JS darin, es an einen this-Bereich zu binden. Tatsächlich besteht dieses Problem auch in PHP, wie zum Beispiel dem folgenden Code: JS中有个很典型的问题就是要给它绑定一个 this 作用域。其实这个问题在PHP中也是存在的,比如下面这段代码:

$func = function($say){
    echo $this->name, ':', $say, PHP_EOL;
};
$func('good'); // Fatal error: Uncaught Error: Using $this when not in object context

    在这个匿名函数中,我们使用了 $this->name 来获取当前作用域下的 $name 属性,可是,这个 $this 是谁呢?我们并没有定义它,所以这里会直接报错。错误信息是:使用了 $this 但是没有对象上下文,也就是说没有指定 $this 引用的作用域。

1.bindTo() 方法绑定 $this

$func = $func->bindTo($lily, 'Lily');
// $func = $func->bindTo($lily, Lily::class);
// $func = $func->bindTo($lily, $lily);
$func1('cool');

    这回就可以正常输出了。 bindTo() 方法是复制一个当前的闭包对象,然后给它绑定 $this 作用域和类作用域。

  •  $lily 参数是一个 object $newthis 参数,也就是给这个复制出来的匿名函数指定 $this

  •  'Lily' 则是绑定一个新的 类作用域 ,它代表一个类型、决定在这个匿名函数中能够调用哪些 私有 和 受保护 的方法

如果不给这个参数,那么我们就不能访问这个 private$name

$func1 = $func->bindTo($lily);
$func1('cool2'); // Fatal error: Uncaught Error: Cannot access private property Lily::$name

In dieser anonymen Funktion verwenden wir $this->name, um den $name-Attribut im aktuellen Bereich, aber wer ist dieser $this? Wir haben es nicht definiert, daher wird ein Fehler direkt hier gemeldet. Die Fehlermeldung lautet: $this wird verwendet, aber es gibt keinen Objektkontext, d. h. der Umfang der $this-Referenz ist nicht angegeben.

1.bindTo()-Methode, die $this bindet

$func->call($lily, 'well'); // Lily:well
Dieses Mal können Sie normal ausgeben. Die bindTo()-Methode kopiert ein aktuelles Abschlussobjekt und bindet es dann an den $this-Bereich und den Klassenbereich.

Das obige ist der detaillierte Inhalt vonSo geben Sie dies für anonyme Funktionen in PHP an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:imooc.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen