0

我设置了多个类,他们都需要访问数据库,他们这样做。当我想在另一个类中使用一个函数时,麻烦就来了。

class General
{

private $_db = NULL;
private $_db_one;
private $_db_two;
private $offset;

public function __construct ( PDO $db ) {

    $this->_db     = $db;
    $this->_db_one = 'lightsnh_mage1';
    $this->_db_two = 'lightsnh_inventory';  
    $this->offset  = 10800; 

}
public function getTableNames() {

    $sql = 'SELECT TABLE_NAME 
            FROM INFORMATION_SCHEMA.TABLES
            WHERE TABLE_TYPE = "BASE TABLE" AND TABLE_SCHEMA="' . $this->_db_two . '"';

    $statement = $this->_db->query($sql);
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
    return $result;
}   

这工作正常,然后我的其他班级以相同的方式连接。正如您将在下面的“Distributors”类中看到的那样,我在构造函数中实例化了我的“General”类。在我边写边学习的过程中,我不禁觉得有一种更通用或更有效的连接方式。

class Distributors
{

private $_db = NULL;
private $_db_one;
private $_db_two;
private $_source_tbl;
public  $lights;


public function __construct ( PDO $db ) {

    $this->_db = $db;
    $this->_db_one = 'lightsnh_mage1';
    $this->_db_two = 'lightsnh_inventory';
    $this->_source_tbl = 'distributors';
    // is this the best way to get functions from another class inside of this class? I have 10 classes I will need to repeat this for.
    $this->lights = new General($db);

}



public function getInventorySources() {

    // calling function from General class inside my distributor class
    $tables = $this->lights->getTableNames();

    // using result of General function inside of a function from Distributors class
    $sql = 'SELECT * FROM `' . $tables . '` WHERE `exclude` = 0';
    $statement = $this->_db->query($sql);
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);

    return $result;

}
4

3 回答 3

2

Singleton 只是另一种形式的全局状态,这是不好的。你应该总是避免它。

从您的代码示例中,

public function __construct ( PDO $db ) {

    $this->_db = $db;
    $this->_db_one = 'lightsnh_mage1';
    $this->_db_two = 'lightsnh_inventory';
    $this->_source_tbl = 'distributors';
    // is this the best way to get functions from another class inside of this class? I have 10 classes I will need to repeat this for.
    $this->lights = new General($db);
}

当您以这种方式实例化时,$this->lights = new General($db);您会从全局范围中获取 General 类。因此,模拟和单元测试几乎是不可能的。

General相反,您应该像 for 一样注入一个实例PDO。像这样:

public function __construct (PDO $db, General $general)
{

    $this->_db = $db;
    $this->_db_one = 'lightsnh_mage1';
    $this->_db_two = 'lightsnh_inventory';
    $this->_source_tbl = 'distributors';
    // is this the best way to get functions from another class inside of this class? I have 10 classes I will need to repeat this for.
    $this->lights = $general;
}

你会这样使用它:

$pdo = new PDO(...);
$pdo->setAttribute(...);

$general = new General($pdo);
$distributors = new Distributors($pdo, $general);

这是从这个类中的另一个类获取函数的最佳方法吗?我有 10 节课需要重复。

是的,你应该重复一遍,不是实例化,而是依赖注入。这使您的代码更易于维护,并且不会引入全局状态。

除此之外,您的General班级似乎明显违反了单一职责原则

于 2013-04-03T18:01:42.310 回答
-1

您应该使用单例在您的类中获取数据库,或者使用一些 ORM。

关于带单例的 mysql 类:

使用单例类在php中建立数据库连接

于 2013-04-03T17:39:36.313 回答
-1

我不知道你遇到了什么问题,但我认为函数 getTableNames 会返回一个对象或一个数组,所以结果$tables不是字符串var_dump($tables);,看看里面有什么$tables

试着用谷歌搜索你的出路。

于 2013-04-03T17:45:38.200 回答