Page 1 sur 1

Instancier une classe dans une classe

Posté : 11 sept. 2007, 13:44
par Ikari
Bonjour à tous !

Je me mets à la "POO" dans PHP, et je galère un peu :)

Ce que je cherche à faire est assez simple : j'ai pour le moment deux classes : la classe gestSql (qui gère mes connexions et le parsing de mes données) ainsi que la classe Membre (qui gère... les membres).

Je cherche à créer une méthode de connexion à ma classe Membre, qui doit aller piocher des infos dans la BDD, j'ai donc écrit ceci :
function connect ($cLogin, $cPass)
{
	if ($cLogin == '' || $cPass == '')	
	{
		return 'too_short';
	}
	else
	{
		$user = $db->get_row("SELECT login, pass FROM membres WHERE login = \"".$cLogin."\"");
		return $user;
	}
}
Or l'erreur la moins grave que je réussis à avoir est la suivante :

Code : Tout sélectionner

Fatal error: Call to a member function get_row() on a non-object in H:\Serveur\monsite.fr\php-classes\Membre.php on line 45
J'ai tenté beaucoup de choses, déclarer ma classe de connexion ailleurs, avant, après la classe Membre, rien n'y fait.

Donc ma question est la suivante : comment fait-on pour déclarer une classe dans une autre classe ?

Je vous remercie par avance !

Posté : 11 sept. 2007, 13:59
par Cyrano
Où est initialisé ton objet $db ?

Posté : 11 sept. 2007, 14:00
par Gaap
si j'ai bien pigé

il te faut faire un héritage de class
class connect{

.......

}
class XXX extends connect{


}
du coup toutes tes fonctions de connect seront accéssible de XXX

Posté : 11 sept. 2007, 14:10
par Cyrano
Très sommairement :

On est pas obligé d'étendre une classe pour l'utiliser dans une autre.

Je signale également au passage qu'on doit écrire "extends"

Donc on peut faire quelque chose du genre : supposons que tu aies une première classe dans un fichier nomm ma_class_a.php avec
<?php
class maclasseA 
{
    public function __construct(){}
    
    public function maMethodeA()
    {
        $a = 1;
        return $a;
    }
}
Tu peux ensuite avoir une autre classe faisant dans un autre fichier ma_classe_b.php comme ceci :
<?php
require_once('./ma_classe_a.php');
class maclasseB 
{
    public function __construct(){}
    
    public function maMethodeB()
    {
        $b = new maclasseA();
        return $b->maMethodeA();
    }
}
Ou bien étendre la classe en faisant :
<?php
require_once('./ma_classe_a.php');
class maclasseB extends maclasseA 
{
    public function __construct(){}
    
    public function maMethodeB()
    {
        return $this->maMethodeA();
    }
}

Posté : 11 sept. 2007, 14:14
par pascaltje
on peut même composer les objets :
un membre de la classe A est un objet de la classe B

A+

Pascal

Posté : 11 sept. 2007, 14:19
par Gaap
Je signale également au passage qu'on doit écrire "extends"
:wink: j'avais corrigé ma faute de frappe dés le postage cyrano :wink:

Posté : 11 sept. 2007, 14:21
par Yosh
on peut même composer les objets :
un membre de la classe A est un objet de la classe B

A+

Pascal
Tu pourrais donner un exemple Pascaltje s'il te plait?

Posté : 11 sept. 2007, 14:21
par fab
Un peu plus d'explication sur les dires de pascaltje

il faut en fait retourner un objet depuis une method d'un autre objet exemple :
class a
{
   public function appel_b ()
   {
       $b = new b();
       return $b;
    }
}

class b 
{
   public function hello_world()
   {
       return 'Hello world';
   }
}
?>
Ainsi
 $test = new a(); 
echo $test->appel_b()->hello_world();
retourne : Hello world

( Note : le framework symfony utilise BEAUCOUP cette facette de l'objet dans PHP )

Posté : 11 sept. 2007, 14:37
par Ikari
Merci pour vos réponses...

Effectivement, la solution que j'ai trouvé c'est de réinstancier la classe DB dans ma classe membre, mais bon, quand je vais passer en prod, je vais être obligé de voir sur tous mes fichiers class si je n'ai pas fait une déclaration avec les paramètres de développement ? Je trouve pas ça très propre !

Alors que pour le moment j'instanciait une fois en début de script et la connexion était valable partout (donc une seule ligne à modifier...)

Posté : 11 sept. 2007, 14:51
par titerm
Ce qui n'est pas très propre, c'est de codé dans une classe les paramètres de connexion...
Les fichiers de config sont fait pour cela

Posté : 11 sept. 2007, 16:17
par pascaltje
@fab :
c'est pas vraiment ça la composition, mais plutôt :

class b {
// le detail de b
}

class a{

public $b;

public function __construct()
{
$this->b = new b();
}

}
A+

Pascal

Posté : 11 sept. 2007, 16:22
par fab
Pas faux :) enfin le principe est exactement le même

Posté : 11 sept. 2007, 16:23
par Invité
Ce qui n'est pas très propre, c'est de codé dans une classe les paramètres de connexion...
Les fichiers de config sont fait pour cela
Mais justement, ils sont codés dans un fichier de conf...

Posté : 11 sept. 2007, 18:55
par titerm
Dans ce cas, le fichier de conf est unique. Il n'y a rien a vérifier lors d'une mise en prod si ce n'est le contenu du fichier de conf.