Poster une réponse 
 
Note de cette discussion :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Résolu][PHP] Référence et POO
Auteur Message
JeromeJ Hors ligne
Membre

Messages : 8
Inscription : Sep 2008
Réputation : 0
Message : #1
:mauvais: [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 1
(Ce message a été modifié le : 10-04-2008 08:57 PM par Sephi-Chan.)
09-24-2008 09:50 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ekilio Hors ligne
Membre

Messages : 209
Inscription : Apr 2008
Réputation : 10
Message : #2
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
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
JeromeJ Hors ligne
Membre

Messages : 8
Inscription : Sep 2008
Réputation : 0
Message : #3
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
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Hakushi Hors ligne
Membre

Messages : 79
Inscription : Sep 2008
Réputation : 1
Message : #4
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
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #5
RE: [PHP] Référencement et POO
Et si on lui demandait plutôt pourquoi il a besoin de faire ça ? 16
Et sinon on dit "référence" pas "référencement" 2
09-24-2008 10:37 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
phenix Hors ligne
Membre

Messages : 279
Inscription : May 2007
Réputation : 2
Message : #6
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
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ekilio Hors ligne
Membre

Messages : 209
Inscription : Apr 2008
Réputation : 10
Message : #7
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, &$plateau1);
      if(
$retour == 0)
      {
         return 
1;
      } else {
         return 
2;
      }
   } else {
      return 
0;
   }
}

$etat modifie(1, &$plateau0); 

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
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
JeromeJ Hors ligne
Membre

Messages : 8
Inscription : Sep 2008
Réputation : 0
Message : #8
RE: [PHP] Référence et POO
@oxman: Par soucis de mémoire premièrement et par utilité: je souhaite pouvoir faire autant ceci
Code PHP :
$atoms[ID
que
Code PHP :
$atoms[NOM

@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 34)
(Ce message a été modifié le : 09-25-2008 05:41 PM par JeromeJ.)
09-25-2008 05:40 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Hakushi Hors ligne
Membre

Messages : 79
Inscription : Sep 2008
Réputation : 1
Message : #9
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
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
JeromeJ Hors ligne
Membre

Messages : 8
Inscription : Sep 2008
Réputation : 0
Message : #10
RE: [PHP] Référence et POO
Ah pas mal 1 merci Hakushi.

On m'avait déjà parler de Singleton Oo mais j'avais rien pigé 2 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
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse 



ContactJeuWeb (JeuPHP) - Crée ton jeu par navigateurRetourner en hautRetourner au contenuVersion bas-débit (Archivé)Syndication RSS