Utiliser une constante définie en dehors d'une classe dans celle-ci

Utiliser une constante définie en dehors d'une classe dans celle-ci - PHP - Programmation

Marsh Posté le 21-10-2005 à 14:29:36    

Salut all,
 
voila le problème: j'ai un define en dehors d'une classe. Et dans cette classe, je voudrais utiliser ce define.
Comment faire ?
 
Ca doit pas etre bien dure, mais je ne trouve rien la dessus.
 
Merci de votre aide par avance ;)

Reply

Marsh Posté le 21-10-2005 à 14:29:36   

Reply

Marsh Posté le 21-10-2005 à 14:34:46    

Qu'est-ce que t'arrives pas à faire, concrètement ?


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 21-10-2005 à 14:41:51    

concretement dans ma classe, quand j'utilise ma constante qui est définie a l'exterieur de la classe, php dit que cette constante n'est pas definie. (alors qu'elle l'est je m'en sers ailleurs sans problème)
 
Tout se passe comme si dans une classe, les constantes définies à l'exterieur de celle-ci n'étaient pas accessibles, ce que je comprends mais je ne vois pas comment y acceder.

Reply

Marsh Posté le 21-10-2005 à 14:42:41    

une constante c'est une constante, ca se met en entete du programme, et ca servira dans tout le programme.
 
ou vois tu que tu peux foutre une constante dans une classe. qui plus est débile comme manière.
 
 
et quand tu definie une constante, pour t'en reservir tu as juste à taper le nom de ta constante :  
 
MA_CONSTANTE
 
prefere les majuscules pour determiner les constantes


---------------
Les CSS c'est bon mangez-en
Reply

Marsh Posté le 21-10-2005 à 14:50:01    

C'est quoi qu'est déclaré en premier : la constante ou la classe?

Reply

Marsh Posté le 21-10-2005 à 15:02:45    

En premier la constante est déclarée.
Bon démonstration:
j'ai une ligne comme ca dans un fichier ou y'en a plein:

Code :
  1. define('AVATARS_TABLE', $table_prefix . 'avatars');


ok, apres j'ai ca:

Code :
  1. include_once($root_path . 'includes/defines.php');


Code :
  1. class user
  2. {
  3. function user($pseudo, $pass)
  4. {
  5.              echo AVATARS_TABLE . "<br />\n";
  6.         }
  7. }


Bon c'est un exemple mais le principe est la!
 
Merci de votre aide

Reply

Marsh Posté le 21-10-2005 à 15:56:49    

L'erreur tu l'as rien qu'avec la définition de la classe ou c'est quand t'appelles ta méthode user ?
 
Si c'est à l'appel, c'est probablement parce que t'as pas défini la constante *avant* de l'appeler.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 21-10-2005 à 16:07:28    

c'est a l'appel !  
Pourtant j'ai bien l'include avant la définition de ma classe...

Reply

Marsh Posté le 21-10-2005 à 16:09:17    

Mais est-ce que tu as l'include avant l'appel de user ?
 
C'est pas la même chose.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 21-10-2005 à 16:12:13    

voici l'appel de user:

Code :
  1. include_once($neta_root_path . 'includes/login_class.php');
  2. if (!isset($_GET['action']))
  3. {
  4.               // du code ici
  5. }
  6. else if ($_GET['action'] == "login" )
  7. {
  8.  $user = new user($_GET['pseudo'], $_GET['passwd']);
  9. }


 
Merci pour ton aide en tous cas

Reply

Marsh Posté le 21-10-2005 à 16:12:13   

Reply

Marsh Posté le 21-10-2005 à 16:13:15    

ben s'il l'a avant la déclaration, il l'a forcément avant l'appel....
 
pasque il est obligé d'avoir déclaré avant d'avoir appelé, sinon il aurait une erreur de class non définie...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 21-10-2005 à 16:16:00    

Xav_ a écrit :

ben s'il l'a avant la déclaration, il l'a forcément avant l'appel....
 
pasque il est obligé d'avoir déclaré avant d'avoir appelé, sinon il aurait une erreur de class non définie...


 
Non, tu peux la définir après. En PHP5 ça marche en tout cas.
 
bob007 > ben voilà, rajoute un include_once($root_path . 'includes/defines.php'); avant ton if.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 21-10-2005 à 16:25:34    

marche pas mieux !
j'ai ajouté cet include avant le if, et aussi explicitement avant la déclaration de la classe (il est inclus par un autre .php normalement)

Reply

Marsh Posté le 21-10-2005 à 16:27:40    

tu veux dire qu'en PHP5 tu peux appeler une classe avant de l'avoir définie ???
 
houlà, ce langage m'étonnera chaque jour un peu plus....


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 21-10-2005 à 16:33:58    

Xav_ a écrit :

tu veux dire qu'en PHP5 tu peux appeler une classe avant de l'avoir définie ???
 
houlà, ce langage m'étonnera chaque jour un peu plus....


 
Ca marche aussi avec les fonctions.
 
