如果我们有两个或更多个同名的类,但是在不同的文件夹中,那么在初始化期间如何区分它们?
require_once('database.php');
require_once('t/database.php');
$db = new Database(); // I want this to initialize the one in t/database.php
$globalDb = new Database(); // I want this to initialize database.php
答案 0 :(得分:2)
这就是Namespaces的作用。
但是说实话,这听起来像是一个建筑问题。有两种方法可以解决此问题。如果我们要回答您提出的问题,则可以这样解决您的问题:
database.php
class Database{
// ...
}
t / database.php
namespace T;
class Database{
// ...
}
index.php
require_once('database.php');
require_once('t/database.php');
$db = new T\Database();
$globalDb = new Database();
但是从命名约定来看,似乎您有两个单独的类打算与相同或相似的数据库实例进行交互。
我在这里做一些假设,但是另一种设置逻辑的方法是将代码压缩为单个Database类,并在多个实例上对多个连接进行操作。
考虑使用依赖注入在单个统一的类结构中管理连接,尤其是在所有连接上使用相同类型的RDBMS风格的情况下。
请考虑以下类似的示例:
class Database{
private $conn;
public function __construct(PDO $conn){
$this->conn = $conn;
}
public function select(...$args) { // Select Logic goes here }
public function insert(...$args) { // Insert Logic goes here }
public function update(...$args) { // Update Logic goes here }
public function delete(...$args) { // Delete Logic goes here }
}
只需将不同的PDO实例注入同一类,就可以一次在多个连接上进行操作:
require_once('database.php');
$conn1 = new PDO('mysql:host=localhost;dbname=test1', $user, $pass);
$conn2 = new PDO('mysql:host=localhost;dbname=test2', $user, $pass);
$db1 = new Database($conn1);
$db2 = new Database($conn2);
因此,尽管第一个示例可以直接解决您的问题,但是如果我在第二个示例中走的正确,则可能需要重新考虑您的体系结构。
要与其他所有人保持一致,您应该认真考虑使用适当的自动装带器。查看Composer和Autoloading-特别是PSR-4。
答案 1 :(得分:1)
如果我们有两个或更多个同名的类,但是在不同的文件夹中,那么在初始化期间如何区分它们?
不要那样做。加载包含第二个定义的PHP文件将引发错误:
致命错误:由于名称已在使用中,因此无法声明数据库类
您将需要重命名其中一个类。
顺便说一句,您可能要考虑在应用程序中使用an autoloader,而不是手动调用require()
。