JeuWeb - Crée ton jeu par navigateur
[Résolu][PHP] Référence et POO - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][PHP] Référence et POO (/showthread.php?tid=3100)

Pages : 1 2


[Résolu][PHP] Référence et POO - JeromeJ - 24-09-2008

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 :
<?php 
static $atom_list = array(
&
self::$atoms['H'],
...

Merci d'avance Big Grin


RE: [PHP] Référencement et POO - Ekilio - 24-09-2008

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 :
<?php 
static $atom_list = array(
'toto',
...
);
$atom_list[0] = &self::$atoms['H'];

Ca fonctionnera peut-être mieux.


RE: [PHP] Référencement et POO - JeromeJ - 24-09-2008

Salut,

Il m'est impossible de faire ça (erreur PHP).

Code simplifié:
Code PHP :
<?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



RE: [PHP] Référencement et POO - Hakushi - 24-09-2008

Code PHP :
<?php 
class Periodic_table
{
static
$atoms = array( ... );
static
$atom_list = array( ... );

self::$atom_list[0] = &self::$atoms['H'];
}

Et comme ca?


RE: [PHP] Référence et POO - phenix - 25-09-2008

Heu c'est quoi cette syntaxe ?

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

le & sert a quoi au juste ?


RE: [PHP] Référence et POO - Ekilio - 25-09-2008

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 :
<?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 :
<?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 :
<?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 :
<?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 :-)


RE: [PHP] Référence et POO - JeromeJ - 25-09-2008

@oxman: Par soucis de mémoire premièrement et par utilité: je souhaite pouvoir faire autant ceci
Code PHP :
<?php 
$atoms
[ID]
que
Code PHP :
<?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 ^^)


RE: [PHP] Référence et POO - Hakushi - 25-09-2008

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 :
<?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 :
<?php 
MaClass
::get()->maFunction();

Ainsi ta classe est auto-initialiser si elle ne l'etait pas deja (Singleton).


RE: [PHP] Référence et POO - JeromeJ - 25-09-2008

Ah pas mal Big Grin merci Hakushi.

On m'avait déjà parler de Singleton Oo mais j'avais rien pigé Smile 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 ?)


RE: [PHP] Référence et POO - Hakushi - 25-09-2008

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 :p , j'ai donc la flemme et pas le temps :p