variable pointant vers un attriut d'un objet

Petit nouveau ! | 4 Messages

11 févr. 2009, 11:06

Bonjour,

cela fait plusieurs jours que je planche sur un problème.

J'ai une certaine classe instanciée et ce que je voudrais faire, cest initialiser une variable (externe) qui pointerait vers un attribut de cette instance.

Tout cela dans le but de faire une sorte de Listenner sur cette variable et gérée par mon objet via la fonction __set().

j'ai essayé de différente manière sans succès.

Auriez vous une idée?

merci d'avance

ViPHP
ViPHP | 1136 Messages

11 févr. 2009, 12:41

Salut,

Si j'ai bien compris , tu veux avoir acces direct à un attribut d'une classe , directement via une variable de ton script ?

Si c'est la cas , alors , je te propose ce genre de solution :
$InstanceDeMaClasse = new MaClasse();

//exemple
$InstanceDeMaClasse->attribut  = "coucou";

$variablelocale  =  &$InstanceDeMaClasse->attribut;

//modification directe 
$variablelocale  =  "coucou c'est moi";


//affichage 
echo $InstanceDeMaClasse->attribut;

//affiche "coucou c'est moi"

Et si tu veux directement les utiliser comme ceci avec __set() , alors voici un exemple de passage par référence ..
class MaClasse{
	
	private $test = "indamix"; 
	
	public function __construct(){ }
	
	public function &__get($name){
		
		return $this->$name;
		
	}
	
}

$InstanceDeMaClasse = new MaClasse();

//exemple
$InstanceDeMaClasse->attribut  = "coucou";

$variablelocale  =  &$InstanceDeMaClasse->attribut;

//modification directe 
$variablelocale  =  "coucou c'est moi";


//affichage 
echo $InstanceDeMaClasse->attribut;

//affiche "coucou c'est moi" 



//en utilisant __get()

$var =& $InstanceDeMaClasse->test;

$var	=	"aaaa";


echo $InstanceDeMaClasse->test;

Petit nouveau ! | 4 Messages

11 févr. 2009, 13:16

Bonjour,

oui voila en gros le principe c'est un peu ca.

Sauf que le référence sur l'attribut j'aimerai pouvoir l'attribuer via une méthode de ma classe.
Et par la suite faire un suivi de cette variable.

Voila en gros ce que je voudrais faire:

class MaClasse
{
	public $monAttribut = "toto";
	...

	function watch(&$maVar)
	{
		$maVar = &$this->monAttribut;
	}
	
	function __set($nom,$val)
	{
		echo "$nom a été est passé à $val";
	}

}

$monInstance = new MaClasse();
$a = "";

$monInstance->watch($a);

$a = "tata";

// ca devrait m'afficher "monAttribut a été passé à tata"


j'ai essayé plusieurs méthode pour passé la référence de mon attribut.

ViPHP
ViPHP | 4674 Messages

11 févr. 2009, 13:42

Hey :),

Pourquoi ne pas utiliser un getter tout simplement ?
Si j'ai compris ton problème, tu veux faire :
class A {

    public $attribute = 'sumthin';
}

$a = new A();
$x = $a->attribute;
$y = &$a->attribute;
var_dump($x, $y);
// string(7) "sumthin"
// string(7) "sumthin"
$a->attribute = 'other';
var_dump($x, $y);
// string(7) "sumthin"
// string(5) "other"
Je pense que Stopher n'était pas loin, il a juste pris le problème à l'envers.

Si on part sur cette piste, on aura un soucis. Si on dit :
$y = 'hop';
var_dump($a->attribute);
// string(3) "hop"
Niveau sécurité, c'est moyen. On casse l'encapsulation (bon, c'était en public aussi …). On doit d'abord casser la référence avant de donner une nouvelle valeur. C'est un peu lourd …

Est-ce que tu veux faire un vrai listener ? Et aussi, pourquoi veux-tu faire ça ? Peut-être que tu te trompes de piste.

Édition : aussi, ton exemple est très sale … Je pense qu'il faut revoir la méthodologie.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 4 Messages

11 févr. 2009, 15:19

Effectivement Stopher n'était pas loin et meme assez proche de mon idée;

HyWaN,est que la définition de __get donnée par Stopher correspond t elle à ce que tu proposais de faire avec un getter ?

Mais sinon oui ca serait pour faire une sorte de listenner qui tracerait toutes les valeurs d'une variable donnée.

Et en fait je voudrais juste avoir à rattacher ce listenner à des variables choisies et ne plus rien avoir à faire apres.

Je pensais donc jouer avec __set pour faire cela.

Merci pour l'aide en tout cas

ViPHP
ViPHP | 4674 Messages

11 févr. 2009, 15:44

Oui mais pourquoi faire ça ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 4 Messages

11 févr. 2009, 16:01

Et bien on me demande parfois de debugguer des scripts (pas toujours bien structuré) et je voudrais éviter de mettre des echo ou des choses du style un peu partout dans le code pour tracer le déroulement de l'éxécution.

ViPHP
ViPHP | 4674 Messages

11 févr. 2009, 16:08

Oula :). Sache qu'il (doit) existe(r) des outils qui te mâche le travail pour ce genre de chose. Je te conseille de jeter un œil sur les debuggers :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).