Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment acceder aux fonctions d'un ch amp de classe retourne par une fonction ?

9 réponses
Avatar
Aurelien Barbier-Accary
Bonjour,

je viens du C++ et l'utilisation des classes en Php4 me laisse perplexe.
Je précise tout de suite que je ne peux pas utiliser du Php5 qui apparemment est
la première version véritablement objet de Php.

Conscient que le sujet de ce post est un peu vaseux et afin de bien expliquer
mon problème, voici un exemple minimum :

<?php

class cA
{
function truc($msg)
{
echo "<p>$msg</p>\n";
}
}

class CB
{
var $mon_cA;

function cB(&$mcA)
{
$this->mon_cA = $mcA;
}

function copiecA()
{
return $this->mon_cA;
}

function &refcA()
{
return $this->mon_cA;
}
}

$uncA =& new cA;
$obj =& new cB($uncA);

$uncA->truc("accès direct"); // ok
$obj->mon_cA->truc("accès indirect + direct"); // ok
$obj->copiecA().truc("accès indirect + indirect(copie)"); // plantage
$obj->refcA().truc("accès indirect + indirect(référence)"); // plantage

?>

Dans les deux derniers cas le plantage renvoie :
Fatal error: Call to undefined function: truc() in debug.php on line 36

Remarque, si on utilise une "->" plutôt qu'un ".", l'erreur est alors :
Parse error: parse error in debug.php on line 36

Finalement, comment doit-on procéder pour avoir un accès aux champs d'une classe
par des fonctions ? J'ai l'impression que le "type de l'objet retourné est
inconnu", ceci étant une interprétation à la C++ :-)
Mon but est de faire quelque chose s'approchant le plus possible de ce qui sera
fait lorsque je pourrais utiliser du Php5, et donc de ne pas utiliser si
possible la deuxième écriture.

Merci d'avance pour vos remarques et conseils.

Aurélien.

9 réponses

Avatar
bruno at modulix
Aurelien Barbier-Accary wrote:
Bonjour,

je viens du C++ et l'utilisation des classes en Php4 me laisse perplexe.


C'est normal. Honnêtement, en php4, les classes relèvent plus du gadget
que de l'OO (même si elles rendent bien service vu d'autres limitations
du langage).

Je précise tout de suite que je ne peux pas utiliser du Php5 qui
apparemment est la première version véritablement objet de Php.


"véritablement" ? pouf pouf pouf...
<troll mode="je vais encore me faire des copains">
un langage qui manipule autre chose que des objet n'est pas un langage
"véritablement" objet - ce qui exclue C++ et Java des langages
"véritablement" objets, alors ne parlons pas de php... !-)
</troll>

Conscient que le sujet de ce post est un peu vaseux


Non, c'est très clair: tu a une méthode qui retourne un objet (que ce
soit par copie ou par référence) et tu veut chainer les appels de
méthodes, ie : $unObj->methodeQuiRetourneUnAutreObj()->attributDeAutreObj;

La réponse est simple:
*ce n'est pas possible*.

(snip)
$obj->copiecA().truc("accès indirect + indirect(copie)"); // plantage
$obj->refcA().truc("accès indirect + indirect(référence)"); // plantage


La notation pointée n'existe pas en php (ou plus exactement, le point
est l'opérateur de concaténation de chaines).

Dans les deux derniers cas le plantage renvoie :
Fatal error: Call to undefined function: truc() in debug.php on line 36


Oui, avec le point, php essaie de:
- évaluer $obj->refcA(),
- évaluer truc() (comme étant une fonction, pas une méthode de A),
- et concaténer les deux

Remarque, si on utilise une "->" plutôt qu'un ".", l'erreur est alors :
Parse error: parse error in debug.php on line 36


Oui, cf ci-avant: ce n'est pas une syntaxe valide en php4.

Finalement, comment doit-on procéder pour avoir un accès aux champs
d'une classe par des fonctions ?


En l'occurrence, il faut passer par une variable intermédiaire :(


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
dmetzler
Bon sinon, ça marche en PHP5.... mais tu ne peux pas avoir PHP5 donc
ça va pas t'aider ;)
Avatar
Aurelien Barbier-Accary
Aurelien Barbier-Accary wrote:
Conscient que le sujet de ce post est un peu vaseux


Non, c'est très clair: tu a une méthode qui retourne un objet (que ce
soit par copie ou par référence) et tu veut chainer les appels de
méthodes, ie : $unObj->methodeQuiRetourneUnAutreObj()->attributDeAutreObj;

La réponse est simple:
*ce n'est pas possible*.


Finalement, comment doit-on procéder pour avoir un accès aux champs
d'une classe par des fonctions ?


En l'occurrence, il faut passer par une variable intermédiaire :(




