Rick Weston
Rick Weston

Reputation: 53

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 I'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

Upvotes: 1

Views: 1222

Answers (4)

Arnaud Le Blanc
Arnaud Le Blanc

Reputation: 99919

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

Upvotes: 2

Nick Rolando
Nick Rolando

Reputation: 26177

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();

Upvotes: 0

Fender
Fender

Reputation: 3055

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

Upvotes: 0

NikiC
NikiC

Reputation: 101946

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.

Upvotes: 0

Related Questions