poo - passage de paramètres

Rechercher

poo - passage de paramètres

Par jacfev  -  8 reponses  -  Le 25/06/2014 10:44  -  Editer  - 

Bonjour,

Pourriez-vous m'expliquer les étapes de la méthode virer dans ce morceau de code :

    <?php  
    //PHP5 avancé  
    class Compte {  
        public $montant;  
        function virer ($valeur, $destination) {  
            $this->montant -= $valeur;  
            $destination->montant += $valeur;  
        }  
    }  
    $eric   = new Compte();  
    $eric->montant = 100;  
    $cyril  = new Compte();  
    $cyril->montant = 100;  
    $eric->virer (50, $cyril);  
    echo $cyril->montant;  
    ?>
 

Réponses apportées à cette discussion

Par Cyrano  -  Le 25/06/2014 13:39  -  Haut de page  - 

Salut jacfev,
quelle partie ne comprends-tu pas ?

Schématiquement, on crée deux objets correspondant aux deux comptes qui vont faire l'objet d'une sorte de transfert d'information, l'objet $eric et l'objet $cyril.

Un objet comporte un certain nombre de propriétés et de méthodes qui lui sont propres. Même s'ils sont des instances de la même classe Compte, les informations qu'ils contiennent leur sont propres.

Lorsqu'on fait $eric->virer (50, $cyril);, on appelle la méthode virer() de l'objet $eric avec en paramètre le montant à virer et l'objet (le compte) sur lequel on veut effectuer le virement, donc ici $cyril.
Dans la méthode virer, on effectue deux opérations :

  • On retire la même valeur de la propriété $montant de l'objet $eric, donc on fait « $this->montant -= $valeur; »
  • On ajoute la valeur à la propriété $montant le de l'objet lui-même, donc ici l'objet $cyril, donc : « $destination->montant += $valeur; »;

En gros, il faut comprendre que, dans la méthode virer(), la variable « $destination » est un objet Compte, assorti donc des mêmes propriétés et méthodes que tous les objets Compte.

Voilà, est-ce que c'est plus clair comme ceci ?

 
Par jacfev  -  Le 25/06/2014 16:06  -  Haut de page  - 

Merci Cyrano d'avoir pris la peine de détailler. Cela m'est bien utile.

Ce qui reste encore un peu flou pour moi c'est le fait que $destination soit un objet (pas de new pour lui).
Dois-je comprendre que c'est la transmission en paramètre $cyril vers $destination qui fait que $destination devienne un objet?

 
Par Cyrano  -  Le 25/06/2014 16:13  -  Haut de page  - 

Non, regarde bien le code et tâche de le suivre dans son exécution chronologique : le new est utilisé avant l'appel de la méthode virer(), donc l'objet $cyril est un objet Compte, ce qui fait que la méthode virer reçoit en paramètre un objet Compte à part entière, indépendant de l'objet $eric qui est lui-même un objet Compte mais qui pourrait tout aussi bien être autre chose.

$eric et $cyril sont deux objet Compte parfaitement distincts l'un de l'autre, même si ce sont deux instances de la même classe.

 
Par footsteps  -  Le 31/08/2014 17:15  -  Haut de page  - 

C'est la grosse lacune du php,la faiblesse du typage (et aussi ici pas de retour dans la fonction). Tout ceci induit en erreur facilement.

 
Par Cyrano  -  Le 31/08/2014 18:31  -  Haut de page  - 

La faiblesse du typage ne doit pas pour autant être considéré comme une faiblesse du langage, ce que ta réponse pourrait malheureusement laisser entendre. C'est même un élément rendant le langage beaucoup plus souple. Et en même temps, ça facilite l'apprentissage en permettant certaines libertés que d'autres langages beaucoup plus restrictifs interdisent purement et simplement.
Mais j'aurais de ce fait tendance à dire qu'il est important que le développeur soit discipliné, ce n'est pas au langage de l'être à sa place.

Par ailleurs, tu mentionnes l'absence de retour dans la fonction : quel retour voudrais-tu qu'il y ait ? On pourrait retourner un booléen qui indiquerait si l'opération s'est bien déroulée, mais rien d'autre.
À la rigueur, la fonction aurait pu être écrite comme ceci :

<?php
class Compte
{
    public $montant;
    function virer ($valeur, Compte $destination)
    {
        $this->montant        -= $valeur;
        $destination->montant += $valeur;
    }
}

Ce faisant, on force le type de paramètre pour le second qui doit alors impérativement être de type « Compte », donc une instance de la classe du même nom.

 
Par footsteps  -  Le 01/09/2014 05:21  -  Haut de page  - 

Retour=Void écrit explicitement,en php c'est autorisé de ne pas le mettre.
Je conseillerai aux débutants d'attaquer par le c ,ou le java se et tu seras d'accord avec moi,on relativise beaucoup mieux sur ces langages interprétés.Mais ce n'était pas une critique.

 
Par Cyrano  -  Le 01/09/2014 07:14  -  Haut de page  - 

Le C serait à mon sens plus judicieux dans l'objectif de faire du PHP. Ceci étant, ce ne serait valable que dans le cadre d'un programme de formation scolaire ou assimilé, ce serait autrement moins évident pour un apprentis autodidacte qui part de rien ou juste de tutos en ligne voire de quelques livres, et je parle là en parfaite connaissance de cause étant moi-même complètement autodidacte.

Mais là où personnellement je relativise, c'est tout de même sur le fait que chaque langage est approprié pour une tâche et l'est moins pour une autre. Le PHP, c'est pour faire du web, le Java pour du client lourd et le C pour autre chose que du web, et même si on pourrait faire du web avec Java et si le C peut également y être employé pour des usages spécifiques, ça reste à des niveaux hors de portée d'un débutant complet. Par ailleurs, le Java, outre son niveau de typage, est un langage full objet et ça, c'est toujours assez ardu à aborder, ce sont des concepts très abstraits au début et c'est plutôt rebutant face à la facilité du procédural que permet le PHP.

 
Par footsteps  -  Le 02/09/2014 04:31  -  Haut de page  - 

D'accord avec toi,du c déboule le reste et surtout en php.
En parlant du paradigme objet,un c iste sera tout autant si ce n'est plus désorienté qu'un programmeur web.Je sais de quoi je parle!
Tiens,on trouve en fr quelques tutos sur yout:eh bien j'en ai vu un pas mal codé dans la forme etc mais en prenant du recul,c'est du n'importe quoi.Je résume et tu comprendras:la bdd est une vue , le traitement est une bdd.(tu vois les héritages....).Suffit de parler à voix haute,la conception est branlante.Ce passage au très haut niveau est formidable pour le raisonnement(adieu l'abstraction)mais malheureusement pas suivi d'effet:code lourd,incompréhensible,jargon intellect ,j'en passe et des meilleurs.Epatons la galerie..Bon,j'ai lu tes remarques sur la poo,tu en sais 10 fois plus.Merci pour tes conseils.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |