Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/01/2013, 11h07   #1
no-war
Invité de passage
 
Homme
Développeur informatique
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
Par défaut bug PHP 5.4.3 ?

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 :
1
2
3
4
5
 
private function creerDossier($path)
{
    return (file_exists($path)) ? 'FOLDER_ALREADY_EXISTS' : mkdir($path, 0777);
}
Voici les instructions d'appel de cette fonction, qui me retourne un truc assez bizarre :

Code :
1
2
3
4
5
6
7
8
 
// Creation du dossier de mise à jour
$check_folder = $this -> creerDossier($maj_relative_path);
 
// On vérifie que le dossier n'existe pas déjà (auquel cas, la mise à jour a déjà été proposée)
if ($check_folder && $check_folder != 'FOLDER_ALREADY_EXISTS')
{
      // instructions....
Le problème, est que je ne rentre jamais dans ma condition...
J'ai fait plusieurs tests dont voici le code, puis les résultats :

Code :
1
2
3
4
5
6
7
8
 
echo 'CHECK FOLDER = exactement >>> ' . $check_folder . ' <<<<br />';
 
if ($check_folder) echo 'CHECK FOLDER = TRUE<br />'; 
 
if ($check_folder == 'FOLDER_ALREADY_EXISTS') echo 'CHECK FOLDER = FOLDER_ALREADY_EXISTS<br />'; 
 
if (is_string($check_folder)) echo 'CHECK FOLDER est une string';
le résultat est :

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
no-war est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 11h52   #2
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 891
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 891
Points : 8 583
Points : 8 583
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 :
1
2
3
4
5
6
7
8
9
10
11
<?php
 
class Foo {
 
    public function createFolder ($path) {
        return file_exists($path) ? false : mkdir($path);
 
        // ou en plus compact
        //return !file_exists($path) && mkdir($path);
    }
}
On peut aussi se servir des exceptions pour obtenir plus de finesse sur le cas d'erreur:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
class Foo {
 
    public function createFolder ($path) {
        if (file_exists($path)) {
            if (is_dir($path))
                throw new RuntimeException("directory $path already exists");
            else
                throw new RuntimeException("file $path already exists");
        }
 
        return mkdir($path);
    }
}
Enfin, ce serait quand même plus pratique si ta méthode pouvait créer une arborescence complète. Je te laisse essayer d'imaginer comment
__________________
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 Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2013, 12h08   #3
no-war
Invité de passage
 
Homme
Développeur informatique
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
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 :
1
2
3
4
 
if ($check_folder == 'FOLDER_ALREADY_EXISTS') echo 'CHECK FOLDER = FOLDER_ALREADY_EXISTS<br />'; 
 
if (is_string($check_folder)) echo 'CHECK FOLDER est une string';
m'affichera, au premier passage, seulement :
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 :
1
2
 
if ($check_folder == 'FOLDER_ALREADY_EXISTS')
ne devrait pas être vrai, et ne devrait pas m'afficher
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 ^^
no-war est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h24   #4
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 891
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 891
Points : 8 583
Points : 8 583
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)
Pour vérifier à la fois l'égalité et le type, il faut utiliser l'opérateur de comparaison stricte ===
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 Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h35   #5
no-war
Invité de passage
 
Homme
Développeur informatique
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
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
no-war est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h53   #6
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 891
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 891
Points : 8 583
Points : 8 583
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 Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 14h04   #7
no-war
Invité de passage
 
Homme
Développeur informatique
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
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... ^^
no-war est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 14h11   #8
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 588
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 588
Points : 6 046
Points : 6 046
Envoyer un message via Skype™ à rawsrc
Salut,
Citation:
Envoyé par no-war Voir le message
J'ai mal... Je ne donnerais pas le résultat du challenge lol
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...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 14h16   #9
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 891
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 891
Points : 8 583
Points : 8 583
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 Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 14h25   #10
no-war
Invité de passage
 
Homme
Développeur informatique
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par rawsrc Voir le message
Salut,

Rassure-toi, même après 8 ans de PHP j'ai encore fait une erreur sur $myArray[] = '0'
C'est bien gentil de ta part, mais mettre tout ça sur le compte des reliquats du réveillon me rassure plus finalement

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 ^^
no-war est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 14h30   #11
no-war
Invité de passage
 
Homme
Développeur informatique
Inscription : janvier 2013
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par Benjamin Delespierre Voir le message
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
Non mais parfait ce petit test, et les affronts permettent aussi de s'améliorer.
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 !
no-war est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h50.


 
 
 
 
Partenaires

Hébergement Web