L'ordre d'évaluation des arguments de la fonction PHP est-il toujours le même?Ordre d'évaluation des arguments de fonction dans PHP
Merci.
L'ordre d'évaluation des arguments de la fonction PHP est-il toujours le même?Ordre d'évaluation des arguments de fonction dans PHP
Merci.
En général, oui. Comme the manual states:
Les arguments [Fonction] sont évalués de gauche à droite.
Mais il y a deux cas de bord où arguments ne sont pas évalués du tout:
$calls = 0;
register_shutdown_function(function() use (&$calls) {
echo $calls;
});
func_does_not_exist($calls++);
Cette outputs0
sur toutes les versions de PHP.
class Foo {}
$bar = 0;
$foo = new Foo($bar++);
echo $bar;
Ce outputs0
sur PHP 7.1 < et 1
sur PHP> = 7.1. Il a été appelé "l'optimisation de Rasmus", et il ne se produit que dans le cas de la construction de classes sans constructeurs formels. Voir également #67829, #54162 et #54170.
En résumé, le manuel est correct. Pour les fonctions définies, les arguments sont évalués de gauche à droite puis transmis dans la fonction. Les fonctions non définies, pour lesquelles un constructeur inexistant est un cas particulier, ne sont pas qualifiées de fonctions et donc l'évaluation avant appel est elle-même indéfinie.
De the manual:
Les informations peuvent être transmises à des fonctions via la liste des arguments, qui est une liste délimitée par des virgules d'expressions. Les arguments sont évalués de gauche à droite.
En théorie, cela pourrait changer dans les futures versions de PHP, mais je ne m'y attendrais certainement pas.
(Et s'il vous plaît ne pas écrire un code qui repose sur elle, pour l'amour de tout le monde ...)
Pouvez-vous donner un exemple où cela pourrait faire la différence ...? – deceze
Comme dans un scénario exotique où une variable serait modifiée dans une expression passée en argument de fonction, tout en utilisant la même variable qu'un argument de fonction différent dans le même appel? –