substr()

Pourquoi ?

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet
1
2
3
4
5
6
>>> substr("hello", 0, 912838843877327489327483747234672637472394893)
=> ""
>>> substr("hello", 0, 91283884387732748932748374723467)
=> false
>>> substr("hello", 0, 912)
=> "hello"

Pourquoi ?

+0 -1

Dans ton troisième cas, 912 est supérieur à la longueur de la chaîne, donc toute la chaîne est renvoyée.

Dans ton deuxième cas, le nombre littéral est trop grand pour être stocké dans un entier, il est donc implicitement converti en float, puis la fonction substr cherche à le caster en int, ce qu'elle ne parvient pas à faire, puisqu'il est trop grand. Donc bogue. Donc false.

Dans ton troisième cas, le nombre littéral est trop grand pour être stocké même dans un float et visiblement (je n'ai pas pu trouver de source qui l'affirme explicitement, mais ça paraît le plus vraisemblable), faute de pouvoir le stocker, ça renvoie false, qui est converti en int ayant la valeur 0. Donc chaîne vide.

#JeSuisGrimur #OnVautMieuxQueÇa

+1 -0
Staff

Salut,

Comme les deux premiers entiers littéraux sont trop long, PHP considère que ce sont des float. Ils sont donc convertit ensuite en entier… sauf que cette conversion est indéfinie pour des float trop grands. J'ai fait mes tests, et le premier est convertir en zéro, et le deuxième en un grand nombre négatif. Plus d'infos dans la doc sur les entiers.

Du coup, selon la documentation de substr, une chaîne vide est renvoyée dans le premier cas, et false est renvoyé dans le deuxième cas. Le troisième cas marche parfaitement.

Pour plus d'infos, la doc de substr en anglais. Il y a aussi une version française, mais il manque des choses, j'ai l'impression…

EDIT: réponse plus précise que mon VDD, parce que je suis allé me taper la doc. :D

+1 -0
Staff

Salut,

@kdev : juste pour dire, la prochaine fois pense à introduire ton message avec un petit « bonjour/bonsoir » et a étoffé un peu ta question, cela ne mange pas de pain et cela fait toujours plaisir. ;)

Édité par Taurre

+4 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte