[Resolu] settype

devlop78
Invité n'ayant pas de compte PHPfrance

07 mai 2010, 16:37

Bonjour,

Je souhaiterai savoir si settype sur une variable la contraint par la suite (comme en ActionScript).

exemple :

$mavar = "5machins";
settype ($mavar, 'integer');
echo $mavar; //logiquement affiche 5
$mavar = "bonjour"; // QUE SE PASSE-t-il ? $mavar deviendra un string de valeur "bonjour" ou restera un integer de valeur 0 ou erreur ?
Modifié en dernier par devlop78 le 07 mai 2010, 21:12, modifié 1 fois.

ViPHP
ViPHP | 928 Messages

07 mai 2010, 16:39

Il n'y a pas de typage en PHP, settype aura juste pour effet de "caster" ta variable dans le type donner, mais tu peux le changer par la suite le plus naturellement du monde.

ViPHP
AB
ViPHP | 5818 Messages

07 mai 2010, 17:09

C'est marrant que tu n'aies pas eu la curiosité de tester puisque tu as déjà écrit le code du test... :o

devlop78
Invité n'ayant pas de compte PHPfrance

07 mai 2010, 19:35

j'étais en formation (Flash). Donc en fait le settype n'est pas autre chose qu'un $mavar = (string)$mavar; par exemple. J'ai un mec genre super sûr de lui qui m'a sorti que fallait plus mettre ses variables comme ça $mavar = "chose" mais qu'il fallait utiliser settype, pour pas se faire hacker dans le code. Je lui dis que je vois mal comme ça pourrait être possible, que personne n'a accès au code (où alors settype ou pas ça change rien), enfin bref. Je crois que dans sa p'tite tête il fait référence aux conneries du genre if ($motdepasse == 25), des comparaisons entre string et integer quoi ... enfin bref, je n'applique pas bêtement des règles de sécurité parce qu'on me dit de le faire, mais je cherche à les comprendre avant ...

Enfin bref, c'est donc bien juste une fonction de conversion de typage ... (comme le manuel l'indique) ... ?

ViPHP
AB
ViPHP | 5818 Messages

07 mai 2010, 20:57

Ben oui c'est comme le manuel l'indique... :wink:

Ensuite typer ses variables c'est une mesure de sécurité mais cela n'est utile que quand la sécurité est en jeu, par exemple quand tu reçois une variable issue d'un formulaire, ou une variable $_GET donc quand elle dépend du visiteur, ou alors dans certains contextes particuliers.

Tu pourrais aussi bien utiliser la fonction intval() également.

Evidemment ceux qui viennent d'un langage très typé ont tendance à croire que c'est une obligation absolue pour la sécurité du code. Mais cela permet au plus au développeur de ne pas oublier de le faire quand c'est nécessaire. Néanmoins le non typage des variables peut-être très pratique dans certains cas...

On peut résumer en disant qu'un développeur PHP a plus de possibilités et de facilités (en typant ou non ses variables), mais qu'en contre partie il doit être plus responsable :)

devlop78
Invité n'ayant pas de compte PHPfrance

07 mai 2010, 21:12

Tout à fait d'accord, j'apprécie beaucoup avoir true pour if (25 == "25"). Le seul truc qui est énervant et surtout dangereux c'est le transtypage automatique des string en integer, du moins la façon de le faire. if (25 == "25 personnes") ne devrait jamais marcher, on devrait donner la possibilité de faire une fonction comme intval ou je sais pas quoi pour effectuer ce type de choses. La grande sécurité étant pour moi if ((string)25 === "25 personnes") où les deux objets de comparaison sont des variables (évidemment). Là, ça retourne faut même si je n'avais mis que ==.

Enfin bon, le mec en question, et je remarque que c'est souvent le cas des développeurs, croit certainement tout savoir. Les graphistes avec qui je bosse disent que les développeurs sont plus cools que les graphistes, mais moi je trouve les graphistes plus ouverts et plus modestes ...

Voilà, sujet réglé ;)

ViPHP
AB
ViPHP | 5818 Messages

07 mai 2010, 21:22

Au passage quand tu utilise la triple égalité === alors php compare également le type des variables, une autre possibilité...

devlop78
Invité n'ayant pas de compte PHPfrance

07 mai 2010, 23:22

oui tout à fait, mais pour le coup if (25 === "25") retournerait false, ça pourrait être con alors que pour se protéger ou pour éviter de mauvaises surprises un petit ((string)25 == (string)"25") arrange tout ;) et là l'opérateur === est justement inutile (enfin je crois mais si on veut être sûr autant le mettre), puisque l'on est sûr que les deux sont du même type et donc pas de transtypage avec tous les mauvaises choses qui vont avec ;)