【问题标题】:Multiple definitions (versions) of a class without conflicts一个类的多个定义(版本)没有冲突
【发布时间】:2014-07-28 17:38:53
【问题描述】:

所以最近我想出了这个想法,将 PrestaShop 模块所需的一些非常常见的函数存储在我自己的扩展版本的类中:

class MyModule extends Module { ...

有很多函数/通用代码行/缺少的功能可以存储在扩展类中。我想做的是保留这个类,使用我需要加速模块开发的功能来添加和改进它。所以以后我可以把它弹出(这个类的最新版本)并大大减少代码行数:

require_once('core/classes/MyModule.php');

class MyModuleName extends MyModule { ...

但是,我也意识到,如果应用程序 (PrestaShop) 有两个或多个使用此类的模块,我将无法执行此操作,因为会发生类定义冲突。 PrestaShop 确实具有覆盖功能,但它不是一个选项,因为如果它检测到一个已经被覆盖的方法,它会抛出一个错误(不允许冲突)。我们制作了很多不同的模块,其中一些我们更新,一些我们没有,所以我们不知道客户端 PrestaShop 系统将拥有多少我们的模块以及它们将拥有哪些版本。每个模块应该是独立的,但不应与其他模块冲突(如果存在并使用扩展类)。

PHP Fatal error: Cannot redeclare class
  1. 我有什么办法可以做到这一点(使用命名空间或其他方式)?
  2. 一个类有多个定义是不好的做法吗?
  3. 它会大大影响性能吗?

MyModule 的情况下,我需要访问模块对象 ($this) 来定义我的大部分扩展函数。

我也希望MyTools 类具有静态方法,但自然也面临同样的问题。你认为像这样定义辅助函数是可行的吗? :

if(!function_exists(myFunctionName)){
   function myFunctionName(){
    }
}

【问题讨论】:

  • 乍一看,这可以通过使用 include_once 并将公共代码分解到一个共享的支持/实用程序库中来缓解,而不是由两个模块复制。或者,命名空间是要走的路。
  • 是的,但是如果在 MyModule.php 类文件中放置一个命名空间,我不需要在其中使用的每个其他类前面加上一个全局命名空间斜杠 \ 吗?我可能错了,我非常熟悉使用命名空间。我有人可以举一个很好的例子。

标签: php oop namespaces


【解决方案1】:

在我看来,实现这一点的最佳方法是在您使用的每个模块中复制您的类,原因是:您的模块依赖于一个外部类,该类会随着时间而改变,所以如果您在您的模块 A 的助手类,对模块 B 没有影响,因为模块 B 使用自己的助手。这已经是 PrestaShop 使用某些模块的方式,以保持 1.4 和 1.5 版本之间的兼容性,每个模块上都有一个 backward_compatibility/ 文件夹。

【讨论】:

  • 好的,请问您如何解决命名冲突?将实际模块名称附加到每个 MyModule 类 -> MyModule{$moduleName} ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多