7
votes

Comportement d'incrément sur les cordes - oeuf PHP Pâques?

$var = 'test_1';
var_dump(++$var); // string(6) "test_2" 

$var2 = '1_test';
var_dump(++$var2); // string(6) "1_tesu"

$var3 = 'test_z';
var_dump(++$var3); // string(6) "test_a"

$var4 = 'test_';
var_dump(++$var4); // string(5) "test_"
So apparently, using an increment operator on a string has the effect of increasing the digit if the last character is a number, increasing the letter and then resetting to a once z if the last character is in the alphabet, and has no effect on non alpha numeric characters.Is this a standard feature, expected in many scripting languages, or did I just find a PHP easter egg?

3 Réponses :


0
votes

Ce n'est pas un œuf de Pâques. Il est attendu chez PHP, mais non, ce n'est pas courant dans d'autres langues. (Au moins pas d'incrémentation de lettres.) PHP traite des cordes contenant un nombre de même que des chiffres dans la plupart des cas. Donc, vous pouvez également "2" * "2" par exemple.


2 commentaires

L'exemple est un cas différent de celui du poste. Il indiquerait que "test" ++ serait similaire à "test" + 1 , qui est en effet pas . Le comportement ++ est "spécial" pendant que le comportement x + y est une conversion implicite.


Bon point. J'ai effectivement envisagé le point spécifique des nombres comme un addendum à ma première déclaration. Mais lisez dans son ensemble, vous avez raison que ce n'est pas clair.



2
votes

0 commentaires

7
votes

PHP suit la convention de Perl lors de la gestion des opérations arithmétiques sur les variables de caractère et non C. Par exemple, en PHP et Perl $ a = 'Z'; $ A ++; tourne $ A en 'AA', tandis que dans C A = 'Z'; a ++; tourne un '[' (Valeur ASCII de 'Z' est 90, la valeur ASCII de '[' est 91). Noter que Les variables de caractère peuvent être incrémentées mais non décrémentées et même si Seuls les caractères unis ASCII (A-Z et A-Z) sont supportés. Incrémentation / décrémentation d'autres variables de caractère n'a aucun effet, le la chaîne d'origine est inchangée.

-> http://php.net/manual/fr/language.operators.incrènement.php


6 commentaires

Malheureusement, la documentation est vague et pas bien écrite dans ce domaine :( Par exemple, il ne couvre pas le cas de ++ "_ 1" -> "_ 2" et, Soit la documentation est mal sur ce que "_ z" ++ se transforme.


À propos de la documentation étant horrible: comparez "_ z" ++ avec "z ++" :-)


Au moins "z ++" est très évident juste un "z" et deux "+" dans une chaîne. Rien de magie ici :)


@KingCrunch Heh, Oups. "z" ++ même ;-)


Curieux ... les deux ne fonctionnent pas dans mon shell interactif ( php -a ) disant "non impeccy t_inc" ... Ah, je vois: ne fonctionne pas pour les constantes, uniquement pour les variables ^^ Jamais utilisé, jamais remarqué. Maintenant je sais.


@KingCrunch Je raccourcis les exemples: cela n'a aucun sens pour les constantes; lire "z" ++ comme $ a = "z"; $ A ++