web-dev-qa-db-fra.com

PHP7 method_exists Erreur non interceptée: le nom de la fonction doit être une chaîne

Je reçois cette erreur:

Erreur fatale: erreur non interceptée: le nom de la fonction doit être une chaîne dans

Pour ce code:

if (function_exists($item['function'])) {
    $item['function']($item, $default);
} elseif (method_exists($this, $item['function'])) {
    $this->$item['function']($item, $default);
}

Je sais que changer le code en

if (function_exists($item['function'])) {
    $item['function']($item, $default);
} elseif (method_exists($this,$item['function'])) {
    $this->{$item['function']}($item, $default);
}

Résolu cette erreur, mais ma question est, si cette ligne

 $item['function']($item, $default);

être également converti en

{$item['function']}($item, $default);

ou peut-il être laissé tel quel?

16
backups

Cela est dû à changements incompatibles dans l'ordre d'évaluation pour le traitement des variables et méthodes indirectes:

Modifications apportées à la gestion des variables indirectes, des propriétés et des méthodes

L'accès indirect aux variables, aux propriétés et aux méthodes sera désormais évalué strictement de gauche à droite, par opposition à la combinaison précédente de cas spéciaux. Le tableau ci-dessous montre comment l'ordre d'évaluation a changé.

Non, vous n'avez pas besoin de modifier cette ligne:

$item['function']($item, $default);

Puisqu'il n'y a pas d'évaluation spéciale en cours ici, il utilisera simplement l'élément de tableau comme nom de fonction et appellera la fonction. Vous pouvez le modifier et le code fonctionnera toujours correctement, mais ce n'est pas nécessaire.

Mais comme vous l'avez déjà fait correctement, vous devez changer:

$this->$item['function']($item, $default);

à:

$ this->{$ item ['fonction']}($ item, $ default); 
 ↑ ↑ 

Puisque comme vous pouvez le voir dans ce tablea :

                    Ancienne et nouvelle évaluation des expressions indirectes 
 Expression PHP 5 interprétation PHP 7 interprétation 
 -------- -------------------------------------------------- --------------------- 
 $$ foo ['bar'] ['baz'] | $ {$ foo ['bar'] [ 'baz']} | ($$ foo) ['bar'] ['baz'] 
 $ foo -> $ bar ['baz'] | $ foo -> {$ bar ['baz'] } | ($ foo -> $ bar) ['baz'] 
 $ foo -> $ bar ['baz'] () | $ foo -> {$ bar ['baz']} () | ($ foo -> $ bar) ['baz'] ()
 Foo :: $ bar ['baz'] () | Foo :: {$ bar ['baz']} () | (Foo :: $ bar) ['baz'] () 

PHP 7 supposera que vous voulez d'abord accéder à une propriété d'objet, puis vous voulez accéder à un index à partir de cette propriété, et utiliser sa valeur comme nom de méthode pour appeler une méthode (ordre de gauche à droite).

Pour utiliser la variable et l'index comme nom de propriété, vous devez utiliser des accolades pour l'indiquer.

26
Rizier123