OVH Cloud OVH Cloud

probleme de Class

10 réponses
Avatar
Free
Bonsoir,

Un petit soucis de class :

j'ai une class truc dans truc.php et une classe machin dans machin.php
je crée les instances de classe dans un fichier bidule.php ($truc = new
truc(); machin = new machin();)
Je souhaiterai executer un function de la class truc dans une function de la
class machin (pourquoi faire simple quand On peut faire compliquer !!!)
Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc ?
Dois je passer l'instance truc à la function machin ?

Merci !

10 réponses

Avatar
yvon.thoravalNO-SPAM
Free wrote:

Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc ?
Dois je passer l'instance truc à la function machin ?


Non, non, d'après ce que j'ai compris, :: c'est autre chose, ça permet
d'utiliser une méthode sans instancier la classe, à cond que tout est ok
q paramètres.

par contre ton pb truc bidule c'est simple, supposons que tu veuilles
utilser dans une fonction machin() de la class truc une fonction chose
de la classe bidule tu fais :

class truc() {
...
function truc() {
...
}
function machin() {
...
require_once("path/to/bidule.class.php");
$this->bidule_en_Ut = new bidule();
$volapuk = $this->bidule_en_Ut->chose();
...
}
...
}
--
yt

Avatar
Bruno Desthuilliers
Free wrote:
Bonsoir,

Un petit soucis de class :

j'ai une class truc dans truc.php et une classe machin dans machin.php
je crée les instances de classe dans un fichier bidule.php ($truc = new
truc(); machin = new machin();)


Ok.

Je souhaiterai executer un function de la class truc dans une function de la
class machin


En OO, on dit 'appeler une méthode d'un objet truc'

(pourquoi faire simple quand On peut faire compliquer !!!)


Qu'y a t'il de compliqué là-dedans ?

Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc ?


Ca c'est pour appeller une méthode de classe, pas une méthode d'instance.

Dois je passer l'instance truc à la function machin ?


Si tu veux appeler une méthode d'un objet, il semble difficilement
contournable d'avoir cet objet sous la main !-)

Après, il y a plusieurs cas de figure possible. En simplifiant, ça
donne: l'objet machin a comme attribut un (ou plusieurs) objets truc
(composition/aggrégation), ou non (association).

Dans le second cas, il faut effectivement passer un objet truc en
paramètre à la méthode concernée de l'objet machin.

Merci !


De rien.

Avatar
Harry Cover
On 29 Jan 2004 22:24:13 GMT, "Free" wrote:

Bonsoir,

Un petit soucis de class :

j'ai une class truc dans truc.php et une classe machin dans machin.php
je crée les instances de classe dans un fichier bidule.php ($truc = new
truc(); machin = new machin();)
Je souhaiterai executer un function de la class truc dans une function de la
class machin (pourquoi faire simple quand On peut faire compliquer !!!)
Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc ?
Dois je passer l'instance truc à la function machin ?
Il ne me semble pas.


Par contre ce serait plus propre de faire de l'héritage de classes
pour monter tes deux classes, la classe parent ne comportant que la
méthode en question.
Mais bon, comme t'as dit, c'est plus marrant quand c'est compliqué :)

Avatar
Etienne SOBOLE
"Bruno Desthuilliers" a écrit dans
le message de news: 401a3027$0$19296$

Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc
?


Ca c'est pour appeller une méthode de classe, pas une méthode d'instance.


oui mais la question est tout de meme interessante !
surtout que c'est ce que 'Free' ?! cherche a faire.

