Utiliser une class dans une autre class

Répondre
maxroucool
le 10/03/2008 à 14:20
maxroucool
Slt tlm,

je viens de me lancer dans la POO, et j'ai un petit problème. Je voudrais savoir comment utiliser une class dans une autre class.

Je m'explique, j'ai une class "maClass" et une autre "db" (c'est la class ezSQL qui permet de gérer facilement une db).

Dans ma class "maClass" je veux utiliser la class "db" pour effectuer une requtte SQL, j'ai donc essayer de mettre ces 2 bout de code dans dans "maClass", mais ni l'un ni l'autre ne marche:

db::get_var()
$db->get_var() ($db est instancié à chaque haut de page)

J'ai aussi essayé d'instancier $db dans la méthode "__construct" de "maClass", mais ca ne marche pas non plus.


Merci bp!
+++
LA GLOBULE
le 10/03/2008 à 14:27
LA GLOBULE
Ben si tu instancies un objet dans ta classe, cela fonctionne.
T'as du merder un truc.

Exemple :

<?php
class pom {
var $toto = 3;
}

class blu {
function polom() {
$obj = new pom();
echo $obj->toto;
}
}

$pouf = new blu();
$pouf->polom();
?>


Fonctionne sans soucis.

En gros, tu ne dois pas instancier $db dans le haut de ta page car il ne sera pas accessible dans ta classe.
LupusMic
le 11/03/2008 à 00:51
LupusMic
Et je rajouterais que tu devrais lire le mode d'emploi de PHP, à la section POO, histoire de comprendre ce que tu fais ;)
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
maxroucool
le 13/03/2008 à 17:20
maxroucool
J'ai résolu mon problème, mais je voulais savoir si c'était pas possible de définir une class une fois pour toute, et qu'elle soit accessible dans toutes les autres class.

Il s'agit d'un class de gestion de MySQL, or je n'ai qu'un serveur, et qu'une seule base, donc ca me saoul de redéfinir une nouvelle instance dans chaque class.


Merci bp!
+++
mojorisin
le 18/03/2008 à 13:41
mojorisin
Tu peux envisager différentes solutions pour cela :
une classe abstraite agrégeant la class bdd : il te suffit de faire hériter tes classes avec celle-ci pour avoir acces à l'attribut de bdd.
Exemple :
<?php
abstract class A{
protected $bdd;

protected function __construct(){
$this -> bdd = new bdd();
}
}

class B extends A{
function __construct(){
parent::__construct();
}

function select($query){
$this -> bdd -> query($query);
}
}
?>


- Définir une fabrique statique
<?php
class A{
public static function getSqlObj(){
return new bdd();
}
}

class B{
function query($query){
$bdd = A::getSqlObj();
// utiliser l'objet ici
}
}
?>

Passer l'objet en argument soit dans le constructeur afin de l'agregé, soit dans les méthodes ou tu as besoin de ton objet
<?php
class A{
private $bdd;

public function __construct(Bdd $bdd){
$this -> bdd = $bdd;
}
}

class A{

public function __construct(){

}
public function doSomething(Bdd $bdd){
$bdd -> query(...);
}
}
?>
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
LupusMic
le 19/03/2008 à 05:37
LupusMic
J'irais plus loin en proposant l'implémentation du singleton. Par exemple :

<?php
class ezSQL
{
protected function __construct()
{
}

static protected $instance ;
static public function get()
{
if(!self::$instance)
self::$instance = new self ;

if(!self::$instance)
throw new Exception("Sad sick world !") ;

return self::$instance ;
}

/** reste de la classe
*/
}
?>

On l'utiliserais ainsi :
<?php
try
{
$db = zeSQL::get() ;
}
catch($e)
{
/** Gestion de l'exception */
}

/** utilisation de la classe */
?>
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours