【问题标题】:How to include different classes with same name?如何包含具有相同名称的不同类?
【发布时间】:2020-03-30 15:44:01
【问题描述】:

这是问题所在,我有一个脚本test.php 在这个循环中有一个循环我想使用来自不同文件夹的 4 个类(单独的文件)(它们是 pdf 打印类,但每个人都不同)其他),它们都具有相同的名称PdfCreator 我希望每次迭代都包含/要求(使用)不同的类:

$brokerTables = ['test1' => 'broker_report', 'test2' => 'choice_report', 'test3' => 'odit_report', 'test4' => 'other_insurer_report'];

foreach ($brokerTables as $folder => $table) {

    require_once($folder . '/classes/' . $brokerTables[$folder]);

    $pdfdoc = new PdfCreator($this->conn);

    // use $pdfdoc..

};

有办法吗?没有重命名类?

错误是无法声明类 PdfCreator,因为该名称已在使用中

【问题讨论】:

  • 我会说 NameSpaces 会解决这个问题,但老实说我不完全确定问题是什么
  • @RiggsFolly 命名空间是提出唯一名称的一种方法,但实际上并不是必需的;如果您只调用 A_PdfCreatorB_PdfCreator 等类,代码看起来几乎相同。

标签: php class oop


【解决方案1】:

根本的答案是你不能。 PHP 中的类名是唯一的,并且在一些不应该在生产中使用的外来扩展之外,不能“未声明”或重命名。

因此,您需要提出不同的程序设计。例如,您可以使用文件夹名称作为类名的一部分,或者更符合逻辑地使用a namespace,这样每个名称都是唯一的。然后,您需要动态定义类名来创建对象,如下所示:

$className = "\\MyTopLevelNamespace\\{$folder}\\PdfCreator";
$pdfdoc = new $className($this->conn);

注意这里不需要命名空间,你可以使用任何你喜欢的命名方案,使类名唯一,例如

$className = "{$folder}_PdfCreator";
$pdfdoc = new $className($this->conn);

在类名或命名空间的某处使用文件夹的另一个好处是,您可以使用an autoloader 来查找定义,而不是每次需要该类时都显式编写require_once 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 2019-07-06
    • 2020-06-28
    • 2011-11-20
    • 2018-12-21
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多