PHP OBJET: Problème d'héritage

Petit nouveau ! | 4 Messages

02 avr. 2007, 19:07

Bonjour,
je souhaiterai faire une manip entre 2 classes d'objet, mais je ne sais aps si cela est faisable (je n'ai pas trouvé en tout cas...)

J'ai ces 2 classes :

class animal () {
var $nom;
var $type;
...
}

class chat extends animal () {
var $aime_le_lait;
...
}

Mon problème est que quand je veux créer un objet animal de type chat, au moment ou je l'ouvre, je ne sais pas encore qu'il s'agit d'un chat (j'ai egalement une classe chien...).
J'ai donc a ce jour 2 solutions:
- J'ai une fonction qui va chercher le type d'animal avant de créer l'objet de type Chat ou de type Chien en fonction de l'info obtenue lors de la creation de l'objet animal.
- J'arrive a créer un objet Animal qui s'auto implémente les fonctions propres aux Chats ou aux chiens en fonction du type (ou un truc du genre).

Quelqu'un a une solution a me proposer ??
Comment puis-je faire?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

02 avr. 2007, 22:31

Tu ne pourras pas transmuter un animal en chat, ni aggréger les méthodes à la classe (IIRC il y a une extension de PHP qui soi-disant fait ça mais je doute qu'elle fonctionne réellement). Comme tu l'as deviné, il va te falloir déterminer s'il s'agit d'un chat ou d'un chien avant d'instantier ta classe. Ensuite, quelle forme cela doit prendre dépend de ton application, difficile de dire comme ça. Il y a des chances pour que tu laisses la classe animal retourner le bon objet, par exemple.
$animal = new animal;
$animal->do_some_stuff();
$animal = $animal->get();
...où $animal->get() te renvoit un objet chat ou chien

Petit nouveau ! | 4 Messages

02 avr. 2007, 22:45

ok, et bien c parfait comme solution ca...
Merci

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

02 avr. 2007, 23:46

Attention, j'ai oublié de le préciser mais le nouvel objet ne partage rien avec l'ancien. Si tu avais changé des propriétés de la classe, tu dois appliquer les mêmes changement au nouvel objet. Sinon tu dois aussi pouvoir automatiser le processus, par exemple :
public function get()
{
	switch ($this->type)
	{
		case 'chat':
		case 'chien':
			$obj = new $this->type;
			break;

		default:
			die('...');
	}

	foreach (get_class_vars($this) as $k => $v)
	{
		$obj->$k = $v;
	}

	return $obj;
}
Attention aussi à ne pas créer de copie de l'objet au vol. Je ne me souviens plus exactement du fonctionnement de PHP 4, tu auras peut-être à assigner certains trucs par références (ou retourner l'objet par référence). À tester.

Edit: Whaaaa? j'aurais pû jurer que j'étais dans le forum PHP4... j'ai édité le code en conséquence