Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/05/2008, 21h51   #1
Nouveau Membre du Club
 
Avatar de eexit
 
Étudiant
Inscription : juillet 2007
Messages : 61
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 61
Points : 35
Points : 35
Par défaut [POO] Transmission d'une instance au travers d'une autre instance

Bonsoir,

Désolé pour ce titre un peu barbare mais c'est pas évident d'expliquer ce que je voudrais faire dans un titre .

J'instancie une class qui elle-même instancie une autre class mais j'aimerais que la première instanciation soit l'objet de la seconde instanciation.

Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class Foo {
	public $bar;
 
	function getObj() {
		$this->bar = new Obj($param);
	}
}
 
class Obj {
	private $param;
 
	function __construct($param) {
		//traitement de $param en fonction du type
		return $this->buildObj();
	}
 
	function buildObj() {
		return new OtherObj($this->param);
	}
}
 
$foobar = new Foo;
var_dump($foobar->bar); // retourne un objet Obj alors j'aimerais avoir un objet OtherObj 
?>
On peut très bien en arriver là en assignant la méthode buildObj() à la variable $bar mais l'instanciation de Obj m'oblige à créer une variable bidon.

Alors je ne sais pas si c'est possible de transmettre un objet à travers l'instance d'un autre objet.

Merci bien.
eexit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 00h45   #2
Membre éprouvé
 
Homme
Inscription : août 2006
Messages : 313
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : août 2006
Messages : 313
Points : 497
Points : 497
Ouch, ça a l'air tordu . J'ai lu 4 fois ton code avant de comprendre ta demande.

En passant par de l'instanciation classique, ce n'est pas possible je pense. Un constructeur ne peut pas avoir de return (sinon ça a plus aucun sens ^^)

Pour faire cela, il faut passer par un pattern factory. Je te laisse regarder ça plus en detail sur le net
Phelim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 00h52   #3
Nouveau Membre du Club
 
Avatar de eexit
 
Étudiant
Inscription : juillet 2007
Messages : 61
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 61
Points : 35
Points : 35
Lol, merci pour ta réponse

Mais c'est justement dans un contexte de fabrique que j'ai besoin de ce code^^.
Moi aussi je ne pense pas que cela soit possible mais bon, sait-on jamais.

Merci.
eexit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 18h04   #4
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Souvent pour trouver la solution à un problème, il faut connaître le contexte de ce problème. Autrement dit, répondre à cette question : pourquoi veux-tu faire ce truc un peu tordu ?
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 18h32   #5
Nouveau Membre du Club
 
Avatar de eexit
 
Étudiant
Inscription : juillet 2007
Messages : 61
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 61
Points : 35
Points : 35
Bonjour,

Merci pour ta réponse. Malheureusement, je n'ai pas d'exemple spécifique à donner, je fais juste cela en temps que test.

Voici ce que j'aimerais éviter de faire mais je ne pense pas que cela soit possible:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class Foo {
	public $bar;
 
	function getObj() {
		$garbage = new Obj($param); // si on peut éviter de créer un objet garbage et transmettre directement l'objet "obj" ce serait bien
		$this->bar = $garbage->obj;
		// un truc du genre: $this->bar = new Obj($param)->obj; mais ça n'existe pas ^^
	}
}
 
class Obj {
	private $param;
	public $obj;
 
	function __construct($param) {
		//traitement de $param en fonction du type
		$this->buildObj();
	}
 
	function buildObj() {
		$this->obj = new OtherObj($this->param);
	}
}
 
$foobar = new Foo;
var_dump($foobar->bar); // retourne un objet OtherObj 
?>
Ou alors, je me demande si ça n'est pas possible avec un truc dans ce genre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class Foo {
	public $bar;
 
	function getObj() {
		$this->bar = Obj::buildObj($param);
	}
}
 
class Obj {
	private $param;
 
	function __construct($param) {
		//traitement de $param en fonction du type
	}
 
	static function buildObj($param) {
		self::__construct($param);
		return new OtherObj(self::$param);
	}
}
 
$foobar = new Foo;
var_dump($foobar->bar); // retourne un objet OtherObj 
?>
Je vais tester cela

Merci.
eexit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h38.


 
 
 
 
Partenaires

Hébergement Web