WinBinder : Impossible d'accèder à mon objet [Résolu]

WinBinder : Impossible d'accèder à mon objet [Résolu] - PHP - Programmation

Marsh Posté le 06-05-2007 à 15:19:34    

Bonjour,
bon vous allez penser que j'ai de bien drôles d'idées à vouloir faire des fenêtres avec du PHP. Je suis bien d'accord et je fais ça juste à titre expérimental. J'utilise donc pour cela l'extension WinBinder.
Bref, j'ai un petit soucis et franchement je ne vois pas ou est mon erreur. Voici donc un exemple de code simplifié au possible et qui ne fonctionne pas :
 

Code :
  1. <?
  2. require('include/winbinder.php');
  3. define('IDC_BUTTONOK',1001);
  4. function EventHandler($window,$id)
  5. {
  6. switch($id) {
  7.  case IDCLOSE:
  8.   wb_destroy_window($window);
  9.   break;
  10.  case IDC_BUTTONOK:
  11.   global $main;
  12.   $main->OnClickOk(); // Call to a member function on a non-object
  13.   break;
  14. }
  15. }
  16. class main
  17. {
  18. function main()
  19. {
  20.  $winmain = wb_create_window(null, AppWindow, APP_NAME, WBC_CENTER, WBC_CENTER, 542, 419, 0x00000000, 0);
  21.  wb_create_control($winmain, PushButton, 'ok', 1, 1, 115, 25, IDC_BUTTONOK);
  22.  wb_set_handler($winmain, 'EventHandler');
  23.  wb_main_loop();
  24. }
  25. function OnClickOk()
  26. {
  27.  // Du code, OSEF
  28. }
  29. }
  30. $main = new main();
  31. ?>


 
Dans le switch de la fonction EventHandler, je ne parviens pas à avoir accès à mon objet main puisque je me tape l'erreur suivante en cas de clique sur le bouton ok :
Call to a member function on a non-object
 
Et à vrai dire je ne comprends pas tellement pourquoi. Si quelqu'un a une idée.
L'autre solution serait d'utiliser une méthode de mon objet comme fonction de callback mais apparemment c'est impossible.


Message édité par dwogsi le 07-05-2007 à 15:05:46

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-05-2007 à 15:19:34   

Reply

Marsh Posté le 07-05-2007 à 10:49:46    

Je comprends pas. L application est server side ou bien client side ?

Reply

Marsh Posté le 07-05-2007 à 13:47:27    

Côté client.
J'y éxécute via la ligne de commande.


Message édité par dwogsi le 07-05-2007 à 13:50:35

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 07-05-2007 à 14:19:16    

Il ne faut pas déclarer la classe avant la fonction EventHandler ?


Message édité par kao98 le 07-05-2007 à 14:20:46

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 07-05-2007 à 14:33:16    

Non ça ne change rien.

 

Edit :
Je viens de faire un test avec un bou de code encore plus simple :

Code :
  1. <?
  2. class main
  3. {
  4. function main()
  5. {
  6.  EventHandler();
  7. }
  8. function OnClickOk()
  9. {
  10.  echo 'ok';
  11. }
  12. }
  13. function EventHandler()
  14. {
  15. global $test;
  16. $test->OnClickOk(); // Call to a member function on a non-object
  17. }
  18. $test = new main();
  19. ?>


Et j'ai exactement la même erreur.
Le global sur un objet n'est-il pas censé fonctionner?

Message cité 1 fois
Message édité par dwogsi le 07-05-2007 à 15:47:53

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 07-05-2007 à 14:46:43    

ça m'a l'air très alambiqué comme système...ya pas moyen de se passer d'objet global dans ton truc?[:autobot]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-05-2007 à 14:48:57    

Ba je vois pas comment... Je ne peux pas passer de paramètres supplémentaires à ma fonction de callback et je ne peux pas non plus définir une méthode comme fonction de callback. Je vois pas vraiment d'autre solution que de faire du global.


Message édité par dwogsi le 07-05-2007 à 14:49:17

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 07-05-2007 à 14:52:08    

Faire de ton main un singleton? Dans ton eventhandler tu récupèrerais l'instance déjà créée...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-05-2007 à 15:05:04    

J'veux bien faire un singleton mais je ne vois pas en quoi ça pourrait m'aider à récupérer l'instance.

 