Le PHP est ultra-permissif, c'est pas une nouveauté.  [:spamafote]  
 
bob007 > euh, ouais bon colle le code de tes 3-4 fichiers principaux avec leurs chemins, voir.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 21-10-2005 à 16:42:26    

OK chef. C'est partii:
dans ~/includes/login.php

Code :
  1. include_once($root_path . 'includes/login_class.php');
  2. include_once($root_path . 'includes/defines.php');
  3. if (!isset($_GET['action']))
  4. {
  5.             //du code ici
  6. }
  7. else if ($_GET['action'] == "login" )
  8. {
  9.  $user = new user($_GET['pseudo'], $_GET['passwd']);
  10. }


Apres, y'a ~/includes/login_class.php:

Code :
  1. include_once($root_path . 'includes/defines.php');
  2. include_once($root_path . 'includes/db/db.php');
  3. include_once($root_path . 'includes/common.php');
  4. class user
  5. {
  6. function user($pseudo, $pass)
  7. {
  8.                echo AVATARS_TABLE;
  9.               //...
  10.         }
  11. }


~/includes/defines.php:

Code :
  1. //...
  2. define('AVATARS_TABLE', $table_prefix . 'avatars');
  3. //...


 
Voila voila


Message édité par bob007 le 21-10-2005 à 16:43:25
Reply

Marsh Posté le 21-10-2005 à 18:04:41    

une constante ca veut dire que c'est constant, et donc ca restera toujours constant.
 
et toi qu'est ce que tu fais ?
tu mixe une variable avec une string pour generer ta constante
define('AVATARS_TABLE', $table_prefix . 'avatars');
 
autant utiliser une variable et apprendre à programmer


---------------
Les CSS c'est bon mangez-en
Reply

Marsh Posté le 21-10-2005 à 18:08:57    

bob007 > Comment être certain que ta constante est bien déclaré avant ta classe alors que dans ton fichier principal le fichier contenanbt la contante est inclus aprés celui de la classe? Si par malheur tous les include_once du fichier principal sont transformé avant le traitement des autres fichiers ta constante se retrouve derriére la classe.

Reply

Marsh Posté le 21-10-2005 à 18:18:02    

gatsuat> Heu ecoute bonhomme, si c'est pour dire ca, tu te la garde ta reflexion. Le $table_prefix est comme son nom l'indique le prefix des tables sql, et donc constant tout le long de l'application. De plus ce principe de define constante a partir d'une variable, c'est pas nouveau et je ne suis pas le seul a faire comme ca (cf pas mal de forums, cms et autres).
 
Omega2> Je pense que c'est toi qui a raison! En changeant l'ordre des inclusions ca devrait marcher, ca serait logique! (atta je test: non pas mieux). La solution est dans cette optique je pense. Merci de m'avoir éclairé !

Reply

Marsh Posté le 21-10-2005 à 22:27:48    

Met des print_r(get_defined_constants()) un peu partout et regarde à quel moment ta constante est définie et à quel moment elle ne l'est pas/plus.
 

bob007 a écrit :

gatsuat> Heu ecoute bonhomme, si c'est pour dire ca, tu te la garde ta reflexion. Le $table_prefix est comme son nom l'indique le prefix des tables sql, et donc constant tout le long de l'application. De plus ce principe de define constante a partir d'une variable, c'est pas nouveau et je ne suis pas le seul a faire comme ca (cf pas mal de forums, cms et autres).


 
En toute rigueur $table_prefix devrait être une constante aussi dans ce cas. [:figti]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 22-10-2005 à 08:26:47    

bob007 a écrit :

gatsuat> Heu ecoute bonhomme, si c'est pour dire ca, tu te la garde ta reflexion. Le $table_prefix est comme son nom l'indique le prefix des tables sql, et donc constant tout le long de l'application. De plus ce principe de define constante a partir d'une variable, c'est pas nouveau et je ne suis pas le seul a faire comme ca (cf pas mal de forums, cms et autres).
 
Omega2> Je pense que c'est toi qui a raison! En changeant l'ordre des inclusions ca devrait marcher, ca serait logique! (atta je test: non pas mieux). La solution est dans cette optique je pense. Merci de m'avoir éclairé !


 
ben en fait je trouve que ca relève d'une règle mathématique toute simple.  
 
CONSTANTE + $Variable = $Variable <=== ben ouais, un truc constant + un truc variable, ca donne toujours quelque chose de variable.
2+X = un truc varaible, sachant que 2 est constant et x variable.
 
CONSTANTE + CONSTANTE = CONSTANTE <== la c'est mieux.
2+2 = 4 un truc CONSTANT.
 
donc autant modifier ta variable et la passer en constante.
ouais je sais je suis chiant, mais c'est juste de la grammaire de programmation. M'enfin s'il y en a qui veulent bien me contredire, il n'y a pas de soucis. et je serai d'accord d'couter


---------------
Les CSS c'est bon mangez-en
Reply

Marsh Posté le 22-10-2005 à 08:49:21    

sielfried a écrit :

