Objet dans une classe

Eléphant du PHP | 147 Messages

25 nov. 2007, 13:57

Bonjour

Dans une classe je souhaiterai avoir une instance d'un objet et pouvoir accéder à ces methodes mais je ne sais pas comment faire.

Merci de votre aide.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 nov. 2007, 15:04

Eh bien, c'est comme pour un code procédural, sauf que tu es dans une méthode d'une fonction
class Foo
{
  private $o_instance;

  public function __construct() {
    $this->o_instance = new Bar(); // Création d'un objet Bar()
  }
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 147 Messages

25 nov. 2007, 16:02

En fait je ne voudrais pas creer une nouvelle instance.

Concrètement
j'ai une classe mysql qui contient des methodes pour acceder a mes tables (connection, deconnection, select...)
j'ai une classe menu qui contient les libellé de mes menu contenu en table.

Je voudrai accéder à ma table grace a une instance de ma classe Mysql dans la classe menu.

J'espere etre clair. sinon je tenterai d'etre plus precis.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 nov. 2007, 17:43

Je ne vois pas en quoi mon exemple ne fonctionne pas ...
class Menu
{
  private $o_db;

  public function __construct() {
    $this->o_db = new MySQL();
  }
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 1511 Messages

25 nov. 2007, 18:58

Je crois avoir compris le problème de notre ami.
class foo
{
var $oInstance;
function __construct($oInstance) {
$this->oInstance = $oInstance;
}
}
$class = new MySql();
$classInstance = new foo(&$instance);
Je pense que c'était plutôt dans cette optique.
@+

ViPHP
ViPHP | 4674 Messages

25 nov. 2007, 21:28

Moi je comprends plus qu'il demande des infos sur la notion d'héritage. Mais ça très vague ^^.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 147 Messages

25 nov. 2007, 23:14

Ouais sa doit etre de l'heritage, je suis pas sur d'avoir bien compris e principe de la chose mais j'y travaille.

Zeus ta soution me semble pas top car je créer une nouvelle instance de la classe Mysql donc une nouvele connection à ma base.

Eléphant du PHP | 445 Messages

25 nov. 2007, 23:47

L'héritage ne s'utilise que dans des cas très précis.
Au vue de tes classes, je suis sur qu'il ne s'agit pas d'héritage.

En quoi est ce genant d'avoir une instance de classe B dans une classe A ?

Eléphant du PHP | 147 Messages

26 nov. 2007, 00:56

Sa m'ouvre une seconde connection à la base Mysql non?

Sa me gène de multiplier les connections.

Eléphant du PHP | 445 Messages

26 nov. 2007, 00:59

A ce moment la tu passe en parametre de ta fonction ou tu souhaites acceder a ton serveur mysql une reference de l'instance de ta classe mysql crée précedemment.

ViPHP
ViPHP | 4674 Messages

26 nov. 2007, 01:02

Ou tu utilises le design pattern Singleton :D ? Bon on se calme ...
Tu connais les notions d'attributs de classes statiques par exemple ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 147 Messages

26 nov. 2007, 01:10

Vous me conseillé quoi, la reference ou les attributs statique?

ViPHP
ViPHP | 5924 Messages

26 nov. 2007, 02:59

Bah c'est question de choix… Personnellement j'utilise le passage d'une référence qui te permet d'avoir autant de connexions que tu le désires, et qui est plus simple à implémenter pour un débutant puisque la notion de méthodes statiques se voit souvent après la notion d'instanciation d'objets.

Donc pour la mise en œuvre, c'est exactement le message de zeus. Tu instancies ta classe MySQL :
$sql = new MySQL();
Dans ta classe Menu, tu prévois un attribut privé pour stocker l'objet MySQL :
private $sql = NULL
Et dans ton constructeur, tu prends en paramètre l'objet sql à stocker et tu l'assignes à l'attribut :
function __contruct($sql)
{
    $this->sql = $sql;
}
Lors de la création du menu, tu as donc juste à lui passer ton objet sql :

Code : Tout sélectionner

$menu = new Menu($sql);
Et tu peux maintenant utiliser sans problème ta connexion sql dans ton menu :
public function test()
{
    $this->sql->query('SELECT "Ca marche !"');
}

Eléphant du PHP | 147 Messages

26 nov. 2007, 03:22

Je voulais faire sa au depart mais zend studio ne fait pas la complétion quand je mets un truc du genre :
$this->mysql->query($query)

ViPHP
ViPHP | 5924 Messages

26 nov. 2007, 14:30

Evidemment vu quephp est un langage non typé et que zend studio n'est pas sensé connaître les données de ta variable. Mais as tu vraiment besoin de l'autocomplétion ? Personnellement j'utilise un éditeur de texte tout con, et je ne développe pas moins bien pour autant… Bref, ces gadgets simplifient la vie, mais seulement si on n'en est pas dépendant.

Bref, pour ton problème, tu peux essayer d'ajouter ceci dans le constructeur :
function __construct(MySQL $sql)
mais je ne garantis rien et je t'inciterais à garder cette méthode même si tu n'as pas l'autocomplétion…