I am doing this currently,
class Page {
// variable to hold DBC class
public $dbc;
/*
__CONSTRUCT
Called when class is initiated and sets the dbc variable to hold the DBC class.
*/
public function __construct() {
// set the dbc variable to hold the DBC class
$this -> dbc = new DBC();
}
/*
CREATE PAGE
Create a page with the option to pass data into it.
*/
public function create($title, $class, $data = false) {
// start buffer
ob_start('gz_handler');
// content
content($this -> dbc, $data);
// end buffer and flush
ob_end_flush();
}
}
I have simplified the example, but basically I need to pass the object DBC
to a function inside the method create
?
Is this considered bad practice as I was using extends
before but realised there was no way to extract the extended class to a variable?
Thanks
You're very close to the dependency injection design pattern.
You just have to change your constructor to accept the object as a parameter, like so:
public function __construct( $dbc) {
// set the dbc variable to hold the DBC class
$this -> dbc = $dbc;
}
Then instantiate your class with the database connection, like so:
$dbc = new DBC();
$page = new Page( $dbc);
This has a variety of benefits, ranging from easier to test, to making a single connection to the database. Imagine you need five Page
objects - Now you pass them all the same database connection so they do not need to individually create one.
You should pass DBC
class instance to constructor instead of creating the object inside. This is called dependency injection
: https://en.wikipedia.org/wiki/Dependency_injection .