我设置了多个类,他们都需要访问他们所做的数据库。当我想在另一个类中使用一个函数时,就会遇到麻烦。
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;
}
答案 0 :(得分: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
一样注入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
课程似乎明显违反Single-Responsibility Principle。
答案 1 :(得分:-1)
您应该使用单例来获取类中的数据库, 或使用一些ORM。
关于单例的mysql类:
Establishing database connection in php using singleton class
答案 2 :(得分:-1)
我不知道你遇到了什么问题,但我认为函数getTableNames返回一个对象或一个数组,所以$tables
中的结果不是字符串做var_dump($tables);
看看是什么在$tables
尝试从那里谷歌出去。