JeromeJ
Membre
Messages : 8
Inscription : Sep 2008
Réputation : 0
|
[Résolu][PHP] Référence et POO
Hello, j'ai un ptit soucis que j'aimerais régler...
En temps normal ceci fonctionne:
Code PHP :
<?php $var = 3; $array = array(&$var);
$array[0] = 2;
echo $var,', ',$array[0]; // Affiche '2, 2' // On constate ainsi que les 2 ont bien été modifiés ?>
Malheureusement j'ai tenté la même chose dans une classe et PHP m'a sorti ça:
PHP a écrit :Parse error: parse error, unexpected '&', expecting ')' in X on line 53
Voici un bout de code (et oui de la chimie):
Code PHP :
static $atom_list = array( &self::$atoms['H'], ...
Merci d'avance
(Ce message a été modifié le : 10-04-2008 08:57 PM par Sephi-Chan.)
|
|
| 09-24-2008 09:50 PM |
|
Ekilio
Membre
Messages : 209
Inscription : Apr 2008
Réputation : 10
|
RE: [PHP] Référencement et POO
Bonjour,
array() n'est pas une fonction mais un constructeur de langage (cf : http://fr2.php.net/manual/fr/function.array.php).
Par conscéquent, il est possible que passer une variable par référence à l'interieur de celle-ci ne soit pas autorisé. Tentes éventuellement de laisser la première valeur vide (ou à une valeure inutile), puis de la modifier :
Code PHP :
static $atom_list = array( 'toto', ... ); $atom_list[0] = &self::$atoms['H'];
Ca fonctionnera peut-être mieux.
|
|
| 09-24-2008 10:12 PM |
|
JeromeJ
Membre
Messages : 8
Inscription : Sep 2008
Réputation : 0
|
RE: [PHP] Référencement et POO
Salut,
Il m'est impossible de faire ça (erreur PHP).
Code simplifié:
Code PHP :
class Periodic_table { static $atoms = array( ... ); static $atom_list = array( ... ); $atom_list[0] = &self::$atoms['H']; }
PHP a écrit :Parse error: parse error, unexpected T_VARIABLE, expecting T_FUNCTION in X on line 139
Et si je reajoute static devant $atom_list[0]:
PHP a écrit :Fatal error: Cannot redeclare Periodic_table::$atom_list in X on line 139
(Ce message a été modifié le : 09-24-2008 10:20 PM par JeromeJ.)
|
|
| 09-24-2008 10:20 PM |
|
Hakushi
Membre
Messages : 79
Inscription : Sep 2008
Réputation : 1
|
RE: [PHP] Référencement et POO
Code PHP :
class Periodic_table { static $atoms = array( ... ); static $atom_list = array( ... ); self::$atom_list[0] = &self::$atoms['H']; }
Et comme ca?
|
|
| 09-24-2008 10:24 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [PHP] Référencement et POO
Et si on lui demandait plutôt pourquoi il a besoin de faire ça ? 
Et sinon on dit "référence" pas "référencement"
|
|
| 09-24-2008 10:37 PM |
|
phenix
Membre
Messages : 279
Inscription : May 2007
Réputation : 2
|
RE: [PHP] Référence et POO
Heu c'est quoi cette syntaxe ?
Code :
$array = array(&$var);
le & sert a quoi au juste ?
Phenix, administrateur de streamanga
Visitez aussi mon MMORPG la vallée des larmes
|
|
| 09-25-2008 01:20 AM |
|
Ekilio
Membre
Messages : 209
Inscription : Apr 2008
Réputation : 10
|
RE: [PHP] Référence et POO
Jerome_J : L'erreur PHP, c'est normal. Tu tente d'utiliser une instruction dans une classe mais hors d'une fonction. Met ton instruction dans une fonction statique qui initialisera la fonction, sinon ça ne marchera pas.
phenix : Le & sert à passer la variable par référence.
En d'autres termes, au lieu de passer la valeure d'une variable, on passe la variable elle-même.
Un exemple :
Code PHP :
function ajoute($a) { $a += 3; }
$a = 0; ajoute($a); echo $a; //Ceci affichera 0 : $a a été passé par valeure, autrement dit //une nouvelle variable a été créée dans la fonction, et c'est la valeur //de cette nouvelle variable qui a été modifiée.
ajoute(&$a); echo $a; //Ceci affichera 3 : $a a été passée par référence, autrement dit //c'est la même variable $a qui est prise en compte dans et hors de la fonction. //C'est donc la valeur de notre variable $a qui est modifiée, et non pas d'une autre //variable qui aurait le même nom, mais pas la même portée.
Ca peut être utile dans pas mal de choses ; une des utilités est dans le cadre d'un tableau, pour référencer des truc et pouvoir les modifier au lieu de modifier juste une valeur :
Code PHP :
$this->infos['id'] = &$joueur->id; $this->infos['id']++;
Avec cet exemple, l'ID du joueur vient d'augmenter, sans avoir à modifier l'objet lui-même (enfin, ce n'est valable que si la valeur id de l'objet joueur est publique, bien sûr).
Un autre usage est de simplifier l'appel à quelque chose :
Code PHP :
$this->plateau = &$this->partieInfo['plateau']['cases'];
De cette manière, toute modification à $this->plateau sera répercutée sur la variable en mémoire dans le tableau.
Cela peut enfin servire pour des fonctions récursive et/ou qui devraient renvoyer de nombreux résultats :
Code PHP :
function modifie($case, $plateau, $suivant) { if($plateau[$case + $suivant] == 0) { $plateau[$case + $suivant] = 1; $retour = modifie($case + $suivant, &$plateau, 1); if($retour == 0) { return 1; } else { return 2; } } else { return 0; } }
$etat = modifie(1, &$plateau, 0);
Ce bout de code, totalement inventé, permet par exemple de recevoir une valeur de retour indiquant le bon déroulement du processus tout en modifiant effectivement le plateau, sans avoir à gérer des retours multiples avec des tableau, et autres.
Voila, mes deux centimes de la nuit :-)
(Ce message a été modifié le : 09-25-2008 03:21 AM par Ekilio.)
|
|
| 09-25-2008 03:18 AM |
|
JeromeJ
Membre
Messages : 8
Inscription : Sep 2008
Réputation : 0
|
RE: [PHP] Référence et POO
@oxman: Par soucis de mémoire premièrement et par utilité: je souhaite pouvoir faire autant ceci
que
@Ekilio: Il y a-t-il une fonction magique statique pour auto-initialiser une classe ? Si oui, laquelle ? J'ai cherché via Google mais sans succès. (même si j'aurais préféré automatiquement l'écrire que d'avoir à l'exécuter à chaque fois  )
(Ce message a été modifié le : 09-25-2008 05:41 PM par JeromeJ.)
|
|
| 09-25-2008 05:40 PM |
|
Hakushi
Membre
Messages : 79
Inscription : Sep 2008
Réputation : 1
|
RE: [PHP] Référence et POO
Je suis pas sur d'avoir saisie ta question sur auto-initialiser une classe, mais personnelement j'utilise ca pour m'assurer d'avoir toujours une instance de ma classe
Code PHP :
class MaClass { private static $instance; private function __construct() public static function get() { if (self::$instance) return self::$instance; else { self::$instance = new MaClass(); return self::$instance; } } }
Comme ca tu accedes a tes fonctions comme ceci :
Code PHP :
MaClass::get()->maFunction();
Ainsi ta classe est auto-initialiser si elle ne l'etait pas deja (Singleton).
|
|
| 09-25-2008 06:23 PM |
|
JeromeJ
Membre
Messages : 8
Inscription : Sep 2008
Réputation : 0
|
RE: [PHP] Référence et POO
Ah pas mal  merci Hakushi.
On m'avait déjà parler de Singleton Oo mais j'avais rien pigé  là c'est claire. Re-merci.
Ça sera surement LA solution pour l'instant à faute de mieux (juste dommage qu'on doit se tapper le ::get et puis c'est plus vraiment un accès directe à la classe mais à une instance (toujours la même) cela ne risque-t-il pas de poser des problèmes ?)
|
|
| 09-25-2008 07:48 PM |
|