2016-09-01 2 views
4

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.

+3

Pouvez-vous donner un exemple où cela pourrait faire la différence ...? – deceze

+0

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? –

Répondre

6

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:

fonctions non définies

$calls = 0; 
register_shutdown_function(function() use (&$calls) { 
    echo $calls; 
}); 
func_does_not_exist($calls++); 

Cette outputs0 sur toutes les versions de PHP.

constructeur manquant, un cas particulier d'une fonction non définie

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.

+2

Oh boy ... * hyperventilates * – deceze

+0

54161 ne semble pas particulièrement ... pertinent. – deceze

+1

Oups, un par un: 54162. Je suis un développeur, que puis-je dire ... – bishop

4

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 ...)