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?
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, eg
class SomeClassUsingDb
{
protected $db;
public function setDb($db)
{
$this->db = $db;
}
}
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.
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.
Define it on a class (separate PHP file). Then require it for every PHP file the var is needed in.
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();
}
}
使用魔术函数__autoload()
。
您可以在 index.php 文件中将其定义为 global,并且在类构造函数中还放置$this->db &= $GLOBALS['db'];
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.