donc j'ai essayé !!!
et ca marche !!! (mais evidement les variables de la session ne sont pas
initialisée...

voila le souce

<?
class c1
{
function c1()
{
$this->prout = 2;
}

function test()
{
echo 'xx' . $this->prout;
}
}

class c2
{
function c2()
{
}

function go()
{
c1::test();
}
}

$o = new c2;
$o->go();
?>


Avatar
Bruno Desthuilliers
Harry Cover wrote:
On 29 Jan 2004 22:24:13 GMT, "Free" wrote:


Bonsoir,

Un petit soucis de class :

j'ai une class truc dans truc.php et une classe machin dans machin.php
je crée les instances de classe dans un fichier bidule.php ($truc = new
truc(); machin = new machin();)
Je souhaiterai executer un function de la class truc dans une function de la
class machin (pourquoi faire simple quand On peut faire compliquer !!!)
Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc ?
Dois je passer l'instance truc à la function machin ?


Il ne me semble pas.


Moi si.

Par contre ce serait plus propre de faire de l'héritage de classes
pour monter tes deux classes,


Ah bon ? Et pourquoi donc ? Je veux bien que tu essaie de défendre ce
point de vue, histoire de rire...

Imaginons par exemple une classe 'Printer', qui possède une méthode
'print($printable)', laquelle doit être capable d'afficher n'importe
quel objet supportant la méthode 'toString'. L'appel sera du genre :

$printer = new Printer($someParam);
(...)
// Toto et Tata supportent la méthode toString()
$toto = new Toto($something, $somethingElse);
$tata = new Tata();

// appelle la méthode toString() de $toto
$printer->print($toto);
// appelle la méthode toString() de $tata
$printer->print($tata);

Maintenant, explique moi en quoi il serait plus propre que les classes
Toto et Tata héritent de la classe Printer ?

la classe parent ne comportant que la
méthode en question.


Tu viens de découvrir l'héritage ?

L'héritage implique *avant tout* une relation de type 'est un', ce qui
est loin d'être la relation la plus employée en OO. L'association simple
(relation de type 'utilise') est de loin le cas le plus fréquent.

Rappel : le principe de base de l'OO est : 'des objets (définis par une
identité, un état et un comportement' *s'envoyant des messages*
(lesquels sont traduits en appels de méthode). Du point de vue de
l'implémentation, l'héritage n'est qu'un épiphénomène, dont on peut
d'ailleurs aisément se passer dans le cas d'un langage à typage
dynamique comme PHP.

Bruno


Avatar
loufoque
Message d'origine de Bruno Desthuilliers :

$printer = new Printer($someParam);
(...)
// Toto et Tata supportent la méthode toString()
$toto = new Toto($something, $somethingElse);
$tata = new Tata();

// appelle la méthode toString() de $toto
$printer->print($toto);
// appelle la méthode toString() de $tata
$printer->print($tata);

En PHP4 il faudrait rajouter des & partout.


Avatar
Bruno Desthuilliers
loufoque wrote:
Message d'origine de Bruno Desthuilliers :


$printer = new Printer($someParam);
(...)
// Toto et Tata supportent la méthode toString()
$toto = new Toto($something, $somethingElse);
$tata = new Tata();

// appelle la méthode toString() de $toto
$printer->print($toto);
// appelle la méthode toString() de $tata
$printer->print($tata);

En PHP4 il faudrait rajouter des & partout.



"il faudrait" ? Et pourquoi donc, "il faudrait" ?-)

Ca dépend si tu veux passer par référence ou par valeur. Les deux
possibilités sont valides et ont leur raison d'être.

En ce qui concerne les instanciations, je te renvoie au FM :
http://www.php.net/manual/en/language.oop.newref.php

En ce qui concerne les arguments des appels de méthodes, le passage par
valeur peut être utilisé comme 'garde-fou' contre une modif de l'objet
original. Bon, ok, c'est un cas un peu extrême...

Mais bon, je réagissais juste au côté dogmatique et un poil absolu de
ton affirmation. Il est vrai que dans ce contexte, il *peut* être
préférable de passer par référence.

En PHP5, le débat est de toutes façon obsolète...

Mes deux centimes,
Bruno


Avatar
Hugues Peeters
j'ai une class truc dans truc.php et une classe machin dans machin.php
je crée les instances de classe dans un fichier bidule.php ($truc = new
truc(); machin = new machin();)
Je souhaiterai executer un function de la class truc dans une function de la
class machin (pourquoi faire simple quand On peut faire compliquer !!!)
Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc ?
Dois je passer l'instance truc à la function machin ?


Non, vous pouvez appelez directement la fonction de truc avec la
notation truc::la_fonction_de_truc().

Toutefois vous pouvez rencontrez des problèmes si la
fonction_de_truc()fait appel à des variable d'instances
(c'est à dire des variables qui ont été initialisées par
l'instation de la classe dans un objet particulier, comme
par exemple $le_truc = new truc() ).

En bref, la_fonction_truc() ne peut contenir aucune instruction
faite du mot clé $this.

Cordialement,

Hugues Peeters
---

http://www.claroline.net

Avatar
Hastur
"Free" a écrit dans le message de
news:401965f7$0$29066$
Bonsoir,

Un petit soucis de class :

j'ai une class truc dans truc.php et une classe machin dans machin.php
je crée les instances de classe dans un fichier bidule.php ($truc = new
truc(); machin = new machin();)
Je souhaiterai executer un function de la class truc dans une function de
la

class machin (pourquoi faire simple quand On peut faire compliquer !!!)
Il me semblait que la syntaxe était du genre truc :: la_funtion_de_truc ?
Dois je passer l'instance truc à la function machin ?

Merci !


Re à tous (Hastur ex Free !!! Errare Humanum Est )

Et bien je ne pensait pas que ma petite question ferait autant de polémiques
!!
Il n'empeche que j'ai encore des problemes et ca fait une semaine que
j'epluche toutes les docs et que je fait des tas d'essais; je craque !

J'ai modifié mon code pour (les 2 classes sont sur des scripts différents) :

class A {
function aaa() {
......
}
}

class B extends A {
function bbbb() {
// Les 2 essais ci dessous ne retourne rien ! nada !
$essai = A::aaa();
$essai1 = parent::aaa();
}
}

Pourquoi $essai et $essai ne retourne rien ? même en envoyant volontairement
de mauvaise info volontairement
Allez je repart vers l'inconnu .....
Merci !

Avatar
john gallet
Bonjour,

(je repêche cet article d'il y a 15 jours mais j'avais oublié)
NB : xpost et fu2 fr.comp.objet où ce sera plus approprié.

L'héritage implique *avant tout* une relation de type 'est un', ce qui
est loin d'être la relation la plus employée en OO. L'association simple
(relation de type 'utilise') est de loin le cas le plus fréquent.


Justement ça me laisse perplexe sur l'évolution de la présentation de la
POO.

Rappel : le principe de base de l'OO est : 'des objets (définis par une
identité, un état et un comportement' *s'envoyant des messages*
(lesquels sont traduits en appels de méthode). Du point de vue de
l'implémentation, l'héritage n'est qu'un épiphénomène, dont on peut
d'ailleurs aisément se passer dans le cas d'un langage à typage
dynamique comme PHP.


Je comprends bien la remarque sur le typage dynamique au moment de
l'implémentation en PHP. En revanche, si on considère une modélisation
indépendante du langage, (ou à défaut de totalement indépendante, on va
dire, sur un langage moins permissif que php, et ce ne sera pas dur à
trouver !) j'ai du mal à suivre un point précis. Moi, "de mon temps", on
m'avait dit que quand on avait pas un arbre d'héritage à 3 niveaux, on
ne faisait pas l'objet, on ne faissait qu'en utiliser la syntaxe. On
faisaitn toto.print() au lieu de print(toto). C'était la doctrine de
l'époque dans les milieux autorisés. Je veux dire par là que ce n'était
pas la présentation d'un seul prof dans son coin.

A noter que c'était en 1996 et sur un cours de POO dont la mise en
pratique serait ensuite faite sur du C++. D'ailleurs de toutes façons, à
ce moment là, java était encore totalement buggué (<troll>qui a dit
"c'est toujours le cas ?"</troll>). Alors où est la vérité (oui,
ailleurs, je sais ;-)...) ? Est-ce une question d'effet de mode qui fait
que maintenant on définit des classes partout sans jamais dériver ou
est-ce lié aux contraintes du c++, ou de "nouvelles" "méthodes de
développement" ?

NB : sur le fond, je n'ai pas l'intention de troller, je cherche juste à
comprendre les tendances actuelles par rapport aux tendances d'il y a
8-10 ans, avantages/inconvénients.

a++
JG