2010-05-19 9 views
0

Je suis novice en matière de PHP. J'essaye de créer la base de données de classe et d'appeler d'autres classes à partir de lui. Est-ce que je le fais de la bonne façon?Extension de mysqli et utilisation de plusieurs classes

base de données de classe:

class database extends mysqli { 

private $classes = array(); 

public function __construct() { 
parent::__construct('localhost', 'root', 'password', 'database'); 
    if (mysqli_connect_error()) { 
    $this->error(mysqli_connect_errno(), mysqli_connect_error()); 
    } 
} 

public function __call($class, $args) { 
    if (!isset($this->classes[$class])) { 
    $class = 'db_'.$class; 
    $this->classes[$class] = new $class(); 
    } 
return $this->classes[$class]; 
} 

private function error($eNo, $eMsg) { 
die ('MySQL error: ('.$eNo.': '.$eMsg); 
} 

} 

classe db_users:

class db_users extends database { 

public function test() { 
echo 'foo'; 
} 

} 

et comment je l'utilise

$db = new database(); 
$db->users()->test(); 

Est-ce la bonne façon ou devrait-il être fait d'une autre manière ?

Merci.

+0

Il semble être rien de mal avec votre code. Je ne suis pas sûr de ce que vous demandez ici. En note, je vous recommande de ne pas étendre mysqli et de le composer dans votre classe. Il ne semble pas que vous gagniez quoi que ce soit de l'étendre à ce stade. – tylermac

+0

Merci pour votre commentaire. La ligne qui m'inquiète est $ db-> users() -> test() ;. Je peux créer de nouvelles classes avec __call() ou devrais-je faire à chaque fois quelque chose comme $ u = new db_users(); $ u-> test(); – Mikk

Répondre

2

Vous pouvez le faire de cette façon, il n'y a rien de mal à cela (je fais quelque chose de similaire assez souvent). La seule chose que je suggère est en utilisant des exceptions au lieu de mourir (cette façon, vous pouvez gérer en toute sécurité l'erreur) ...

protected function error($eNo, $eMsg, $extra = '') { 
    throw new Exception('MySQL error: ['.$eNo.'] '.$eMsg.': '.$extra); 
} 

De plus, je vous suggère de surcharger la méthode de requête et

public function query($sql, $result_mode = MYSQLI_STORE_RESULT) { 
    $result = parent::query($sql, $result_mode); 
    if ($result === false) { 
     $this->error($this->errno, $this->errstr, $sql); 
    } 
    return $result; 
} 

Je suggère également de stocker une copie de l'objet $ db à l'intérieur de la classe enfant. Alors:

class db_users extends database { 
    protected $db = null; 

    public function __construct(Database $db) { 
     $this->db = $db; 
    } 

    public function test() { 
     echo 'foo'; 
    } 
} 

Puis, en __call:

if (!isset($this->classes[$class])) { 
    $class = 'db_'.$class; 
    $this->classes[$class] = new $class($this); 
} 
1

Il n'y a rien de mal à ce style d'usine pour la création de classes. J'y placerais un peu de gestion des exceptions.

Ma seule autre préoccupation est d'étendre la base de données dans vos sous-classes.

donc je modifie comme suit:

public function __call($className, $args) { 
    if (!isset($this->classes[$class])) { 
     if(include_once('db_'.$class)) { 
      $class = 'db_'.$class; 
      $this->classes[$class] = new $class($this); 
     } else { 
      throw new Exception("Db class not found"); 
     } 
    } 

    return $this->classes[$class]; 
} 

Et la classe utilisateurs comme:

public class db_users { 
    private $db; 

    public __constructor($db) { 
     $this->db = $db; 
    } 

    public function test() { 
     return 'Foo'; 
    } 
} 
+0

Merci, fait quelques tests et compris pourquoi l'extension des sous-classes n'était pas une bonne idée. – Mikk