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 :

[smplPDO] - héritage


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Par défaut [smplPDO] - héritage
    Bonjour à tous !

    Je viens solliciter votre aide car je bloque sur une connerie (n'ayons pas peur des mots...). Je vous explique mon soucis tout bête :


    J'utilise la class smplPDO.

    Je l'instancie de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    require_once('smplPDO.php');
    $db = new smplPDO('mysql:host='.MYSQL_HOST.';dbname='.MYSQL_DB, MYSQL_USER, MYSQL_PASS );
    Je peux utiliser $db dans ma page sans soucis, tout fonctionne.

    Histoire de ranger mon code, j'ai créé une classe reprenant les fonctions liées à mon client : client.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    require_once('client.class.php');
    $client = new Client();
    Le truc, c'est que dans cette classe client, j'aimerai faire des appels BDD, donc, utiliser ma classe smplPDO.
    Et c'est là que je bloque, bêtement (ma classe sans appel smplPDO fonctionne bien, donc ce n'est pas un soucis d'appel).

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Client extends smplPDO { 
     
    public function display(){
            $result = $this->get_all('job', array('cdc' => 1)); // get_all est une méthode de la classe smplPDO.
            return $result
    }
    }
    A marche po.
    J'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
    Qu'est ce que je fais de mal ? Je suis persuadé que c'est tout bête, mais...

    Merci à vous !

    PHP Version 5.6.32

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 711
    Par défaut
    une question qui pourra certainement vous mettre sur la piste : quand vous utilisez "$client = new Client();", où indiquez vous le nom du serveur auquel se connecter ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Par défaut
    Petite mise à jour...

    J'ai dû avoir de gros problèmes de caches, car le expands fonctionne désormais...
    La connexion smplPDO se fait bien dans ma classe client. Cool.

    Par contre, quand j'appelle une méthode de ma classe client, j'ai une erreur :


    Dans ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Client extends smplPDO {
     
        public function testing(){
            echo "ça marche !";
        }
    }
    Je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php 
    $client = new Client(); 
    $client->testing(); ?>
    Et j'ai :
    Fatal error : Call to undefined method smplPDO::testing()

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    c'est une première mais je te réponds que je ne vais pas te répondre...
    Ce que tu fais c'est ce que l'on appelle de l'héritage fonctionnel et c'est très très mauvais.
    Abandonne cette approche pendant qu'il en est encore temps et injecte ta ressource PDO dans tes classes au lieu de les dériver.

    Ensuite ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    require_once('client.class.php');
    $client = new Client();
    est à proscrire.

    Opte directement pour ce qui se fait de mieux : une classe = un fichier et le nom du fichier doit correspondre exactement au nom de la classe implémentée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    require_once('Client.php');
    $client = new Client();
    Ainsi tu pourras passer à l'autoloading et zou ta vie sera plus légère.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Par défaut
    Mon problème a été résolu. Il "suffisait" de n'instancier que la classe client, et pas la classe smplPDO (qui doit donc s'instancier via client).
    Je ne comprends pas trop la logique, mais... ma foi.

    Quoiqu'il en soit, ce n'est pas la première fois qu'on me dit de proscrire l'héritage.
    Je ne sais pas ce que veux dire d'injecter au lieu de dériver, mais je vais me renseigner.

    Aucune idée aussi de ce qu'est l'autoload.
    Je vais regarder tout ça, merci pour les pistes !

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par vinParker Voir le message
    Quoiqu'il en soit, ce n'est pas la première fois qu'on me dit de proscrire l'héritage.
    C'est pas l'héritage qui est à proscrire , mais la façon dont tu l'utilises.
    Hériter d'une classe pour en récupérer une fonctionnalité c'est une erreur , et comme le précise rawsrc c'est de l'héritage fonctionnel. C'est cette forme d'héritage qu'il faut éviter car il n'a aucun sens.
    Pour imager mes propos :
    Imaginons 2 classes : Animal et Chien
    Je peux hériter Chien de Animal car ils partagent des caractéristiques. Chien n'est qu'une spécialisation de animal.
    En revanche ca n'aurait aucun sens d'hériter Chien d'une classe Voyage parce qu'elle à une méthode "avancer()" qui m'intéresse.

    Citation Envoyé par vinParker Voir le message
    Je ne sais pas ce que veux dire d'injecter au lieu de dériver, mais je vais me renseigner.
    !
    Dans ton cas ca veux dire qu'au lieux d'hériter de ta classe Pdo tu l'injectes dans ta classe client , soit via le constructeur , soit via un setter

    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
    class Client()
    {
        private $pdo;
     
        //Via constructeur
        public function __construct(smplPDO $pdoinjection)
        {
            $this->pdo = $pdoinjection;
        }
     
        // Ou via setter
        public function setSmplPDO(smplPDO $pdoinjection)
        {
            $this->pdo = $pdoinjection;
        }
     
        public function exemple()
        {
            $this->pdo->insert(....);
        }
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Par défaut
    Ooooook. Je comprends. L'héritage, c'est bien, mais faut que ça soit cohérent.
    Là effectivement dans mon cas, y'a pas de logique de faire comme ça.
    Je vais donc regarder tes propositions.

    Par contre, quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        private $pdo;
     
        //Via constructeur
        public function __construct(smplPDO $pdoinjection)
        {
            $this->pdo = $pdoinjection;
        }
    tu fais un construct en passant comme paramètre smplPDO (le nom de la classe ?) et $pdoinjection. Y'a quoi dans cette variable ?

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

Discussions similaires

  1. Problème héritage et classes abstraites
    Par sebzinzin dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2007, 19h24
  2. Problème héritage et vecteur
    Par scrat88 dans le forum Langage
    Réponses: 10
    Dernier message: 23/05/2007, 19h02
  3. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 17h00
  4. Problème Héritage JavaScript
    Par Flavien dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/07/2006, 14h29
  5. Problème héritage CWnd
    Par ptitJP dans le forum MFC
    Réponses: 4
    Dernier message: 21/04/2006, 12h41

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