JeuWeb - Crée ton jeu par navigateur

Version complète : [Résolu][PHP] Référence et POO
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Pages : 1 2
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
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.
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
Code PHP :
class Periodic_table
{
    static 
$atoms = array( ... );
    static 
$atom_list = array( ... );
    
    
self::$atom_list[0] = &self::$atoms['H'];


Et comme ca?
Heu c'est quoi cette syntaxe ?

Code :
$array = array(&$var);

le & sert a quoi au juste ?
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 :-)
@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)
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).
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 ?)
Faut voir l'usage personnellement je m'en sers sur des classes de liaisons DB ou sur des classes de representation unique, genre de chose ou tu veux etre sur d'avoir une et une seule instance de ta classe qui puisse etre faite.

Apres il y a moyen de sortir ca du contexte Singleton et de faire instancier ta classe si celle-ci ne l'est pas et de te retourner une reference a cette instanciation.

[edit]Ouais je sais, mais j'ai comme 200classes a modifier sur 30+ serveurs 10 , j'ai donc la flemme et pas le temps 10
Pages : 1 2
URLs de référence