简体   繁体   中英

How to access an object from another class?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM