Sujet: [PHP] Comment ne pas marcher dedans...
03/08/2006 @ 19:31:34: gizmo: [PHP] Comment ne pas marcher dedans...
Bon, je propose de rassembler ici toutes les pire merdes issues du moteur PHP, parce que bon, y en a des tas, mais si on sait construire une petite base de connaissance, cela permettra d'éviter de toujours marcher dedans (il parait que cela porte bonheur :kiki: )

Alors, j'ouvre le bal avec PHP 5.0.4

  1. <?php 
  2. $text = 'ici du TEXTE A CAPTURER et puis du blabla'
  3. preg_match_all('/(?P<super>[A-Z][A-Z ]+)/'$text$matches); 
  4. echo "AVANT\n"
  5. var_dump($matches); 
  6. preg_replace_callback('/(?P<super>[A-Z][A-Z ]+)/''callback'$text); 
  7. function callback($matches) { 
  8. echo "APRES\n"
  9. var_dump($matches); 
  10. ?>


Et en sorties, on a un magnifique


AVANT
array(3) {
[0]=>
array(1) {
[0]=>
string(17) "TEXTE A CAPTURER "
}
["super"]=>
array(1) {
[0]=>
string(17) "TEXTE A CAPTURER "
}
[1]=>
array(1) {
[0]=>
string(17) "TEXTE A CAPTURER "
}
}
APRES
array(2) {
[0]=>
string(17) "TEXTE A CAPTURER "
[1]=>
string(17) "TEXTE A CAPTURER "
}


Magnifique n'est-ce pas? :itm:
03/08/2006 @ 19:39:17: zion: [PHP] Comment ne pas marcher dedans...
Ca me donne mal au crâne :itm:
03/08/2006 @ 20:37:39: max: [PHP] Comment ne pas marcher dedans...
Hmmmm, si tu pouvais détailler, car j'ai l'impression que ça fait ce qui dit le mode d'emplois :ohwell:

Il doit y avoir un truc qui m'échappe (je ne suis pas ironique là, je précise).
04/08/2006 @ 01:27:53: gizmo: [PHP] Comment ne pas marcher dedans...
Si ça faisait ce que dit le mode d'emploi, j'aurais aussi ma clef "super" passée dans ma version avec callback.
04/08/2006 @ 11:34:24: zion: [PHP] Comment ne pas marcher dedans...
En relisant ce matin, j'ai enfin pigé :ddr555:

Joli :petrus:
04/08/2006 @ 18:55:04: max: [PHP] Comment ne pas marcher dedans...
Joli dans un sens, qui va voir dans les sources pour voir si c'est "normal" ou pas :smile:
Si la variable super est créé avant ou après le traitement dans le cas de preg_match_all ? Vu que preg_replace_callback ne renvoie pas l'ensemble des matches dans un tableau en fin de fonction, on pourrait trouver ça normal, mais si tu veux faire quelques choses pendant le preg_replace_callback sur chaque résultat et en même temps recevoir la chaine de charactère transformé, je comprends que tu sois déçu. Il faudra voir ce qu'il existe comme littérature sur l'usage des callbacks.

Sinon, tu as trouvé ce erreur/bug/curiosité de quelle manière ?

Max, qui aime bien apprendre


ps: joli aussi le parseur syntaxique d'informaticien, je viens de réaliser que chaque fonction à son lien vers la doc PHP :clap:
04/08/2006 @ 19:14:28: gizmo: [PHP] Comment ne pas marcher dedans...
J'ai trouvé ce bug en créant mon moteur de template. Comme il est possible que je rajoute des fonctionnalités par la suite, je n'avais pas envie de devoir recompter mes parenthèses de regexp dans tout mon code à chaque modif. Mais bon, visiblement c'est trop évolué pour php.
04/08/2006 @ 19:48:14: zion: [PHP] Comment ne pas marcher dedans...

ps: joli aussi le parseur syntaxique d'informaticien, je viens de réaliser que chaque fonction à son lien vers la doc PHP :clap:


merci :dawa:

Y a le même pour pleins de languages, je me demande si j'envoie pas sur allhtml pour l'HTML d'ailleurs :dawa:

Enfin ca évite les copier/coller à gogo :oh:
05/08/2006 @ 13:45:00: ovh: [PHP] Comment ne pas marcher dedans...
ps: joli aussi le parseur syntaxique d'informaticien, je viens de réaliser que chaque fonction à son lien vers la doc PHP :clap:

P'tain j'avais jamais remarqué :wam:
C'est super en effet :dawaking:
05/09/2006 @ 20:27:00: gizmo: [PHP] Comment ne pas marcher dedans...
Bon, encore une incohérence de merde dans PHP :fou:
  1. <?php 
  2. class Test { 
  3.  
  4. protected $_model = 'toto'
  5.  
  6. public final function __get($name) { 
  7. $realName = '_'.$name
  8. if (isset($this->$realName)) { 
  9. $result = $this->$realName
  10. return $result
  11. throw new Exception('Invalid member. "'.$name.'" does not exist.'); 
  12.  
  13. public function __construct() { 
  14.  
  15.  
  16. $test = new Test(); 
  17. $test2="bla"
  18. $test3 = $test2
  19. $test3 = "tutu"
  20. echo $test2"\n"
  21. $test->model = 'hello'
  22. echo $test->model
  23. ?>


Output:


bla
hello


Résultat des courses: Ces imbéciles se sont tellement chiés dessus qu'il est impossible de travailler sur des copies de variables membres d'un objet. Super pratique lorsque l'on veut rendre un objet immuable de manière élégante :fou:


EDIT: Bon, alors, le fait est que ces imbéciles ont mis un setter par défaut, php4 staïle :kiki: Du coup, en rajoutant la méthode

  1. public final __set($name$value){}


On règle le problème. C'est évidemment super pratique pour débugger s'il instancie des nouvelles variables à chaque faute de frappe, même dans les objets :halalala:
10/09/2006 @ 14:55:51: gizmo: [PHP] Comment ne pas marcher dedans...
Bon, alors, dans la catégorie "Je suis incapable de passer des arguments correctement à une fonction", j'appelle PHP!

Petite démonstration par l'exemple:

  1. <?php 
  2. class Test { 
  3.  
  4. protected $_model = 'toto'
  5.  
  6. public final function __get($name) { 
  7. $realName = '_'.$name
  8. if (isset($this->$realName)) { 
  9. return $this->$realName
  10. throw new Exception('Invalid member. "'.$name.'" does not exist.'); 
  11.  
  12. public function badCase() { 
  13. if (!empty($this->model)) { 
  14. echo 'Hello "badCase"!'"\n"
  15. public function goodCase() { 
  16. $model = $this->model
  17. if (!empty($model)) { 
  18. echo 'Hello "goodCase"!'"\n"
  19. $test = new Test(); 
  20. echo $test->model"\n"
  21. $test->badCase(); 
  22. $test->goodCase(); 
  23. ?>


Et en sortie, on obtient:


toto
Hello "goodCase"!


Donc, en cas d'appel à une fonction implicite, PHP est incapable d'évaluer D'ABORD cette fonction avant de passer le résultat comme argument et, au lieu de faire un passage par référence pour économiser de la place mémoire et éviter une évaluation inutile, il se content de copier une valeur NULL, ce con.

Et dire que cette merde est acclamée par les foules...
10/09/2006 @ 22:40:00: zion: [PHP] Comment ne pas marcher dedans...
Donc, en cas d'appel à une fonction implicite, PHP est incapable d'évaluer D'ABORD cette fonction avant de passer le résultat comme argument et, au lieu de faire un passage par référence pour économiser de la place mémoire et éviter une évaluation inutile, il se content de copier une valeur NULL, ce con.


Roh ptain celui la il est joli :oh: :oh: :oh: :oh:

T'as pensé faire du report chez eux parfois? :oh:
10/09/2006 @ 22:55:39: gizmo: [PHP] Comment ne pas marcher dedans...
Non. Avec les conneries qu'ils sont en train de planifier pour la v6, je me dis que si je viens avec mes questions sur des fonctionnalités qu'à peine 0.5% des progammeurs php utilisent (genre tout ce qui sert à coder un rien proprement), il vont juste m'envoyer chier ou, pire, retirer la fonctionnalité.
10/09/2006 @ 23:32:20: zion: [PHP] Comment ne pas marcher dedans...
C'est vrai qu'à l'époque, je les avais contacté pour leur demander d'inclure le "with" de Delphi... Ils m'ont envoyé chier sur la lune :ddr555:
16/09/2006 @ 01:26:09: philfr: [PHP] Comment ne pas marcher dedans...
Et dire que cette merde est acclamée par les foules...


De toutes façons, c'est de ta faute... C'est Rasmus Lerdorf, le créateur de PHP lui-même qui le dit :oh: ...

http://www.internetnews.com/dev-news/article.php/3631831

Ah, oui, il dit aussi que MySQL c'est bien, et PostgreSQL, c'est nul (enfin, en gros)...

:lol:
17/09/2006 @ 01:07:25: gizmo: [PHP] Comment ne pas marcher dedans...
Euh, ouais. Enfin, c'est vraiment pas un mec que je considère comme une lumière, donc bon...
17/09/2006 @ 23:04:17: zion: [PHP] Comment ne pas marcher dedans...
Mais il est gentil, déjà vu à une conférence :petrus:

Il a été important pour php1/2... Après bon il est plus vraiment de la partie :oh:
17/09/2006 @ 23:49:47: philfr: [PHP] Comment ne pas marcher dedans...
T'étais au OSDEM à la plaine ? :grin:

Je l'y ai vu aussi, où il avouait la façon dont il "développait" les premiers balbutiements de PHP1...
18/09/2006 @ 00:02:18: zion: [PHP] Comment ne pas marcher dedans...
Oui, j'y étais, j'ai encore le tshirt monsieur :oh:
J'ai fait l'OSDEM et tous les FOSDEM :oh: (même le dernier mais j'y ai pas vu grand chose, trop malade).

Tu te rappelles donc de son explication sur le "crouic" du disque pour son while? :ddr555:
Ca situe quand même :ddr555:
18/09/2006 @ 11:51:01: Altar: [PHP] Comment ne pas marcher dedans...
C'est quoi le crouic :oh: On veut savoir :ddr555:
Retour