Utilisation d'une méthode avec pour parametre un objet [Résolu]

Signaler
Messages postés
5
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
27 février 2006
-
Messages postés
5
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
27 février 2006
-
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

Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
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+
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008

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
Messages postés
5
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
27 février 2006

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