Page 1 sur 2

Objet dans une classe

Posté : 25 nov. 2007, 13:57
par NoNos
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.

Posté : 25 nov. 2007, 15:04
par zeus
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()
  }
}

Posté : 25 nov. 2007, 16:02
par NoNos
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.

Posté : 25 nov. 2007, 17:43
par zeus
Je ne vois pas en quoi mon exemple ne fonctionne pas ...
class Menu
{
  private $o_db;

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

Posté : 25 nov. 2007, 18:58
par momox
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.
@+

Posté : 25 nov. 2007, 21:28
par Hywan
Moi je comprends plus qu'il demande des infos sur la notion d'héritage. Mais ça très vague ^^.

Posté : 25 nov. 2007, 23:14
par NoNos
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.

Posté : 25 nov. 2007, 23:47
par h0_noMan
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 ?

Posté : 26 nov. 2007, 00:56
par NoNos
Sa m'ouvre une seconde connection à la base Mysql non?

Sa me gène de multiplier les connections.

Posté : 26 nov. 2007, 00:59
par h0_noMan
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.

Posté : 26 nov. 2007, 01:02
par Hywan
Ou tu utilises le design pattern Singleton :D ? Bon on se calme ...
Tu connais les notions d'attributs de classes statiques par exemple ?

Posté : 26 nov. 2007, 01:10
par NoNos
Vous me conseillé quoi, la reference ou les attributs statique?

Posté : 26 nov. 2007, 02:59
par Sékiltoyai
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 !"');
}

Posté : 26 nov. 2007, 03:22
par NoNos
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)

Posté : 26 nov. 2007, 14:30
par Sékiltoyai
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…