2011-02-03 5 views
1

Pas sûr de la syntaxe POO faire ... J'aimerais avoir AClass qui appelle l'objet mysqliPHP appeler une méthode à l'extérieur une autre classe

class Voovid_DB { 
    private $host = 'localhost'; 
    private $user = 'blahblah'; 
    private $password = 'blahblah'; 
    private $name = 'blahblah'; 

    public function __contstuct(){ 
     $dbh= new mysqli($this->host, $this->user, $this->password, $this->name); 
     return $dbh; 
    } 

    //get and set methods for host, user etc... go here  
} 

maintenant je voudrais accéder à tous les méthodes de mysqli comme si

$dbconnect = new Voovid_DB(); 
if ($result = $dbconnect->query("SELECT first_name, last_name FROM members WHERE member_id=9")) { 
    while ($row = $result->fetch_assoc()) { 
     $first_name = ucfirst($row['first_name']); 
     $last_name = ucfirst($row['last_name']); 
    } 
} else { 
    $errors = $dbconnect->error; 
} 

Je suis nouveau à PHP POO et ne sais pas comment se rendre à des méthodes mysqli à l'intérieur de la classe Voovid_DB

+2

Vous avez mal orthographié "__construct". Est-ce mal orthographié dans votre programme? Si c'est le cas, vous devrez l'appeler comme n'importe quelle autre fonction. –

Répondre

2

Vous devez soit étendre la classe MySQLi, ou construire un proxy autour d'elle.

Le plus simple est sans doute de l'étendre:

class Voovid_DB extends MySQLi { 
    private $host = 'localhost'; 
    private $user = 'blahblah'; 
    private $password = 'blahblah'; 
    private $name = 'blahblah'; 

    public function __construct(){ 
     // call parent (MySQLi) constructor 
     parent::__construct($this->host, $this->user, $this->password, $this->name); 
    } 

    // no need for other methods, they already are there 
} 

Notez que le extends MySQLi.

Ensuite, votre deuxième code snipet devrait fonctionner.

Ou, construire un proxy:

class Voovid_DB { 
    private $host = 'localhost'; 
    private $user = 'blahblah'; 
    private $password = 'blahblah'; 
    private $name = 'blahblah'; 
    private $dbh; 

    public function __construct(){ 
     $this->dbh = new MySQLi($this->host, $this->user, $this->password, $this->name); 
    } 

    // this will proxy any calls to this class to MySQLi 
    public function __call($name, $args) { 
     return call_user_func_array(array($this->dbh,$name), $args); 
    } 
} 
0

Vous pouvez définir une méthode __call:

public function __call($method, $arguments) { 
    return call_user_func_array(array($this->dbh, $method), $arguments); 
} 

__call est invoquée si une méthode non définie ou inivisible est appelé.

0

votre code est correct. La seule chose que vous devez faire est de vous assurer que vous définissez vos fonctions dans Voovid_DB en tant que public.

méthodes privées ou protégées ne peuvent être accessibles à partir d'autres classes

magasin votre objet mysqli dans un domaine public dans votre classe, alors vous pouvez y accéder comme ceci:

$dbconnect->mysqlField->query 
0

Constructors ne sont pas censés retourner quelque chose. Quand vous dites $dbconnect = new Voovid_DB();, vous essayez normalement de créer un objet Voovid_DB, mais il semble que vous l'utilisiez pour essayer de créer un objet mysqli. Ne faites pas cela le constructeur et appelez la fonction après avoir créé l'objet voovid_db.

$obj = new voovid_DB(); 
$dbConnect = $obj->createMysqli(); 
Questions connexes