a=b , b=c et pourtant a!=c ???

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : a=b , b=c et pourtant a!=c ???

Re: a=b , b=c et pourtant a!=c ???

par devlop78 » 30 juil. 2011, 15:30

Lol je citerai http://blog.mageekbox.net/?category/C-e ... -merde/PHP qui dénonce effectivement la réalité des fonctions qui vont dans tous les sens, l'ordre des arguments, et tout !

Donc, moi Je dis : A quand des classes de types "String" avec leurs méhtodes "String::indexOf" ou "String::substr", 'Array::push" voilà lol ^^

Re: a=b , b=c et pourtant a!=c ???

par Cyrano » 30 juil. 2011, 10:29

La chose qui me choquera toujours, est la différence de nommage des fonctions, isset() / is_string() par exemple... A moins que j'ai manqué l'utilité d'une telle différence.
Je crois me souvenir qu'il y a déjà eu des débats sur ce problème et la manière d'écrire certaines fonctions avec du CamelCase ou bien des Underscore, choses parfois agaçantes parce que ça manque un peu d'homogénéïté tout ça.

Peut-être serait-il intéressant de suivre les débats du PHP Group, il y a du reste le mageekblog qui est intéressant à suivre sur le sujet parce qu'il relate périodiquement ce qui se passe en interne.

Re: a=b , b=c et pourtant a!=c ???

par adri74100 » 30 juil. 2011, 10:19

J'aime énormément cette question. :D

J'aime cette question parce qu'en fait c'est une fort mauvaise question, il me semble important de souligner l'importance qu'il y a à poser la bonne question.

Un des points particulièrement positifs de tes interrogations est le fait que tu aies réalisé que le PHP a une façon qui lui est propre de traiter un problème. Le point négatif est que tu te poses la questions sur le bien-fondé de cette manière de traiter ce problème avec ce langage. On est dans deux domaines distincts : la sémantique du langage d'une part, et la manière dont il traite les données d'autre part, et en somme la manière d'utiliser ce langage. Nous demander si on trouve ce comportement logique revient à nous demander si le langage PHP fait correctement les choses et si le choix des développeurs du PHP Group font des choix appropriés ou bien en fume de la sévère et nous pondent un langage de bricolos.

En conclusion, je serais tenté de dire que c'est une mauvaise question dans un forum inapproprié ;) Mais en revanche, c'est aussi soulever un problème qu'il est intéressant de connaître ici parce qu'on peut s'y retrouver confronté, ce qui en fait une question intéressante dans le bon forum.... me semble qu'un vieil armagnac m'aidera peut-être à résoudre cet épineuse question :langue:
J'ai posé cette question pour soulever un débat et m'aider à comprendre la logique de ce comportement du langage, et c'est maintenant chose faite. En tout cas très belle réponse, j'ai pris beaucoup de plaisir à la lire :D
Et concernant PHP, on ne peut surement pas dire que c'est un langage de bricolos, ni que c'est le language le plus "propre" au monde. La chose qui me choquera toujours, est la différence de nommage des fonctions, isset() / is_string() par exemple... A moins que j'ai manqué l'utilité d'une telle différence.

Re: a=b , b=c et pourtant a!=c ???

par Cyrano » 30 juil. 2011, 00:58

Je me suis donc rendu compte qu'un string parsé en int était égal à 0 en php, alors qu'il sera égal à true s'il est parsé en booléen... Trouvez-vous ce comportement logique ?
J'aime énormément cette question. :D

J'aime cette question parce qu'en fait c'est une fort mauvaise question, il me semble important de souligner l'importance qu'il y a à poser la bonne question.

Un des points particulièrement positifs de tes interrogations est le fait que tu aies réalisé que le PHP a une façon qui lui est propre de traiter un problème. Le point négatif est que tu te poses la questions sur le bien-fondé de cette manière de traiter ce problème avec ce langage. On est dans deux domaines distincts : la sémantique du langage d'une part, et la manière dont il traite les données d'autre part, et en somme la manière d'utiliser ce langage. Nous demander si on trouve ce comportement logique revient à nous demander si le langage PHP fait correctement les choses et si le choix des développeurs du PHP Group font des choix appropriés ou bien en fume de la sévère et nous pondent un langage de bricolos.

