IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

PHP et l'aggrégation


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 110
    Points : 57
    Points
    57
    Par défaut PHP et l'aggrégation
    Bonjours a tous,

    Je souhaiterai savoir s'il est possible d'utiliser l'agrégation/composition comme en java ?!
    Je m'explique, l'idée serait que le constructeur d'un objet puisse recevoir un autre objet dans sa liste de ses argument ?!

    Dans l'attente de vous lire,
    Kazuzu

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    Dans son modèle Objet, PHP ressemble beaucoup à Java (si on oublie toutes les boulettes...)
    Une composition ou un héritage privé sont bien entendu faisables en PHP, considérons le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class A { protected $_message = "hello"; }
    class B { 
      protected $_a;
      public function __construct (A $a) { $this->_a = $a; } 
    }
     
    $a = new A;
    $b = new B($a);
     
    var_dump($b);
    Va produire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    object(B)#2 (1) {
      ["_a":protected]=>
      object(A)#1 (1) {
        ["_message":protected]=>
        string(5) "hello"
      }
    }
    Du fait du typage faible des variables en PHP, on peut passer n'importe quoi à une fonction / méthode. utiliser une signature comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public function __construct (A $a)
    force la variable $a à être un objet du type A.

    Je souhaite ajouter que les fonction magiques __get, __set et __call peuvent servir à implémenter un héritage privé, considérons le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class A
    {
    	public $_a1;
    	public $_a2;
    	public $_a3;
    }
     
    class B
    {
    	protected $_a;
     
    	public function __construct (A $a)
    	{
    		$this->_a = $a;
    	}
     
    	public function __get ($key)
    	{
    		return $this->_a->$key;
    	}
     
    	public function __set ($key, $value)
    	{
    		$this->_a->$key = $value;
    	}
    }
     
    $a = new A;
    $b = new B($a);
     
    $b->_a1 = "Hello";
    $b->_a3 = "Toto";
     
    echo "$b->_a1 $b->_a3";
    Va afficher: Hello Toto.
    De la mème manière, on peut utiliser __call pour appeller des méthodes de A depuis B.

    La doc sur les méthodes magiques :http://php.net/manual/fr/language.oop5.magic.php

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 110
    Points : 57
    Points
    57
    Par défaut
    merci de ta réponse il y a quelques petites choses que je nai pas très bien comprises mais que je prendrait le temps d analyser demain matin.

    J'aurai encore 1 question à posé :

    1.j ai instancier une matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     $menu = array();
    for($i=0;$i<nb;$i++)
    {
        $menu[$i] = array();
    }
    Et donc en c++ quand on alloue de la mémoire(ici c'est pas vraiment le meme) il faut le delete avec le desstructeur mais lorsque dans le destructeur php je met ce qu'il suit il me renvoi une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function __destruct()
    {
        delete[] $menu;
    }
    cela sert-il de detruire comme sa en php ?

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Houlà, je crois que tu t'es emmélé es pinceaux.

    En PHP, array n'est pas un constructeur d'objet, c'est un type natif - je sais, c'est assez débile de l'avoir fait avec cette signature mais c'est comme ça.
    En revanche il existe des objets tableaux qui ont le comportement d'un tableau par ailleur - exactement comme en C++ avec la surcharge de l'opétaeur [ ].
    En PHP il n'est pas vraiment possible de surcharger les opérateurs, mais PHP est capable de reconnaitre des classes ayant un comportement de type array par leur interface ArrayAccess, de même PHP est capable de traiter des objets comme des fonctions s'ils implémentent la méthode __invoke().

    Un petit exemple pratique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    // Un tableau: type natif
    $a = array(1,2,3);
     
    // Un objet Tableau
    $b = ArrayObject($a);
     
    $a[0] = 1; // fonctionne
    $b[0] = 1; // fonctionne également
     
    // Itérer un tableau natif
    foreach ($a as $key => $value) 
    // ou
    for ($i = 0; $i < count($a); $i ++)
     
    // Itérer un objet Tableau
    // se fait de la même manière
    // car ArrayObject implémente 
    // l'interface countable.
    Le seul réel intérêt des objets tableau est l'héritage public et les Iterateurs qu'on peut mettre dessus. Vu que le type natif gère parfaitement les tableaux à N dimentions et les couples clés/valeur, c'est essentiellement eux que tu utilisera.

    Jettes un oeil du coté de ArrayObject: http://php.net/manual/fr/class.arrayobject.php

    En PHP les destructeurs servent moins à libérer de la mémoire qu'a fermer proprement des ressources (fichiers, connexion etc.)
    On peut faire l'équivalent d'un Free simplement en utilisant la fonction unset($var);
    Sache également que PHP 5.3 intègre un garbage collector, à la mode Java, c'est à dire qu'on sait jamais quand il passe ni qu'est ce qu'il fait

    En PHP il est rarissime de tomber dans une erreur d'allocation mémoire - une taille mémoire max est définie dans le fichier de conf de php. De toute façon, une fois qu'une requête à été traitée et son retour servi en intégralité, PHP tombe et tous tes objets / ressources font de même.
    Pour la petite histoire, je travaille actuellement sur un mécanisme de cache capable de palier à cette insuffisance du langage, ça existe dans les framework les plus connus.

    Une note annexe sur ArrayObject, les gens de chez Zend nous ont gratifié d'une librairie d'objets standards, un petit peu comme la STL mais sans les templates, appelée SPL pour Standard PHP Library. Cette librairie comprends des exceptions, de nouvelles interfaces ainsi que les Iterateur qui jusqu'ici manquaient au langage. Selon moi, ce sont des briques incontournables pour construire une bonne application PHP.

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. L'avenir est-il au PHP ?
    Par Manolo dans le forum Langage
    Réponses: 468
    Dernier message: 11/02/2008, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo