Précédent   Forum des professionnels en informatique > PHP > Langage

Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP

Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Affichage des résultats du sondage: Déclarer vous systématiquement vos variables?
Oui, toujours 8 44,44%
Oui, quand j'utilise cette variable qui aura un résultat uniquement sur une condition 5 27,78%
Non, Jamais 4 22,22%
C'est quoi une variable? 1 5,56%
Votants: 18. Vous ne pouvez pas participer à ce sondage.

Publicité
'
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Vieux 25/05/2008, 17h10   #1
Membre régulier
 
Avatar de hugo69
 
Inscription : avril 2005
Messages : 498
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 498
Points : 91
Points : 91
Par défaut Faut il déclarer des variables ?

Bonjour,

Chacun d'entre nous a pris l'habitude je pense de profiter de la souplesse de PHP, pour commencer à utiliser des variables sans les déclarer.

Je parle de variables standars type $variable. (Pas de POST ou GET...)

Du coup, avec un debug mis sur ALL, et dans le cas, d'une utilisation avec variable, on va se retrouver avec des erreurs style UNDEFINED VARIABLE.

Ex:

Code :
1
2
if(1==2){$var = "Bin non!";}
echo "Alors? : ".$var;
Si la condition n'est pas remplie, on aura l'erreur.

Alors on a tous l'habitude de mettre le notice_error à 2039.

Mais du coup, on va générer de gros fichier d'erreurs sur nos serveurs, et je pars du principe que si on a une erreur, c'est que l'on a pas bien fais les choses.

D'ou ma question, doit on prendre l'habitude de déclarer notre variable, même si on ne lui fait pas de settype, un peu inutile dans 99% des cas.

Doit on faire un $var=""; ou $var=0 ou var=array(); à chaque fois?

Vos avis?
hugo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 17h15   #2
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Perso oui je les déclarent. Sauf lorsque se sont des variables "tampons" ou a un usage très particulier comme par exemple une variable d'incrémentation dans une boucle.

Et dans la même veine le niveau d'erreur est toujours placé à E_STRICT ou E_ALL (je ne sais plus), m'enfin le plus sévère.
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 20h28   #3
Membre du Club
 
Étudiant
Inscription : mai 2008
Messages : 56
Détails du profil
Informations personnelles :
Âge : 22
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 56
Points : 46
Points : 46
Envoyer un message via MSN à Daxou31
Il te suffit de tester ta variable avant de l'afficher et ton code php sera propre
Daxou31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 07h15   #4
Membre éprouvé
 
Avatar de mon_nom_est_personne
 
Inscription : mai 2008
Messages : 450
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 450
Points : 451
Points : 451
je els declare toujours car c'est plus facile pour la maintenance.
mon_nom_est_personne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 07h52   #5
Nouveau Membre du Club
 
Avatar de TwAzO
 
Étudiant
Inscription : mai 2008
Messages : 67
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 67
Points : 35
Points : 35
Envoyer un message via MSN à TwAzO
Pour éviter un maximum de problèmes, je pense qu'il vaut largement mieux les déclarer.

Le code source est ainsi plus compréhensible (et propre, en passant )
TwAzO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 23h23   #6
Membre régulier
 
Avatar de hugo69
 
Inscription : avril 2005
Messages : 498
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 498
Points : 91
Points : 91
J'ai donc finalement commencer par tout déclarer, contrairement à avant.

J'ai du coup règlé mon php.ini sur E_ALL pour l'affichage des erreurs.

Comment ai je pu faire sans avant.

Ca ne coute pas très cher en termes de temps, et ca permet de tout de suite voir des incohérences dans le code.

Merci pour vos commentaires.
hugo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 04h23   #7
Membre éprouvé
 
Avatar de mon_nom_est_personne
 
Inscription : mai 2008
Messages : 450
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 450
Points : 451
Points : 451
si en plus tu commente ton code et que met des nom de variable explicite, 6 mois apres tu pourras te remettre dans ton code sans souci.
la souplesse de php est super, mais quand on bosse sur des grosses appli avec plein d'objet dans tout les sens etc... mieux vaut savoir qui est quoi des le depart.
Et puis ca depend aussi de comment t'as appris la prog, j'ai commence avec turbo pascal (ct y'a looooooongtemps) donc j'ai toujours garder la structure de code suivante:

1. include (ca aide a pas etre surpris quand on vois $classExotique->methode)
2. variable et constant
3. code pur
4. detruit les variables et les objets (ca reduit le server load sur les projet a tres forte frequentation)
mon_nom_est_personne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 10h25   #8
Membre régulier
 
Avatar de hugo69
 
Inscription : avril 2005
Messages : 498
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 498
Points : 91
Points : 91
j'ai appris avec la pratique....
hugo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 11h45   #9
Modérateur
 
Avatar de SirDarken
 
Eric Willems
Développeur Web
Inscription : février 2004
Messages : 895
Détails du profil
Informations personnelles :
Nom : Eric Willems
Âge : 30
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : Services de proximité

Informations forums :
Inscription : février 2004
Messages : 895
Points : 1 065
Points : 1 065
Envoyer un message via MSN à SirDarken Envoyer un message via Skype™ à SirDarken
Je dirai que ca dépend de ce que j'ai à faire.
Un petit site ou traitement non, un plus gros truc oui je commente et déclare avant chaque variable.

Grosso modo si une fonction ou bout de code (comprenez bout de code qui fait 1 seul truc) dépassé l'ecran d'affichage je commente et déclare, si j'ai 3 bouts de code sur 1 affichage, non.
SirDarken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 09h23   #10
Membre régulier
 
Avatar de hugo69
 
Inscription : avril 2005
Messages : 498
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 498
Points : 91
Points : 91
Petit question.

J'ai une fonction qui doit traiter des FLOAT.

Je pensait faire:

Code :
1
2
3
4
function test($valeur){
$valeur = (float)$valeur;
etc.....
}
Ceci afin de m'assurer que ce qui était envoyé à la fonction était bien des float, dès fois que je me trompe sur un appel.

est ce que cela est correct?
hugo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 11h04   #11
Membre éclairé
 
Inscription : septembre 2006
Messages : 459
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2006
Messages : 459
Points : 375
Points : 375
Envoyer un message via MSN à fucce
Pour ta question, moi je testerai ta variable avant l'appel avec une fonction comme is_float(). Si celle-ci renvoie false, je ferai, en effet, un cast (ou utiliserai floatval()) et lancerai l'appel de la fonction.
Pour en revenir à ton sujet, j'ai fait 4 ans de C et de C++ avant de commencer à coder en PHP. L'adaptation dans ce sens s'est faite très rapidement mais le contraire... c'est autre chose. C'est pourquoi j'ai repris mes bonnes vieilles habitudes de tout déclarer et tout initialiser!
fucce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 11h13   #12
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Salut,

Moi je forcerais le type, comme toi.
Mais sur les nombres à virgule c'est un peu tendancieux...
La question que je me pose c'est si j'envoie 3.33333333...3333.333 et que je le cast en float, sera t'il être arrondi ? Oui ? non ?
En tout cas sa à son importance.
Mais c'est spécifique à ce type de données pour les entiers, les chaines ect le problème ne se pose pas.

bye
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 11h24   #13
Membre régulier
 
Avatar de hugo69
 
Inscription : avril 2005
Messages : 498
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 498
Points : 91
Points : 91
ok, merci pour vos réponses, je vais donc concerver ma méthode.

Par contre en effet, c'est un gros problème pour moi.

Autant le (float), le settype, ou le floatval() arrondissent apparement à la 8 ème décimale.

Comment puis je m'y prendre pour convertir un string en float sans l'arrondir?



Exemple:

Code :
1
2
3
4
5
6
7
8
9
10
$var = "1.12345678910111213";
 
echo "STRING: ".$var."<br>";
 
echo "FLOAT A: ".(float)$var."<br>";
 
echo "FLOAT B: ".floatval($var)."<br>";
 
settype($var, "float");
echo "FLOAT C: ".$var."<br>";
retourne:
Code :
1
2
3
4
STRING: 1.12345678910111213
FLOAT A: 1.1234567891011
FLOAT B: 1.1234567891011
FLOAT C: 1.1234567891011

Et encore pire, si je prends un chiffre avec plus de nombre avant la virgule:

Code :
1
2
3
4
5
6
7
8
9
10
$var = "987654321.12345678910111213";
 
echo "STRING: ".$var."<br>";
 
echo "FLOAT A: ".(float)$var."<br>";
 
echo "FLOAT B: ".floatval($var)."<br>";
 
settype($var, "float");
echo "FLOAT C: ".$var."<br>";
retourne:

Code :
1
2
3
4
STRING: 987654321.12345678910111213
FLOAT A: 987654321.12346
FLOAT B: 987654321.12346
FLOAT C: 987654321.12346

Soit apparement, une conversion à 14 nombres maximum.


Et un petit dernier pour la route:

Code :
1
2
3
4
5
6
7
8
9
10
$var = "121110987654321.12345678910111213";
 
echo "STRING: ".$var."<br>";
 
echo "FLOAT A: ".(float)$var."<br>";
 
echo "FLOAT B: ".floatval($var)."<br>";
 
settype($var, "float");
echo "FLOAT C: ".$var."<br>";
retourne
Code :
1
2
3
4
STRING: 121110987654321.12345678910111213
FLOAT A: 1.2111098765432E+014
FLOAT B: 1.2111098765432E+014
FLOAT C: 1.2111098765432E+014
hugo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 11h50   #14
Membre éclairé
 
Inscription : septembre 2006
Messages : 459
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2006
Messages : 459
Points : 375
Points : 375
Envoyer un message via MSN à fucce
Es-tu obligé de convertir en float? Je viens de découvrir les fonctions BC Math qui permettent des opérations sur des grands nombres
fucce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 11h54   #15
Membre régulier
 
Avatar de hugo69
 
Inscription : avril 2005
Messages : 498
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 498
Points : 91
Points : 91
Je viens de voir tes fonctions BC MATH.
Bien que ceci a l'air pas mal, j'aurai vraiment préféré convertir mes variables.

Ca me permettrait de savoir ce que retourne mes fonctions et faciliterait beaucoup de choses.

Il semblerait que ca arrondisse également:

Code :
1
2
3
4
$varA = "1.12345678910111213";
$varB = "195846.12358746955412";
 
echo bcadd($varA, $varB);
retourne: 195847

EDIT: Pardon, je n'avais pas vu le parametre SCALE.
hugo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 12h03   #16
Membre éclairé
 
Inscription : septembre 2006
Messages : 459
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2006
Messages : 459
Points : 375
Points : 375
Envoyer un message via MSN à fucce
et si tu précises le nombre de décimales en 3ème paramètre?
fucce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 12h08   #17
Membre régulier
 
Avatar de hugo69
 
Inscription : avril 2005
Messages : 498
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 498
Points : 91
Points : 91
Oui, pardon, je n'avais pas vu le scale.

Cette méthode a l'air de fonctionner, mais ce n'est vraiment pas celle que je préfère.

Impossible de convertir avec précision il semblerait selon la doc???
hugo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h24.


 
 
 
 
Partenaires

Hébergement Web