tags:

views:

91

answers:

7

Hello,

I have a DB 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?

Thanks, Mike.

A: 

in your index.php 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

Thariama
A: 

You might define it as global in your index.php file, and in the class constructor also put $this->db &= $GLOBALS['db'];

zilverdistel
+4  A: 

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.

Sjoerd
An example for the singleton pattern in php can be found here: http://www.weberdev.com/get_example-4002.html
zilverdistel
To make an object globally available you only need a static method to instantiate it. It does not have to be Singleton. Both is smelly, so Dependency Injection is the way to go.
Gordon
A: 

Define it on a class (separate php file). Then require it on every php file the var is needed.

Ruel
A: 

First make your DB Class a Singleton [ http://en.wikipedia.org/wiki/Singleton_pattern ]. And then in your new class you can do something like:

class myNewClass{
  private $_db;

  public function  __construct(){
     $this->_db = DB::getInstance();
  }
}
Hannes
A: 

Use the magic function __autoload().

Ben Fransen
+3  A: 

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;
    }
}
Gordon
And how exactly do I use the $db var than? $this->db->select(); ?
Mike
@Mike yes, exactly like this. Or through a getter (if you wrote one)
Gordon