Met des print_r(get_defined_constants()) un peu partout et regarde à quel moment ta constante est définie et à quel moment elle ne l'est pas/plus.
 
 
En toute rigueur $table_prefix devrait être une constante aussi dans ce cas. [:figti]


 
Ouais mais la rigueur elle existe pas en PHP. C'est un langage tellement permissif, que des boulets vont toujours te contredire en disant qu'ils ont vu ça ailleurs.
 
Je dis pas que ca devrait être un langage Elitiste, mais il pourrait laisser moins de libertés quand même. C'est comme le coup des "$variables", et maintenant du coup on voit très souvent des aberations du genre
 
echo "$variable";
les guillemets n'ont rien à foutre là.


---------------
Les CSS c'est bon mangez-en
Reply

Marsh Posté le 22-10-2005 à 08:50:16    

bob007 a écrit :

gatsuat> Heu ecoute bonhomme, si c'est pour dire ca, tu te la garde ta reflexion. Le $table_prefix est comme son nom l'indique le prefix des tables sql, et donc constant tout le long de l'application. De plus ce principe de define constante a partir d'une variable, c'est pas nouveau et je ne suis pas le seul a faire comme ca (cf pas mal de forums, cms et autres).


 
Ben c'est qu'ils ont été mal concus par des gens comme toi  [:petrus75]  


---------------
Les CSS c'est bon mangez-en
Reply

Marsh Posté le 22-10-2005 à 10:23:43    

gatsusat a écrit :

Ouais mais la rigueur elle existe pas en PHP.

C'est pas par ce que le php est permissif que ca empéche d'être rigoureux. Au contraire, plus un langage est permissif plus il faut se montrer rigoureux pour que le code soit maintenable, logique et que ca ne tourne pas au n'importe quoi.
 
Mettre les mauvaise pratiques sur le dos du langage, c'est ce voiler la face : même si le langage permet de mauvaises pratiques, c'est le programmeur qui les mets en place.

Reply

Marsh Posté le 22-10-2005 à 10:42:50    

omega2 a écrit :

C'est pas par ce que le php est permissif que ca empéche d'être rigoureux. Au contraire, plus un langage est permissif plus il faut se montrer rigoureux pour que le code soit maintenable, logique et que ca ne tourne pas au n'importe quoi.
 
Mettre les mauvaise pratiques sur le dos du langage, c'est ce voiler la face : même si le langage permet de mauvaises pratiques, c'est le programmeur qui les mets en place.


 
Ben ce que je disais : C'est que les kevins qui font n'importe quoi, ils ne se rendent pas compte qu'il font n'importe quoi, car le langage est permissif.
 
mais justement des gens comme toi et moi, on essaye d'être rigoureux dans ce qu'on fait.


---------------
Les CSS c'est bon mangez-en
Reply

Marsh Posté le 22-10-2005 à 13:56:20    

bon bref je ne pense pas que cela soit le débat du post, car encore une fois cette variable ne change pas, elle pourrait etre constante (et devrait pour les puristes). De la à dire que je suis un boulet parce que je ne suis pas puriste,.... Bref ca m'aide pas du tout ! Merci à ceux qui ont fait avancé le shimlililibiililk

Reply

Marsh Posté le 23-10-2005 à 01:31:43    

bob007 a écrit :

marche pas mieux !
j'ai ajouté cet include avant le if, et aussi explicitement avant la déclaration de la classe (il est inclus par un autre .php normalement)


 
et si tu met ton define en début du fichier de déclaration de la classe (pour etre sur), et ce fichier de déclaration est le tout premier de ta série d'include (histoire d'etre sur que le define est avant la déclaration de la classe, et la déclaration avant l'appel), ça donne quoi ???
 
et puis sans rentrer dans le débat précédent (ça n'apporterait rien de plus), si tu fais vraiment ton define d'une constante (sans la partie variable), le pb persiste ???


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 24-10-2005 à 03:56:22    

Solution caca: global de ta constante (entre nous ça serait une variable que ça changerait rien... Si le plaisir d'alourdir un truc que tu sais qui ne changera pas autant définir une constante complète plutot que la rafistoler...)
Ou alors un iclude dans ton constructeur mais j'imagine que t'as des variables qui servent partout, donc encore la notion d'indépendance qui revient ;)
 
Sur le principe de la programmation objet, une classe est indépendante du reste donc t'as pas à y foutre des variables ou constantes sorties du placard, même si c'est tentant parce que php est permissif, faut pas ;)
Un constructeur doit avoir tout ce qu'il lui faut pour que la classe travaille tranquillement ;)
 
Et à ce moment là tu nous mets un REGISTER_GLOBAL=On et on en parle plus ;)
 
Tout ce qui rentre dans une classe, rentre par le constructeur et en paramètre point barre! Sauf courtoisies liées au http et autres sessions :D
Et encore une classe devrait être appelée depuis un controleur, l'accès aux données différencié de la génération graphique ;) Les principes de programmation c'est logique mais php permet tellement sans se rendre compte que... :(

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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