【问题标题】:How to avoid PHP class name collision when distributing as library?作为库分发时如何避免 PHP 类名冲突?
【发布时间】:2020-04-23 14:43:18
【问题描述】:

我正在尝试编写一个小的 PHP 类 updater,它可以在多个 Wordpress 插件中使用。目录结构如下:

Plugins
--pluginA
---main.php
---updater.php

--pluginB
---main.php
---updater.php

--pluginC
---main.php
---updater.php

updater.php

class updater {

}

ma​​in.php

require_once 'updater.php';
new updater();

但我总是遇到致命错误,因为存在多个相同类名的定义。

我的方法#1

if ( ! class_exists( 'start' ) ):
class updater {

}
endif;

但我觉得上述解决方案行不通,因为插件开发人员可能已经有一个类名updater 用于其他特殊工作。

我的方法 #2 我尝试使用名称空间。它说未定义的类,因为它试图从当前命名空间pluginA 导入该类。这里的问题是,根据开发人员的便利性或其目录结构,插件可能已经具有命名空间。而且我不希望开发人员修改他们自己的命名空间或 lib 命名空间。

updater.php

namespace myLib;
class updater {
}

ma​​in.php

namespace pluginA;

require_once 'updater.php';
use myLib\updater;
new updater();

那么我如何将我的库分发给所有可以在他们的 main.php 文件中添加几行并开始使用我的库的开发人员?使类名完全唯一的唯一解决方案是什么?

【问题讨论】:

标签: php wordpress namespaces


【解决方案1】:

首先,除非您根本不使用类,否则您无法在不修改其他插件代码的情况下执行此操作

最快的方法是不要使用相同的类名。如果你坚持使用相同的类名,你必须利用好命名空间来分隔它。

摘录PSR-4 specification 2-1如下:

  1. 完全限定的类名必须具有顶级命名空间名称,也称为“供应商命名空间”。
  2. 完全限定的类名可以有一个或多个子命名空间名称。

如果要保存厂商名,我觉得可以,但至少要保留插件名。

pluginA为例,插件名使用myLib,修改updater.phpmain.php为:

updater.php

namespace myLib\pluginA;

class updater {
}

ma​​in.php

require_once 'updater.php';

namespace myLib\pluginA;

new updater(); // Full class name  is myLib\pluginA\update

另一个插件应该这样做,否则名称冲突的情况仍然存在。

【讨论】:

  • 所以你的意思是,当另一个开发人员在他的插件中使用updater.php 作为库时说pluginB,他应该将updater.php 的命名空间修改为namespace myLib\pluginB; 之类的东西?
  • @calos-kalo 你的意思是我们必须使类名或命名空间始终唯一。
  • 类名可以重复,但不能在同一个命名空间中重复。
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2021-04-15
  • 2017-05-01
  • 1970-01-01
  • 2013-11-13
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多