Mouais, pas au point ce langage, il n'y a que pour les tableaux qu'il est bien
pratique. Enfin ça dépanne et je verrai ce qu'il en est avec Php5 quand j'y
aurai accès.
En tous cas merci beaucoup pour l'info.

Du coup pour ton troll je te soutiens :-) même si moi je considère le C++ comme
un LOO :-)


Avatar
Stan
"bruno at modulix" a écrit dans le message de
news:43688542$0$4345$
| > Je précise tout de suite que je ne peux pas utiliser du Php5 qui
| > apparemment est la première version véritablement objet de Php.
|
| "véritablement" ? pouf pouf pouf...
| <troll mode="je vais encore me faire des copains">
| un langage qui manipule autre chose que des objet n'est pas un langage
| "véritablement" objet - ce qui exclue C++ et Java des langages
| "véritablement" objets, alors ne parlons pas de php... !-)
| </troll>
|

Il y a des nuances dans la définition de langage de programmation objet.
Par ex, on dit plus de C++ qu'il est orienté objet ( la subtilité est
parlante ).
Même si le langage ne manipule pas tout en objet, ce n'est pas forcément
rédibitoire.

--
-Stan
Avatar
bruno at modulix
Stan wrote:
(snip)
Il y a des nuances dans la définition de langage de programmation objet.


Non ? Pas vrai ?-)

A vrai dire, personne n'a même jamais été foutu de se mettre d'accord
sur la défintion de "objet".

Par ex, on dit plus de C++ qu'il est orienté objet ( la subtilité est
parlante ).


<troll>
SMMEB, la bonne définition est "assembleur orienté objet"... Là aussi,
la subtilité est parlante !-)
</troll>

Même si le langage ne manipule pas tout en objet, ce n'est pas forcément
rédibitoire.


Non - sauf pour faire de la programmation objet.

Quand je parles de tout-objet, je pense vraiment *tout* (fonctions et
classes inclues [1]...).

Paradoxalement, ça n'implique pas forcément de devoir tout mettre dans
des classes...

[1] Smalltalk va même plus loin puisque même les structures de contrôle
traditionnelles (boucles et branchements) sont construites sur des
envois de messages paramétrés par des blocs de code...

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
bruno at modulix
Aurelien Barbier-Accary wrote:

Aurelien Barbier-Accary wrote:

(snip)


Finalement, comment doit-on procéder pour avoir un accès aux champs
d'une classe par des fonctions ?


En l'occurrence, il faut passer par une variable intermédiaire :(

Mouais, pas au point ce langage,



Ca dépend pour quoi... Quand on se souvient de ce pour quoi PHP a été
conçu à l'origine, il le fait plutôt bien.

En fait, la recette pour une bonne appli en php, c'est :
1/ faire simple,
2/ faire simple,
3/ (pour les experts seulements) faire encore plus simple.

Bref, n'essaye pas de porter tes idiomes C++ en PHP, ce sera au mieux
inefficace.

il n'y a que pour les tableaux qu'il
est bien pratique.


Mouais, et encore... Mais bon, c'est clair que c'est *la* structure de
donnée essentielle en PHP.

Enfin ça dépanne


Pour certaines choses, c'est certainement plus pratique que du C++ !-)

et je verrai ce qu'il en est avec
Php5 quand j'y aurai accès.
En tous cas merci beaucoup pour l'info.

Du coup pour ton troll je te soutiens :-)


merci, bien aimable !-)

même si moi je considère le
C++ comme un LOO :-)


T'a oublié les balises <troll>, là, non ?-)

<hs>
Jamais joué avec Python ou Ruby ?
</hs>

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



Avatar
John GALLET
En fait, la recette pour une bonne appli en php, c'est :
1/ faire simple,
2/ faire simple,
3/ (pour les experts seulements) faire encore plus simple.

Bref, n'essaye pas de porter tes idiomes C++ en PHP, ce sera au mieux
inefficace.


"Dans mes bras" (tm).

Je n'ai à ajouter qu'une précision : la même recette s'applique aussi
très bien dans d'autres langages, le but de l'exercice est de faire au
plus simple sans être simpliste.

a++;
JG

Avatar
Aurelien Barbier-Accary
Bon sinon, ça marche en PHP5.... mais tu ne peux pas avoir PHP5 donc
ça va pas t'aider ;)


et est-ce que je peux tester la version de php et faire des implémentations
différentes en fonction ? Si oui comment ? :-)

Ok ce n'est pas super utile puisqu'en théorie ça ne tourne que sur un serveur
qui ne dispose que d'une version de php mais comme mon but est de faire quelque
chose de portable...

Merci.

Avatar
Aurelien Barbier-Accary
Aurelien Barbier-Accary wrote:

même si moi je considère le
C++ comme un LOO :-)



T'a oublié les balises <troll>, là, non ?-)

<hs>
Jamais joué avec Python ou Ruby ?
</hs>



Python un peu, mais pas assez.