Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/03/2011, 17h45   #1
Membre du Club
 
Inscription : mars 2008
Messages : 274
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 274
Points : 50
Points : 50
Par défaut [POO]Utilisation de methodes venant d'une autre classe

Bonjour/ bonsoir,

Toujours dans l'apprentissage de la POO, je réécris régulièrement mon code...
J'ai écris la classe de connexion suivante:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Database {
 
    private $db_host = 'XXX';
    private $db_user = 'XXX';
    private $db_pass = '';
    private $PDO;
 
    private function setConnection() {
        try {
            $this->PDO = new PDO($this->db_host, $this->db_user, $this->db_pass);
           ...
 
        } catch (PDOException $e) {//sinon, capture de l'erreur et affichage
            echo 'La base de donnée n\'est pas disponible. <br>Merci de rééssayer plus tard';
        }
    }
 
    public function getConnection(){
        return $this->PDO;
    }
 
}
Autant je crois avoir compris comment exploiter les propriétés et méthodes d'une classe seule, autant je ne comprends pas comment y faire appel dans une autre classe (je ne parle pas de classe fille)
J'ai créée mon objet dans le même fichier:
Code :
1
2
$connection = new Database();
$auth = new Auth();
Et je veux maintenant m'en servir pour faire fonctionner la seconde classe:
Code :
1
2
3
4
5
6
class Auth {
...
public function login($data) {
$select = $connection->getConnection()->prepare(...);
...
}
Et là, je me retrouve avec un beau
Citation:
Undefined variable: connection in C:\wamp\www...
ainsi que
Citation:
Fatal error: Call to a member function getConnection() on a non-object in C:\wamp\www...
L'objet n'est pas reconnu. Que fois-je faire ?
merci,
yann18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 20h59   #2
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
moi je dirai soit tu rajoutes un attribut de type Database dans ta classe Auth e à ce moment la c'est pas de l'héritage mais une relation d'agrégation je crois ou soit tu passe ton objet Database en paramètre à ta méthode login()...
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 08h52   #3
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Comment $connection pourrait il être défini dans ta class Auth alors que tu le défini en dehors ?

Tu dois le passer en argument à ta classe Auth pour pouvoir l'utiliser :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$connection = new Database();
$auth = new Auth($connection);
 
class Auth {
    private $db
    public function __construct($db) {
        $this->db = $db;
    }
    public function login($data) {
    $select = $this->db->getConnection()->prepare(...);
...
}
Au passage quel est l'intéret de wrapper la classe PDO si tu n'y ajoutes aucune fonctionnalité ?
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 15h50   #4
Membre du Club
 
Inscription : mars 2008
Messages : 274
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 274
Points : 50
Points : 50
Citation:
quel est l'intéret de wrapper la classe PDO
En français s'il te plaît ? Merci pour ta réponse...
yann18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 12h45   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
Citation:
quel est l'intéret de wrapper la classe PDO
En français s'il te plaît ? Merci pour ta réponse...
Un Wrapper (embalage en français) est une classe destinée à en encapsuler une autre pour fournir une façade ou une adaptation (voir les patterns façade et adaptateur).

Je ne comprends pas non plus pourquoi tu fais un wrapper... La classe PDO se suffit à elle même et ta classe Database n'apporte rien. Généralement, on fabrique des Singleton PDO de cette façon:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
class Database {
  protected static function $_instance;
 
  protected function __construct () {}
 
  public static function instance ($dsn = null, $user = null, $pass = null, $do = array()) {
     if (!isset(static::$_instance)) {
        static::$_instance = new PDO($dsn,$user,$pass, $do);
     }
     return static::$_instance;
  }
}
Stealth35 à une autre approche du singleton beaucoup plus fun:
Code :
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
 
class Singleton
{
    protected static $_instances;
 
    public static function __callStatic($name, array $arguments)
    {    
        if(empty(static::$_instances[$name]) || !empty($arguments))
        {
                if(strpos($name, '\\') === 0)
                {
                $name = substr($name, 1);
                }
 
                $classname = '\\' . $name;
 
            if(method_exists($classname, '__construct'))
            {
                $class = new \ReflectionClass($classname);
                static::$_instances[$name] = $class->newInstanceArgs($arguments);
            }
            else
            {
                static::$_instances[$name] = new \$classname;
            }
        }
 
        return static::$_instances[$name];
    }
}
Dans les deux cas, l'intérêt du Singleton est d'assurer l'unicité de l'instance de PDO dans tout le système. Les détracteurs du pattern Singleton argumenteront en disant qu'un singleton est une forme détournée de variable globale et lui préfèrent une approche plus souple qui consiste pour les classes modèle à connaitre la référence de l'objet PDO qu'elles utilisent. Ils ont 100x raison mais pour des raisons pratiques, je ne me suis jamais totalement défait de mes singletons.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 17h16   #6
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Pour ajouter ma pierre à l'édifice un peu branlant...
Avant de t'attaquer à la POO et aux notions d'héritage et de composition, tu devrais t'assurer de maîtriser la portée des variables en PHP dans des fonctions toute simples. (voir le mot clé global, pas pour l'utiliser, mais pour le comprendre)

Ce n'est nullement péjoratif de ma part, tout le monde commence un jour et il faut encourager les bonnes volontés.

Mais il faut aussi canaliser les enthousiasmes débordants en leur conseillant de commencer par le début...
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h34.


 
 
 
 
Partenaires

Hébergement Web