Utilisation d'une méthode avec pour parametre un objet

Résolu
aguiran Messages postés 5 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 27 février 2006 - 27 févr. 2006 à 11:12
aguiran Messages postés 5 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 27 février 2006 - 27 févr. 2006 à 11:37
Salut,

Mon pb ressemble un peu à celui posé par Mandark le 11/02, mais je ne
souhaite pour ma part, pas ré-instancier un objet dans dans une autre
classe, mais à l'extérieur.



Essayons d'être clair (ça va être dur :o)) :



je souhaiterais passer un objet O (insctancié avec la classe C1) en
paramètre d'une méthode d'une classe C2 et ainsi utiliser les méthodes
et attributs de l'objet O dans cette classe C2.



Je voudrais eviter l'erreur : Call to a member function on a non-object

(Info : j'ai déjà tenté le passage par référence mais ça ne marche pas,
enfin si peut-être, mais il faut alors braver les interdits de la
déprécation, et ça j'évite )



En fait je voudrais savoir s'il est possible d'utiliser directement
l'objet sans passer obligatoirement par une
sérialisation/désérialisation qui entrainera forcément la déclaration
d'un nouvel objet. De toute façon cette méthode ne pourrait pas marcher
car souhaite que les modifs apportées dans la méthode de la classe C2
soit effectives en sortie sur l'objet O, et non sur une copie.



voilà la structure :

Partie 1

class Classe1{

Var id;

function Class1($idRef){

$this->id= $idRef;

}

}

Partie 2

class Classe2{

function Class2(){};

function agir($objetDeTypeClasse1

{

echo $objetDeTypeClasse1->id;

}

}



Partie 3

$Objet1 = new Class1(1);

$Objet2 = new Class2();

$Objet2->agir(Objet1);



Voilà, voilà,

Merci d'avance pour votre aide :o)

3 réponses

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
27 févr. 2006 à 11:25
salut...

Objectif atteint !!! Tu as été assez clair.
Je vais essayé de l'être tout autant...

Il y'a donc 2 problèmes ici :
1. S'assurer que le parametre passée à Classe2::agir() est bien une instance de Classe1
if( !is_object($objetDeTypeClasse1) ) return;
if( get_class($objetDeTypeClasse1) != 'classe1' ) return;
/* ici tu es sûr que $objetDeTypeClasse1 est une instance de Classe1 */

2. Que les modifications apportées dans Classe2::agir() sur le paramêtre $objetDeTypeClasse1 reste...
Deux solutions :
* Passage par référence ! (C'est fait pour...)
* Mais si tu es faché avec les références : retourner la copie de l'objet une fois les modifications fait

if( !is_object($objetDeTypeClasse1) ) return $objetDeTypeClasse1;
if( get_class($objetDeTypeClasse1) != 'classe1' ) return;
/* ici tu es sûr que $objetDeTypeClasse1 est une instance de Classe1 */
/* AGIR sur $objetDeTypeClasse1 */
return $objetDeTypeClasse1;

Et donc :
$Objet1 = new Classe1(1);
$Objet1 = Classe2::agir($Objet1);



Voili... A+
3
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 1
27 févr. 2006 à 11:32
Bonjour,



Je ne vois pas où est ton problème.

J'ai exécuté le code suivant et ça fonctionne très bien. ça m'affiche 1 :



<?php



class Classe1{



var $id;



function Classe1($idRef)

{

$this->id=$idRef;

}

}



class Classe2{



function Classe2(){}

function agir($objetDeTypeClasse1)

{

echo $objetDeTypeClasse1->id;

}

}



$Objet1 = new Classe1(1);

$Objet2 = new Classe2();

$Objet2->agir($Objet1);



?>



Pour info j'utilise PHP 4 et j'ai testé en local avec EasyPhp
0
aguiran Messages postés 5 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 27 février 2006
27 févr. 2006 à 11:37
merci J_G, tu as bien cerné le pb et tu as été 100%, ta méthode passe nickel :o)



Et pour répondre à darkduck, c'est parceque je bosse sur un serveur
bien blindé, sans doute configuré par un maniaco-psycopathe fana du INI
made by hand from scratch, et y'a beaucoup de choses que je ne peux pas
modifier. Et je ne sais pas exactement ce qui me bloque dans la config
du serveur.



Enfin voilà,

pb résolu.

Kiss All
0
Rejoignez-nous