|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |
|
Membre du Club
![]() |
Bonjour,
je coince actuellement sur un soucis au niveau de la portée des objets. J'ai un fichier index.php dans le quel j'instancie un objet de la classe A et un objet de la classe B: Dans ma classe B, j'aimerai bien avoir accès à l'objet $a : Citation:
À part utiliser le mot clé "global" que je serai contraint de rédéclarer dans chaque méthode utilisant l'objet $a, n'y a-t-il pas une autre solution ? Parce que certe là ça ne semble pas être très important, mais en réalité j'ai pleins d'objets auxquels je voudrai accéder dans pleins de classes et dans pleins de méthodes. Utiliser le mot clé global à chaque fois est assez génant pour moi. N'y a-t-il pas une autre solution ? Sinon je peux faire de index.php une classe Index avec deux attributs $this->a (l'objet $a) et $this->b (...) et je fais hériter toute mes classes de Index, et donc je pourrai accéder dans toutes mes classes à mes deux objets comme ça : $this->a->getVar(); par exemple. Cette solution est elle meilleure ? Cependant elle m'oblige quand même à : 1) employer $this à chaque fois, et 2) à faire hériter toute mes classes de Index. Y a t il une solution qui m'aurait échappée ? Merci d'avance pour vos réponses. PS : sinon il y a la solution d'utiliser le tableau $GLOBALS et de mapper chaque valeur dans une variable, genre $a = $GLOBALS['a'] mais bof bof. |
|
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 2 288 ![]() |
Ben tu as la première : le mot clé global partout dans les méthodes. Effectivement ca n'est pas génial et puis il faut s'assurer que la variable est vraiment déclarée partout etc, ca peut poser des problèmes.
Ensuite tu as la solution de passer cette instance de classe en paramètre de chaque méthode. C'est plus clair parce que tu vois le paramètre, quand tu appelles la fonction tu SAIS que tu as besoin de cette autre classe, qu'elles est instanciée vu que tu la passes en paramètre. Mais ca peut etre ennuyeux si t'as 200 méthodes et trois classes utilisées dans chaque méthode. Tu peux aussi passer cette instance (de la classe A) au constructeur de la classe B. Comme ca tu ne le passes qu'une fois en paramètre, lors du constructeur, et donc ta classe B contient une "instance de la classe A" dans ses variables. Et puis il y a effectivement la solution de faire une classe supérieure qui se charge de contenir une instance de chacune de tes classes indispensables. Perso je pencherai pour la solution du constructeur dans la majorité des cas mais parfois ca n'est pas adapté. |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Jean-François CAMBOTDéveloppeur informatique Inscription : mars 2003 Messages : 842 ![]() |
Il ne faudrait pas passer plutôt par un multition ou un truc du genre :
function B() { $inst = A::getInstance(); $mavar = $inst->getVar(); } Je dis ça un peu à l'arrache, voir le cours sur ce site concernant les multitons
__________________
.o0o__St@iLeR__oOo. Chef de projet / Développeur Silverlight / ASP.NET MVC - MCP ASP.NET 4 Zend Framework / Ajax (Jquery et ExtJS) Adobe Flash Builder (Flex) Ma librairie pour faire communiquer PHP et Silverlight "à la" WCF : http://code.google.com/p/phpservices-silverlight/ |
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Inscription : mai 2002 Messages : 101 ![]() |
Effectivement, le plus clair me semble de passer une instance de A au constructeur de B.
Le global, ça devient vite le souk (et c'est pas propre). Ca peut se justifier si tu as des dépendances croisées (genre A utilise B et B utilise A), encore que... Le passage en paramètre, ça fonctionne bien pour un appel ou deux, mais si tu as toujours besoin de A, ça peut vite devenir lourd à implémenter |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : juillet 2007 Messages : 3 ![]() |
Sur le coup, je pensais comme koopajah, passer l'instance de A au constructeur de la classe B. Mais a ce moment la est ce que cela crée un pointeur vers l'instance A dans B, ou est ce que cela créer une autre instance de A propre a B ?
Sans compter que si on veux faire l'invers (utiliser B das A) cette solution n'est pas valable étant donner qu'il faudra bien en instancier un avant l'autre ^^. |
|
|
00
|
|
|
#6 | ||
|
Membre habitué
![]() Inscription : mars 2007 Messages : 87 ![]() |
salut,
tu peux aussi utilisez un registre (registry). Pas mal utiliser dans les frameworks. Exemple: Code :
|
||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 2 288 ![]() |
Tu passes ce qu'on appelle une référence, tu ne crées pas une nouvelle instance.
Et j'ai du mal a me rappeler d'un cas ou deux classes ont besoin mutuellement l'une de l'autre. |
|
|
00
|
|
|
#8 | |
|
Membre habitué
![]() Inscription : mai 2002 Messages : 101 ![]() |
Citation:
De manière plus générale, tout système représenté sous forme d'une liste chaînée bi-directionelle implique que A contient une référence à B et B une référence à A. Bien sûr, c'est beaucoup plus simple dans ce cas d'instancier les deux objets et de définir ensuite leur relation via un "set". |
|
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() ![]() Geoffray Inscription : août 2002 Messages : 137 ![]() |
Si j'ai bien compris, le passage d'objets se fait toujours par référence. Pour forcer un passage par valeur, il faut utiliser le mot clé clone
|
|
00
|
|
|
#10 |
|
Membre habitué
![]() Inscription : mai 2002 Messages : 101 ![]() |
Exact. Attention donc aux mauvaises surprises si on modifie l'objet dans une méthode à laquelle il a été passé...
|
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 2 288 ![]() |
Citation:
faut utiliser & devant pour passer par référence.Je le fais tellement souvent que j'avais oublié. |
|
|
|
00
|
|
|
#12 | |
|
Membre habitué
![]() Inscription : mai 2002 Messages : 101 ![]() |
Citation:
|
|
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 2 288 ![]() |
Citation:
Mais d'après la doc Citation:
|
||
|
|
00
|
|
|
#14 | |
|
Membre habitué
![]() Inscription : mai 2002 Messages : 101 ![]() |
mmh... La doc parle du passage d'argument pour les fonctions, je ne sais pas si les constructeurs sont englobés dans le tas... D'autant que la phrase
Citation:
|
|
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() |
Merci pour vos réponses.
Je constate qu'il n'y aucune solution vraiment "simple" et "propre", alors je me dis que je prends peut-être le problème à l'envers. Peut-être est-ce un defaut de conception de ma part ? En faite, j'ai crée une classe SQLManager (une couche d'asbtraction à la base, je sais qu'il existe PDO, mais là c'est un truc plus léger et adapté à ce dont j'ai besoin). J'ai une méthode query() pour executer des requetes. J'ai donc instancié un objet de cette classe : $sql = new SQLManager(); et j'aimerai bien pouvoir faire partout dans mon code $sql->query(); comme j'aurai fait pg_query(). Après j'ai d'autre classe dans le genre, comme Game : $game = new Game(); et j'aimerai pouvoir utiliser les methodes de mon objet $game partout dans mes autres classes. Vous voyez ? Je pense que c'est un des interêts de la POO et que je ne suis pas le seul à faire ça. Mais peut-être que je m'y prends mal. Est-ce qu'il serait plus judicieux de déclarer mes methodes en static et y accéder avec un simple SQLManager::query();, mais dans ce cas là coment faire pour les attributs de classe....? Genre dans ma classe Site, je charge un fichier de configuration avec loadConfig(); et je remplis les attributs $site->default_theme, $site->default_lang etc...que j'ai besoin à divers endroits du code. Est ce qu'il serait plus judicieux de créer un nouvel objet de ma classe SQLManager dans chaque classe...? Mais le problème reste le même pour ma classe Site et ses attributs... |
|
|
00
|
|
|
#16 | ||
![]() ![]() Inscription : juin 2003 Messages : 4 893 ![]() |
je fais quelque chose dans le même genre quand j'utilise des bases de données dans mon code, j'ai une classe BDD avec çà :
Code :
et comme ça j'ai juste besoin de me connecter une seule fois à la base, ce qui économise des ressources
__________________
Modérateur PHP |
||
|
|
00
|
|
|
#17 | |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 2 288 ![]() |
Citation:
Moi je dis +1 ! |
|
|
|
00
|
|
|
#18 | |||
![]() ![]() Inscription : juin 2003 Messages : 4 893 ![]() |
Citation:
en cadeau la version PHP 5 puisque je suis en train de faire des tests dessus Code :
__________________
Modérateur PHP |
|||
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Jean-François CAMBOTDéveloppeur informatique Inscription : mars 2003 Messages : 842 ![]() |
Bah oui, singleton ou multiton, c'ets ce que je dis dans le 3ème message laissé dans ce post... mais apparement il est passé à la trappe lol
__________________
.o0o__St@iLeR__oOo. Chef de projet / Développeur Silverlight / ASP.NET MVC - MCP ASP.NET 4 Zend Framework / Ajax (Jquery et ExtJS) Adobe Flash Builder (Flex) Ma librairie pour faire communiquer PHP et Silverlight "à la" WCF : http://code.google.com/p/phpservices-silverlight/ |
|
|
00
|
|
|
#20 |
|
Membre du Club
![]() |
Merci pour vos réponses.
J'ai finalement adopté le pattern Registry, qui est +/- ce que j'avais besoin. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com