|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité de passage
![]() Développeur informatique Inscription : janvier 2013 Messages : 6 ![]() |
Bonjour,
Je viens de tomber sur une chose assez étrange en PHP 5.4.3, si quelqu'un peut confirmer mon impression. J'ai 2 fonctions : La première, appelle une fonction de création de dossier et test le déroulement de cette dernière avant d'exécuter ses propres instructions. La seconde créer le dossier, dont voici le code : Code :
Code :
J'ai fait plusieurs tests dont voici le code, puis les résultats : Code :
CHECK FOLDER = exactement >>> 1 <<< CHECK FOLDER = TRUE CHECK FOLDER = FOLDER_ALREADY_EXISTS Je ne comprends pas du tout... 1) le dossier n'existe pas de base. 2) le dossier se créer quand même. 3) si j'actualise ma page, j'obtiens : CHECK FOLDER = exactement >>> FOLDER_ALREADY_EXISTS <<< CHECK FOLDER = TRUE CHECK FOLDER = FOLDER_ALREADY_EXISTS CHECK FOLDER est une string Je suis assez perplexe sur le retour de ce code. Quelqu'un pourrait t'il m'éclairer ? Merci par avance |
||||||
|
|
00
|
|
|
#2 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 891 ![]() |
Je ne vois pas de problème particulier dans ton code et le comportement à l'air correct: une fois le dossier créé, la valeur spéciale "FOLDER_ALREADY_EXISTS" est correctement renvoyée, ce qui correspond au comportement attendu non ?
Note: pour vérifier en même temps le type et la valeur d'une donnée, utilise var_dump Il y a en revanche un problème de sémantique dans ton code. Il est plus naturel pour la méthode creerDossier de renvoyer tout simplement un booléen (true > ok, false > nok) plutôt que de renvoyer une valeur arbitraire. Même si PHP est faiblement typé, utiliser plusieurs types de retours pour une fonction/méthode est relativement dangereux. Dans ton cas, renvoyer une valeur vraie (une chaine de caractères) alors que ça c'est manifestement mal passé est une mauvaise idée. Donc je te recommande d'utiliser soit un retour booléen: Code :
Code :
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
||||
|
10
|
|
|
#3 | ||||
|
Invité de passage
![]() Développeur informatique Inscription : janvier 2013 Messages : 6 ![]() |
Merci Benjamin pour cette réponse très complète.
Effectivement, je me suis lâché sur le typage :-) J'en ai bien conscience, utilisant d'autres langages, à fort typage eux (ex c#). Néanmoins, je ne renvoie qu'un état, et je le fais pour une bonne raison, une autre fonction se servant également de creerDossier() qui elle, n'attend qu'un booléen. Le code est relativement bien commenté, celui qui passera derrière n'aura aucun mal à le comprendre. Et puis, comme je me sers d'un état de retour, je pourrais très bien aussi renvoyer "vrai" ou "faux" (en string, pas en bool)... Comme ça, je reçois toujours une string, et effectivement, ce serait plus propre... Mais là n'était pas réellement la question En fait non, en te citant : la valeur spéciale "FOLDER_ALREADY_EXISTS" est correctement renvoyée, ce qui correspond au comportement attendu non ? Non ce n'est pas du tout le comportement attendu. En aucun cas elle doit renvoyer la valeur FOLDER_ALREADY_EXISTS au premier passage puisque le dossier n'existe pas encore... D'ailleurs, elle n'est pas censée me renvoyer FOLDER_ALREADY_EXISTS à aucun moment, c'est juste une vérification supplémentaire. Qui plus est, le réel problème est (ma question ^^) : Code :
CHECK FOLDER = FOLDER_ALREADY_EXISTS (il manque : CHECK FOLDER est une string) en revanche, si j'actualise la page, j'ai bien l'affichage : CHECK FOLDER = FOLDER_ALREADY_EXISTS CHECK FOLDER est une string (normale, après actualisation, (redirection désactivée en debug), le dossier existe bien) Je suis d'accord sur le second comportement, mais pas sur le premier : Je renvoie un booléen, je reçois bien 1, la condition Code :
CHECK FOLDER = FOLDER_ALREADY_EXISTS Et puis, si elle insiste pour me l'afficher (pourquoi pas...) alors, j'insiste pour qu'elle m'affiche aussi CHECK FOLDER est une string Non ? PS : merci pour ta version "plus compact" dont je ne connaissais pas l'emploi ^^ |
||||
|
|
00
|
|
|
#4 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 891 ![]() |
Ce sont tes tests qui ne sont pas bons, tu es victime du cast en booléen à cause d'opérateur ==.
Exemple: Code :
var_dump( true == "foobar" ); // true (car "foobar" est casté automatiquement en true) Le typage faible c'est pratique mais il faut faire attention
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Développeur informatique Inscription : janvier 2013 Messages : 6 ![]() |
C'est fou ça...
Je m'en étais bien rendu compte, avant de m'inscrire sur developpez et de poser ma question J'avais bien entendu fait le test avec l'opérateur strict, avant même de tester avec is_string().... C'est même la première chose que j'ai fait en fait ^^ J'avais même failli le préciser dans mon premier commentaire. Tu postes la même réponse, je (re)test pour être certain de pas dire de bêtise, et là étrangement, ça passe... J'ai du me mélanger à un moment ou un autre, lapin compris Autant pour moi désolé.... J'étais sur le point de downgrader php lol Merci bien ;-) Merci d'autant plus que je ne savais pas qu'il était casté automatiquement |
|
|
00
|
|
|
#6 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 891 ![]() |
Voici un excellent article qui fait le tour de l'épineuse question du cast booléen en PHP: http://11heavens.com/true-or-false-in-php
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Développeur informatique Inscription : janvier 2013 Messages : 6 ![]() |
rofl, là j'ai envie de dire pas cool par contre !
La grosse claque début 2013... Un bts, 5 ans d’expérience dont 2 à SAP, pour en arriver à ça... J'ai mal... Je ne donnerais pas le résultat du challenge lol Merci Bon sinon je sais où et à quel moment je me suis planté, c'est déjà ça... ^^ |
|
|
00
|
|
|
#8 |
![]() ![]() |
Salut,
Rassure-toi, même après 8 ans de PHP j'ai encore fait une erreur sur $myArray[] = '0'
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
00
|
|
|
#9 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 891 ![]() |
Désolé pour l'affront, je ne connaissait pas ton niveau
Dans le doute, je donne toujours quelques articles de référence comme celui-ci.Et puis tu sait, je prends régulièrement des vestes sur ce forum également, on fait tous des erreurs
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
|
00
|
|
|
#10 | |
|
Invité de passage
![]() Développeur informatique Inscription : janvier 2013 Messages : 6 ![]() |
Citation:
J'ai beaucoup aimé le "'1.5 cups' - '3 cups' / 2" ou encore le "'0 times' + 'zero'" En plus du tableau également ^^ Magnifique, très sympa ce petit test ^^ |
|
|
|
00
|
|
|
#11 | |
|
Invité de passage
![]() Développeur informatique Inscription : janvier 2013 Messages : 6 ![]() |
Citation:
Puis au vu du code très basique fourni, ma réponse aurait été sensiblement identique (manque les exceptions !!! le typage !!!!) Merci à vous, et bonne journée ^^ -- Mangez des asperges qu'ils disaient ! |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com