【发布时间】: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
- 我有什么办法可以做到这一点(使用命名空间或其他方式)?
- 一个类有多个定义是不好的做法吗?
- 它会大大影响性能吗?
在MyModule 的情况下,我需要访问模块对象 ($this) 来定义我的大部分扩展函数。
我也希望MyTools 类具有静态方法,但自然也面临同样的问题。你认为像这样定义辅助函数是可行的吗? :
if(!function_exists(myFunctionName)){
function myFunctionName(){
}
}
【问题讨论】:
-
乍一看,这可以通过使用 include_once 并将公共代码分解到一个共享的支持/实用程序库中来缓解,而不是由两个模块复制。或者,命名空间是要走的路。
-
是的,但是如果在 MyModule.php 类文件中放置一个命名空间,我不需要在其中使用的每个其他类前面加上一个全局命名空间斜杠 \ 吗?我可能错了,我非常熟悉使用命名空间。我有人可以举一个很好的例子。
标签: php oop namespaces