Instancier une classe dans une classe

Ikari
Invité n'ayant pas de compte PHPfrance

11 sept. 2007, 13:44

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 !

Mammouth du PHP | 19672 Messages

11 sept. 2007, 13:59

Où est initialisé ton objet $db ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 48 Messages

11 sept. 2007, 14:00

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
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !
A.Einstein

Mammouth du PHP | 19672 Messages

11 sept. 2007, 14:10

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();
    }
}
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1024 Messages

11 sept. 2007, 14:14

on peut même composer les objets :
un membre de la classe A est un objet de la classe B

A+

Pascal

Eléphanteau du PHP | 48 Messages

11 sept. 2007, 14:19

Je signale également au passage qu'on doit écrire "extends"
:wink: j'avais corrigé ma faute de frappe dés le postage cyrano :wink:
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !
A.Einstein

Mammouth du PHP | 568 Messages

11 sept. 2007, 14:21

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?

ViPHP
fab
ViPHP | 2657 Messages

11 sept. 2007, 14:21

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 )
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Ikari
Invité n'ayant pas de compte PHPfrance

11 sept. 2007, 14:37

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...)

Mammouth du PHP | 505 Messages

11 sept. 2007, 14:51

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

ViPHP
ViPHP | 1024 Messages

11 sept. 2007, 16:17

@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

ViPHP
fab
ViPHP | 2657 Messages

11 sept. 2007, 16:22

Pas faux :) enfin le principe est exactement le même
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Invité
Invité n'ayant pas de compte PHPfrance

11 sept. 2007, 16:23

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...

Mammouth du PHP | 505 Messages

11 sept. 2007, 18:55

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.