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 :

Multi Héritage en php.


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de demenvil
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Avril 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste développeur
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 195
    Points : 389
    Points
    389
    Par défaut Multi Héritage en php.
    Bonjour!
    Je suis confronté comme cela à du arrivé à d'autres que moi Le multi héritage en php !
    Comment le simuler puisque que nativement apparemment cela n'est pas possible en php.

    Alors en faisant des recherche je suis tombé sur ce lien :
    http://jf-lepine.developpez.com/tuto...tiple-php/#LII

    J'ai effectivement besoin d'un multi héritage ou dans le cadre d'un développement j'ai une class Main.Class.php
    Qui dois hérité de base d'une class model et d'une class view pour chargé les vue que je souhaite.

    Mais elle peut aussi avoir besoin d'une class form, session, check etc...
    Je voudrai ne pas devoir redéclarer des objet pour les utilisé donc faire un héritage.

    Maintenant mon problème :

    Je me suis basé sur la première méthode donnée donc avec le code qui va avec

    Mais de mon coté quand je j'exécute le code je me retrouve avec une erreur :

    Fatal error: Class 'Parent2' not found in
    Donc ma class n'est pas chargé.
    Pour essayer autre chose avant ma class du coup j'ai fait un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    include('Parent1.php');
    include('Parent2.php');
    include('Parent3.php');
    Ce qui me donne un autre résultat :

    Cette fonction est héritée de la classe parent2
    Notice: Undefined variable: funcName in C:\Program Files (x86)\EasyPHP-12.1\www\multi\Child.php on line 43

    Notice: Undefined variable: funcName in C:\Program Files (x86)\EasyPHP-12.1\www\multi\Child.php on line 43

    Fatal error: Uncaught exception 'Exception' with message 'The attribute2 attribute doesn't exist' in C:\Program Files (x86)\EasyPHP-12.1\www\multi\Child.php:45 Stack trace: #0 C:\Program Files (x86)\EasyPHP-12.1\www\multi\Child.php(56): Child->__get('attribute2') #1 {main} thrown in C:\Program Files (x86)\EasyPHP-12.1\www\multi\Child.php on line 45
    Donc ont peut voir que ma classe Parent2 est chargée !

    Mais après cela ne colle plus je ne comprend du coup pas trop le problème..

    Si vous avez une solution ?
    Merci : )

    Voici le code Complet de la classe Récupérer via le tuto :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
    include('Parent1.php'); //Mon ajout
    include('Parent2.php'); //Mon ajout
    include('Parent3.php'); //Mon ajout
    class Child extends Parent1 {
        private $_tExtends          = array('Parent2', 'Parent3');
        private $_tExendInstances   = array();
     
        /**
         * Constructeur
         * création des instances de chaque classe mère
         */
        public function __construct() {
            // ::::: build instance for each parent class :::::
            foreach($this->_tExtends as $className){
    			$this->_tExendInstances[] = new $className;
    		}
        }
     
        /**
         * Méthode magique __call()
         * On va reporter chaque appel sur une des instances des classes mères
         * @param string $funcName
         * @param array $tArgs
         * @return mixed
         */
        public function __call($funcName, $tArgs) {
            foreach($this->_tExendInstances as &$object) {
                if(method_exists($object, $funcName)) return call_user_func_array(array($object, $funcName), $tArgs);
            }
            throw new Exception("The $funcName method doesn't exist");
        }
     
        /**
         * Méthode magique __get()
         * On va reporter chaque lecture d'attribut (accesseur) sur une des instances des classes mères
         * @param string $varName
         * @return mixed
         */
        public function __get($varName) {
            foreach($this->_tExendInstances as &$object) {
                $tDefinedVars   = get_defined_vars($object);
                if(property_exists($object, $funcName)) return $object->{$varName};
            }
            throw new Exception("The $varName attribute doesn't exist");
        }
    }
     
     
    $oChild = new Child;
     
    // appel d'une méthode parente
    $oChild->method2(); // affiche "called in parent 2"
     
    // lecture d'une variable
    echo $oChild->attribute2; // affiche "demo"
    Merci à vous.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Ton besoin d'héritage multiple découle d'une erreur de conception.

    Une classe ne peux pas hériter à la fois d'un model et d'une vue. ce sont deux entité différentes qui n'ont aucun rapport.

    Tu cherche à faire ce que l'on appel de l'héritage fonctionnel , ce qu'il ne faut pas faire. (dériver une classe car on à besoin de ses fonctionnalité).

    Si tu as besoin de Model et View dans ta classe Main , il suffit de lui passer les objets nécessaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $model = new Model();
    $view = new View();
     
    $main = new Main($model,$view);
    Avec Main qui ressemblerai à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Main
    {
        private $model;
        private $view;
     
        public function __construct($model,$view) {
            $this->model = $model;
            $this->view = $view;
        }
     
        public function utiliseModel() {
            $this->model->fonctiondemodel();
        }
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti Avatar de demenvil
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Avril 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste développeur
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 195
    Points : 389
    Points
    389
    Par défaut
    D'accord je vois le truc
    J'ai encore une petite question
    Est-ce que à ma class main je peut à elle lui coller un héritage et faire un truc du genre :

    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
     
    <?php
    class Main extends Action{
     
    private $view;
     
    public function __contruct(){
     $this->view = $this->metohde_load_action('View');
    }
    ?>
     
    //Et dans ma class action 
    //faire un 
     
    <?php
    class Action(){
     public function metohde_load_action($class){
           require($class.'.php');
         return  $class = new $class();
     
    }
     
    ?>
    Et donc par ce faite ne pas déclarer d'objet au dessus de ma class Main ?
    Un peu comme sur CodeIgniter quoi

    C'est un peu le système que je cherche à reproduire.

    Merci.

  4. #4
    Membre averti Avatar de demenvil
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Avril 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste développeur
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 195
    Points : 389
    Points
    389
    Par défaut
    C'est bon en m'inspirant du fonctionnement de ton exemple.
    J'ai pu créer un auto load ou, par le __construct je met à jour les attribut de la class pour utiliser les méthode d'autre class.

    Sans pour devoir re-déclarer mes objets

    Merci.

    Edit : Si une personne veux le code je peut le lui passer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire du multi thread en php?
    Par sirbaldur dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 12/01/2007, 17h56
  2. [MySQL] Généralisation et spécialisation héritage en PHP
    Par zana74 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 13/08/2006, 10h09
  3. [POO] héritage en php
    Par zana74 dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2006, 09h50
  4. [Calendrier] Multi-utilisateurs en php avec les ACL
    Par moabomotal dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 06/12/2005, 17h51
  5. multi update avec php/ mysql
    Par arnoweb dans le forum Administration
    Réponses: 1
    Dernier message: 17/11/2005, 22h10

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