OVH Cloud OVH Cloud

poo en php4

5 réponses
Avatar
jerome herve
Bonjour à tous,

J'ai un probleme avec un code de ce genre.
Ca marche en php5, mais en php4 je sais pas comment faire (ou placer les & )
Merci de votre aide.

class truc{
var $c;
function truc(){
}
function ajt($o){
$this->c = $o;
}
function foo($v){
$this->c -> set($v);
}
}
class machin{
var $v;
function machin($v){
$this->v = $v;
}
function set($v){
$this->v = $v;
}
}
$m = new machin('valeur originale');
$o = new truc();
$o -> ajt($m);
$o -> foo("nouvelle valeur");
echo $m -> v; // renvoie 'valeur originale' alors que j'attend 'nouvelle
valeur'

5 réponses

Avatar
Vincent Lascaux
class truc{
var $c;
function truc(){
}
function ajt($o){
$this->c = $o;
}


Ici, il fallait
function ajt(&$o) {
$this->c =& $o;
}

--
Vincent

Avatar
loufoque
jerome herve a dit le 12/01/2005 23:15:

Ca marche en php5, mais en php4 je sais pas comment faire (ou placer les & )
Partout dès qu'on transmet un objet.


class truc
{
var $c;

function truc()
{
}

function ajt(&$o)
{
$this->c =& $o;
}

function foo($v)
{
$this->c->set($v);
}
}

class machin
{
var $v;

function machin($v)
{
$this->v = $v;
}

function set($v)
{
$this->v = $v;
}
}

$m =& new machin('valeur originale');
$o =& new truc();
$o->ajt($m);
$o->foo("nouvelle valeur");
echo $m->v;

Avatar
jerome herve
Merci,
c'est clair maintenant
Avatar
Marc

J'ai un probleme avec un code de ce genre.
Ca marche en php5, mais en php4 je sais pas comment faire (ou placer les & )


oui, php5 gere les objets par référence de facon implicite et pas php4.


Merci de votre aide.




* tout affectation (signe =) d'objet par defaut effectue une recopie de
l'objet.

$this->attribut = $obj; # recopie
$this->attribut = &$obj; # reference

$obj = new Classe(...); # recopie
$obj = &new Classe(...); # reference (pas de recopie)

* de meme, dans la déclaration des fonctions et méthodes, il faut faire
attention ; si tu ne veux pas de recopie pour raison de performence, ou
pour gerer un arbre d'objet par exemple, tu dois la encore faire ceci :


function ma_methode($str, $obj) { # c'est une recopie
$this-> obj = $obj;
}

function ma_methode($str, &$obj) { # c'est une référence

# il me semble que le & n'est pas nécessaire (mais pas genant)
# puisqu'on a deja une référence;
# une reference sur une reference est toujours une référence,
$this-> obj = $obj;
}

Avatar
loufoque
Marc a dit le 13/01/2005 09:31:

oui, php5 gere les objets par référence de facon implicite et pas php4.


En PHP5, si on fait
$obj = new stdClass;
$obj2 = $obj;
$obj->var = 'test';
unset($obj);
var_dump($obj2);

on n'a pas NULL (ce qui serait le cas si on mettait des & partout).
Attention, donc.

En fait, ce n'est pas vraiment des références.