Reputation: 6934
I have a database class, which is used to make select, update, delete MySQL queries.
Now, I want to create a MySQL query inside another class, but if I define $db = new DB();
in index.php
, I can't use the $db
var in another class. Do I have to define the variable $db
over and over again, if I want to make a query? Or is there a way to make the $db
var with an object global var?
Upvotes: 6
Views: 9073
Reputation: 50840
In your index.php
file use
require_once('path_to_file_with_class.php');
You may also use include_once
, which will give you a warning instead of an error if the 'path_to_file_with_class.php' file is not available.
Upvotes: 0
Reputation: 15780
Define it on a class (separate PHP file). Then require it for every PHP file the var is needed in.
Upvotes: 0
Reputation: 8247
First make your database class a singleton. And then in your new class you can do something like:
class myNewClass{
private $_db;
public function __construct(){
$this->_db = DB::getInstance();
}
}
Upvotes: 0
Reputation: 317197
The cleanest approach would be to aggregate the database class where needed by injecting it. All other approaches, like using the global
keyword or using static
methods, let alone a Singleton, is introducing tight coupling between your classes and the global scope which makes the application harder to test and maintain. Just do
// index.php
$db = new DBClass; // create your DB instance
$foo = new SomeClassUsingDb($db); // inject to using class
and
class SomeClassUsingDb
{
protected $db;
public function __construct($db)
{
$this->db = $db;
}
}
Use Constructor Injection if the dependency is required to create a valid state for the instance. If the dependency is optional or needs to be interchangeable at runtime, use Setter Injection, e.g.
class SomeClassUsingDb
{
protected $db;
public function setDb($db)
{
$this->db = $db;
}
}
Upvotes: 12
Reputation: 75679
You probably want a singleton. This gives you a way to get an instance of DB anywhere in the code. Then anywhere you want to do a query, first do $db = DB::getInstance();
.
An alternative is dependency injection, which passes a DB instance to all classes which need one.
Upvotes: 5
Reputation: 1579
You might define it as global in your index.php file, and in the class constructor also put $this->db &= $GLOBALS['db'];
Upvotes: -1