En conclusion, je serais tenté de dire que c'est une mauvaise question dans un forum inapproprié ;) Mais en revanche, c'est aussi soulever un problème qu'il est intéressant de connaître ici parce qu'on peut s'y retrouver confronté, ce qui en fait une question intéressante dans le bon forum.... me semble qu'un vieil armagnac m'aidera peut-être à résoudre cet épineuse question :langue:

Re: a=b , b=c et pourtant a!=c ???

par adri74100 » 29 juil. 2011, 11:22

Ou un 3eme =, donc.
Exactement, c'est ce que j'avais fait.

Re: a=b , b=c et pourtant a!=c ???

par popy » 29 juil. 2011, 11:05

Ou un 3eme =, donc.

Re: a=b , b=c et pourtant a!=c ???

par jojolapine » 29 juil. 2011, 09:51

Pour ta fonction un simple petit cast suffit du coup:
function mise_en_forme($mVariable){
  if ((string)$mVariable == 'now'){
    return 'NOW()';
  }else{
    return "'$mVariable'";
  }
}

Re: a=b , b=c et pourtant a!=c ???

par adri74100 » 29 juil. 2011, 08:17

Je rebondis sur la réponse : un string n'est pas converti en 0. D'après mes connaissances, les langages respectent globalement la même logique en transtypage, et le transtypage est permis partout. La différence de trouve au niveau du typage, s'il est fort ou non.

Par exemple, un langage fortement typé te proposera de caster (transtyper) un String vers un Integer. par exemple : int x = (int) str_nombre

Le but étant d'avoir un résultat logique, mettre 0 arbitrairement ne répondrait pas aux problématique (on ne transtype pas pour le plaisir). Si un utilisateur tape "53" dans un formulaire, le résultat côté serveur sera toujours un String. Il faut donc le transtyper pour agir dessus, et la régle générale que les langages ont choisie c'est de convertir tout ce qui se trouve avant une première lettre (en gros). Donc "53" deviendra 53, "85x" deviendra 85 et "abdel" deviendra 0.

