Maison  >  Article  >  développement back-end  >  Comment spécifier cela pour les fonctions anonymes en PHP

Comment spécifier cela pour les fonctions anonymes en PHP

autoload
autoloadavant
2021-04-06 16:45:192230parcourir

Comment spécifier cela pour les fonctions anonymes en PHP

Concernant les fonctions anonymes de fermeture, un problème très typique dans JS est de le lier à une portée this. En fait, ce problème existe aussi en PHP, comme le code suivant :

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

Dans cette fonction anonyme, on utilise $this->name pour récupérer l'attribut $name dans le scope courant, mais , qui c'est ça $this ? Nous ne l'avons pas défini, une erreur sera donc signalée directement ici. Le message d'erreur est le suivant : $this est utilisé mais il n'y a pas de contexte d'objet, c'est-à-dire que la portée de la référence $this n'est pas spécifiée.

Méthode 1.bindTo() liant $this

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

Cette fois, vous pouvez sortir normalement. La méthode bindTo() consiste à copier un objet de fermeture actuel, puis à le lier à la portée $this et à la portée de la classe.

  • Le paramètre $lily est un paramètre object $newthis , ce qui signifie spécifier $this pour cette fonction anonyme copiée.

  • 'Lily' lie une nouvelle portée de classe, qui représente un type et détermine quelles méthodes privées et protégées peuvent être appelées dans cette fonction anonyme

Si ce paramètre n'est pas donné, alors nous ne pouvons pas accéder à l'attribut private de ce $name  :

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

2.call() liaison de méthode Set $this

$func->call($lily, 'well'); // Lily:well

Recommandé : Résumé des questions d'entretien PHP 2021 (collection)》《Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer