Retour de metode static assignée par reference

Retour de metode static assignée par reference - PHP - Programmation

Marsh Posté le 21-07-2006 à 16:54:26    

Bonjour,
Dans le cadre de mon CMS je suis tombé sur un problème:
J'ai une classe maClasse qui contient 1 attribut static monAttribut et une metode static maMetode, cette dernière retournant monAttribut.
Maintenant, depuis une autre classe X, si je fais :
 
$this->var =& maClasse::maMetode();
 
il me sort que je n'ai pas le droit de passer une metode par reference (c'est pas vraiment ce que je voulais faire mais bon.. [:pingouino])
Donc pour le moment je m'en sors avec un minable
 
$this->var =& maClasse::monAttribut;
 
Mais c'est crade, parceque j'ai du mettre monAttribut en public et du coup maMetode me sert plus à rien.
 
Est-ce que qqn voit où je me plante?
 
Merci bien


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 21-07-2006 à 16:54:26   

Reply

Marsh Posté le 22-07-2006 à 16:33:01    

Bonjour,
Je viens de résoudre mon problème,
 
Enfait j'avais pas vu que pour décréter qu'une fonction retourne une variable (et non un objet) par reference, elle doit être définie comme  
 
function &maFonction()
{
...
}
 
Du coups maintenant le  
 
$this->var =& maClasse::maMetode();  
 
Passe sans problèmes.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 23-07-2006 à 13:15:08    

Euh... suis-je le seul à penser que ce que tu demandes est une abérration conceptuelle?

Reply

Marsh Posté le 23-07-2006 à 13:34:45    

Peux tu expliciter le fond de ta pensée ? :)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 23-07-2006 à 14:02:13    

Bien sur. Si tu cherches à passer une valeur de retour par référence, c'est généralement soit pour économiser de la place mémoire, soit pour pouvoir faire des modification directement sur l'objet.
 
Si tu veux le faire pour la première option, c'est généralement que tu en est arrivé à un point critique de ton développement et que tes ressources arrivent à saturation. Dans ce cas, tu auras au préalable fixé tes spécifications pour cette partie du code de tel sorte qu'elle ne puisse plus être modifiée car fortement dépendante de ton implémentation et non plus des concepts. Ce sont des cas qui ne se justifient que très rarement.
 
Si c'est pour la seconde option que tu veux appliquer cette méthode, tu casses tout ton principe d'accesseur. En faisant un passage par référence, tu n'obliges plus l'utilisateur à passer par tes accesseurs pour modifier ton objet, et dans ce cas ton getter est totalement inutile. Si tu as, ou prélable, pris la précaution de dupliquer ta variable statique pour en retourner une copie, c'est ta variable statique qui n'a plus de raison d'être puisqu'elle n'est jamais manipulée et sert, au mieux, de squelette.
 
Pour résumé, si tu es dans le premier cas, php n'est sans doute pas la solution, si tu es dans le second, tu bousilles tout méchanisme de validation que tu aurais pu mettre en place.

Reply

Marsh Posté le 23-07-2006 à 22:31:36    

Salut :)
 
Donc effectivement ce n'est pas le 1er cas de figure.
 
Je t'explique mon "raisonnement". J'ai plusieurs metodes, dans plusieurs classes differentes qui requierent une connection à une base de donnée. J'ai créé un objet DataBase qui me permet de mettre un niveau d'abstraction par rapport à la base. Le problème est que je voudrais eviter de devoir à chaque fois creer un nouvel Objet (parceque le constructeur fait pleins de trucs, et j'ai pas besoin qu'il les refasse 15 fois par page :o). Au debut je passais par parametre l'objet Database à toutes les classes ... Mais c'est un peu usant à force ... Du coup j'ai pensé a une variable statique.
La reference decoule d'un bidouillage (et c'est probablement la que c'est pas bien ce que je fais). Enfait par pure paresse, plutot que d'appeler l'objet statique à chaque fois que j'en ai besoin, j'ai fait ça :

Code :
  1. public function __construct(){
  2. ...
  3. $this->db = DatabaseBS::getInstance();
  4. ...
  5. }

et j'ai fait ça dans toutes les classes qui en ont besoin, du coup j'utilise un $this->db, ce qui est plus rapide à ecrire. Et la référence? C'est juste pour que si qqch arrive à la connection (ouverture, fermeture,...) tout le monde soit bien d'accord sur son statut.
 
J'espere avoir été clair ...  
A bientot


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 23-07-2006 à 23:37:29    

Bon, dans ce cas, ce que tu veux, c'est ce que l'on appelle un Singleton. Vu que tu utilises du php5, tes objets sont passé par référence pour ce qui est du retour des fonctions.
 
Example:

Code :
  1. <?php
  2. class test {
  3. public static $toto = null;
  4. public $val = null;
  5. public static function getInstance() {
  6.  if(test::$toto === null) {
  7.   test::$toto = new test();
  8.  }
  9.  return test::$toto;
  10. }
  11. private function __construct() {
  12.  $this->val = 2;
  13. }
  14. }
  15. $bla = test::getInstance();
  16. $blu = test::getInstance();
  17. $blu->val = 3;
  18. echo $bla->val;
  19. ?>


Comme résultat d'output, tu auras bien 3 et non plus deux. $bla et $blu partageant la même instance. Et comme php ne gère pas de thread, pas besoin de faire plus poussé pour les méchanismes d'initialisation.


Message édité par gizmo le 23-07-2006 à 23:37:44
Reply

Marsh Posté le 24-07-2006 à 00:01:36    

Ok, merci :jap:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Sujets relatifs:

Leave a Replay

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