Ce qui est drôle c'est que tu te défends sur ta propre question en donnant comme exemple du typage fort alors que leur réaction est similaire si ce n'est identique (mais mon expérience ne me permet pas d'affirmer qu'ils le sont).
Effectivement pour le transtypage des ints il est identique aux autres languages (encore heureux !) donc '1' vaudra 1, '1x' vaudra 1 et 'x' vaudra 0.
Et effectivement le comportement de php sera identique à un typage fort, si ce n'est que le type choisi lors d'une comparaison souple (==) de deux variables de types différents sera implicite: le type le plus restrictif (si je ne fais pas d'erreur).
- lors de la comparaison d'un string à un int, php castera le string en int
- lors de la comparaison d'un string à un booléen, php castera le string en booléen
Dans ma fonction donnée en exemple, j'aurais par exemple dû convertir manuellement ma variable de type mixed en string pour la comparaison, pour éviter que la présence d'un int force le cast du 'NOW()' en int, soit 0.

Re: a=b , b=c et pourtant a!=c ???

par devlop78 » 29 juil. 2011, 02:32

Je rebondis sur la réponse : un string n'est pas converti en 0. D'après mes connaissances, les langages respectent globalement la même logique en transtypage, et le transtypage est permis partout. La différence de trouve au niveau du typage, s'il est fort ou non.

Par exemple, un langage fortement typé te proposera de caster (transtyper) un String vers un Integer. par exemple : int x = (int) str_nombre

Le but étant d'avoir un résultat logique, mettre 0 arbitrairement ne répondrait pas aux problématique (on ne transtype pas pour le plaisir). Si un utilisateur tape "53" dans un formulaire, le résultat côté serveur sera toujours un String. Il faut donc le transtyper pour agir dessus, et la régle générale que les langages ont choisie c'est de convertir tout ce qui se trouve avant une première lettre (en gros). Donc "53" deviendra 53, "85x" deviendra 85 et "abdel" deviendra 0.

Ce qui est drôle c'est que tu te défends sur ta propre question en donnant comme exemple du typage fort alors que leur réaction est similaire si ce n'est identique (mais mon expérience ne me permet pas d'affirmer qu'ils le sont).

Re: a=b , b=c et pourtant a!=c ???

par Skw33d » 28 juil. 2011, 23:54

surement pas. Le typage explicite et obligatoire et l'initialisation de toutes les variables sont de toute évidence un énorme avantage. Et ça éciterait ce genre de débat. Avec des variables typées on n'aurait pas besoin de === et == et ainsi soit-il.
J'aime bien le typage de PHP, je trouve qu'il est d'une certaine souplesse. De plus l'opérateur === n'est pas super contraignant. C'est même plutôt simple à gérer je dirais. Comme son nom l'indique comparaison stricte, si on cherche une valeur précise ou l'inverse dans l'autre cas.

Re: a=b , b=c et pourtant a!=c ???

par sirakawa » 28 juil. 2011, 22:49

surement pas. Le typage explicite et obligatoire et l'initialisation de toutes les variables sont de toute évidence un énorme avantage. Et ça éciterait ce genre de débat. Avec des variables typées on n'aurait pas besoin de === et == et ainsi soit-il.

Re: a=b , b=c et pourtant a!=c ???

par popy » 28 juil. 2011, 11:47

Dans la plupart des langages on défini le type à la déclaration et on s'y tient jusqu'au bout.
En php, rien ne nous y oblige. Ni a indenter, ni a commenter. C'est a chacun de s'imposer d'y faire attention, perso, je déclare mes variables, et elles ont un type quasi fixe.
Php gère le typage des variables, mais est tellement permissif qu'on ne s'en sert quasiment jamais (sachant en plus qu'il faudrait rajouter une ligne settype pour chaque variable).
Idem, libre a chacun de s'en servir. Et nul besoin de settype : $a = 0; suffit a dire que $a est un int. Tu veux récupérer une valeur dont tu n'est pas sur du type ? $a = intval($_GET['a']);

Ce genre de rigueur évite bien des problèmes, et transforme la "galère du typage php" en une feature sympathique qu'on peut utiliser.

Re: a=b , b=c et pourtant a!=c ???

par adri74100 » 28 juil. 2011, 11:35

Alalah, php et son absence de typage :D
Ben, justement, il y a des types de données, la preuve. Tu sais pas t'en servir, c'est différent.[/quote]

Je voulais parler de l'absence de typage des variables lors de la déclaration. Dans la plupart des langages on défini le type à la déclaration et on s'y tient jusqu'au bout. Php gère le typage des variables, mais est tellement permissif qu'on ne s'en sert quasiment jamais (sachant en plus qu'il faudrait rajouter une ligne settype pour chaque variable).
Mais on est bien d'accord, j'ai mélangé les types dans ma condition et je ne peut m'en prendre qu'à moi si je n'ai pas le résultat attendu.
Même si j'avais déjà réglé le problème, je trouvais le comportement illogique. J'ai maintenant compris la raison, c'est ce que je voulais.

Re: a=b , b=c et pourtant a!=c ???

par popy » 28 juil. 2011, 11:11

Je trouvais illogique qu'un string converti en int soit égal à 0
Tu confond int et booléen. Le cast de 'x' en booléen ça donne bien "true" (présence de données, donc).
Par contre la conversion en int c'est différent, en php ça transforme '123' en 123, '123x' en 123, et 'x' en 0, ce qui est logique.
Mais il est vrai que le fait d'attribuer l'int 1 à un tous les string non-numériques serrait un peu arbitraire, d'où l'obligation de mettre 0...
D'ou la version booléenne
Alalah, php et son absence de typage :D
Ben, justement, il y a des types de données, la preuve. Tu sais pas t'en servir, c'est différent.

Re: a=b , b=c et pourtant a!=c ???

par xTG » 28 juil. 2011, 08:35

Un 0 ou un 1 pour l'absence de données ce n'est pas représentatif.
Sur certains matériels on utilise le 1 pour indiquer l'absence de données. ;)
Bref faut jamais se dire que 0 c'est false ou vide ou je ne sais quoi car au final 0 ce n'est qu'un nombre qui peut être utilisé pour tout et n'importe quoi. :mrgreen: