用相同的名称初始化php类

时间:2018-10-30 01:10:38

标签: php

如果我们有两个或更多个同名的类,但是在不同的文件夹中,那么在初始化期间如何区分它们?

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

2 个答案:

答案 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);

因此,尽管第一个示例可以直接解决您的问题,但是如果我在第二个示例中走的正确,则可能需要重新考虑您的体系结构。

要与其他所有人保持一致,您应该认真考虑使用适当的自动装带器。查看ComposerAutoloading-特别是PSR-4。

答案 1 :(得分:1)

  

如果我们有两个或更多个同名的类,但是在不同的文件夹中,那么在初始化期间如何区分它们?

不要那样做。加载包含第二个定义的PHP文件将引发错误:

  

致命错误:由于名称已在使用中,因此无法声明数据库类

您将需要重命名其中一个类。

顺便说一句,您可能要考虑在应用程序中使用an autoloader,而不是手动调用require()