Sinon ça y est, je crois avoir compris pourquoi j'avais une erreur.
Dans le premier code que j'ai donné je lance la boucle principale dans le constructeur de ma classe. Or il est bien précisé dans le manuel de WinBinder que tout ce qui se trouve après la fonction wb_main_loop(); sera ignoré. On peut donc supposer que mon constructeur ne se "termine pas" et que par conséquent la variable censée récupérer mon instance ne récupère rien. Donc le code suivant fonctionne :

 
Code :
  1. <?
  2. require('include/winbinder.php');
  3. define('IDC_BUTTONOK',1001);
  4. function EventHandler($window,$id)
  5. {
  6. switch($id) {
  7.  case IDCLOSE:
  8.   wb_destroy_window($window);
  9.   break;
  10.  case IDC_BUTTONOK:
  11.   global $main;
  12.   $main->OnClickOk();
  13.   break;
  14. }
  15. }
  16. class main
  17. {
  18. function main()
  19. {
  20.  $winmain = wb_create_window(null, AppWindow, APP_NAME, WBC_CENTER, WBC_CENTER, 542, 419, 0x00000000, 0);
  21.  wb_create_control($winmain, PushButton, 'ok', 1, 1, 115, 25, IDC_BUTTONOK);
  22.  wb_set_handler($winmain, 'EventHandler');
  23.  wb_main_loop();
  24. }
  25. function OnClickOk()
  26. {
  27.  // Du code, OSEF
  28. }
  29. }
  30. $main = new main();
  31. wb_main_loop(); // Suffisait de mettre ça à la fin
  32. ?>
 

Et idem pour le second code que je donne, j'imagine que ça foire puisque j'appelle la fonction avant que mon constructeur "se termine".
Va falloir que j'étudie de plus prêt la façon dont PHP gère tout ça.

Message cité 1 fois
Message édité par dwogsi le 07-05-2007 à 15:05:28

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 07-05-2007 à 15:07:56    

dwogsi a écrit :

J'veux bien faire un singleton mais je ne vois pas en quoi ça pourrait m'aider à récupérer l'instance.


Bah le principe du singleton, c'est que tu ne peux l'instancier qu'une fois...[:dawa]
Donc si tu l'as déjà utilisé, tu vas récupérer la même instance la seconde fois.[:dawa]
M'enfin c'était pas ça le soucis...donc bon pas grave, même si ça reste plus propre amha.:o

Message cité 1 fois
Message édité par skeye le 07-05-2007 à 15:08:24

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-05-2007 à 15:07:56   

Reply

Marsh Posté le 07-05-2007 à 15:11:54    

skeye a écrit :

Bah le principe du singleton, c'est que tu ne peux l'instancier qu'une fois...[:dawa]


Je suis au courant oui.

skeye a écrit :

Donc si tu l'as déjà utilisé, tu vas récupérer la même instance la seconde fois.[:dawa]


Oui mais je ne récupérais rien du tout. Donc singleton ou pas, ça changeait rien.
Edit : Non rien... J'ai eut un soucis d'intelligence là.

skeye a écrit :

M'enfin c'était pas ça le soucis...donc bon pas grave, même si ça reste plus propre amha.:o


Mais je suis aussi de cet avis, m'enfin pour un truc qui relève de l'expérimental je cherche pas non plus à faire ce qu'il y a de plus propre.

 

Edit : Non mais en fait tu as complètement raison. Le singleton c'est la meilleur solution, quoique je sais pas si c'est vraiment faisable en PHP4. Je vais étudier ça.
Edit2 : Oui c'est faisable, j'aurais dû y penser. Merci.


Message édité par dwogsi le 07-05-2007 à 15:36:35

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 07-05-2007 à 16:35:46    

dwogsi a écrit :

Non ça ne change rien.
 
Edit :
Je viens de faire un test avec un bou de code encore plus simple :

Code :
  1. <?
  2. class main
  3. {
  4. function main()
  5. {
  6.  EventHandler();
  7. }
  8. function OnClickOk()
  9. {
  10.  echo 'ok';
  11. }
  12. }
  13. function EventHandler()
  14. {
  15. global $test;
  16. $test->OnClickOk(); // Call to a member function on a non-object
  17. }
  18. $test = new main();
  19. ?>


Et j'ai exactement la même erreur.
Le global sur un objet n'est-il pas censé fonctionner?


Et si tu met le $test = new main(); avant la déclaration de EventHandler ?
Je sais, ça peut paraître tordu, mais je crois que j'ai déjà eu ce genre de problème !
 
Edit: mince, j'avais pas vu que vous aviez déjà une solution ! Je vais d'ailleurs l'étudier :P


Message édité par kao98 le 07-05-2007 à 16:36:49

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 07-05-2007 à 16:54:20    

Et oui ^^
Pour faire un singleton, en PHP4, c'est pas bien compliqué en fait. Suffit d'ajouter une méthode un peut particulière :

Code :
  1. function &getInstance() {
  2.   static $instance = null;
  3.   if (is_null($instance)) $instance = new ClassName();
  4.   return $instance;
  5. }


Et à chaque fois que tu veut utiliser ton objet tu fais un appel static à ta méthode getInstance :
$myObject = & ClassName::getInstance();

 

Comme ça tu es sûr d'avoir une seule instance et de toujours la récupérer.


Message édité par dwogsi le 07-05-2007 à 17:05:59

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed