开发者

PHP calling a method from outside another class

Not sure of OOP syntax to do this... I'd like to have aclass that calls the mysqli object

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    
}

now 开发者_如何学CI'd like to access all the mysqli methods like so

$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;
}

i'm new to PHP OOP and not sure how to get to the mysqli methods inside the Voovid_DB class


You have to either extend the MySQLi class, or build a proxy around it.

The easiest is probably to extend it:

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
}

Notice the extends MySQLi.

Then your second code snipet should work.

Or, build a 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);
    }
}


You could define a __call method:

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

__call is invoked if an undefined or inivisible method is called.


you code is correct.

the only thing you have to do is to make sure that you define your functions in Voovid_DB as public.

private or protected methods cannot be accessed from other classes

store your mysqli object in a public field in your class then you can access it like this:

$dbconnect->mysqlField->query


Constructors aren't supposed to return anything. When you say $dbconnect = new Voovid_DB(); you would normally be trying to create a Voovid_DB object, but it looks like you're using it to try an make a mysqli object. Don't make this the constructor and call the function after you create the voovid_db object.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