我正处于编写基本MVC WordPress插件开发框架的开始阶段,我意识到我将遇到命名冲突问题。如果我想在我正在开发的几个插件和/或主题中包含这个框架,最终我将遇到一个class_exists()无法解决的问题。
我可以将框架创建为一个独立的插件,但这需要下载我的插件或主题的任何人也下载框架,这似乎不太现实(特别是对于现有插件的升级) t目前有这样的依赖。)
无论如何,我认为你们中的很多人可能遇到过这些问题,我想知道是否有人制定了一个好的策略来解决这个问题。
如果可能的话,我不需要为每个插件添加一个唯一的前缀(这将使更新框架成为一场噩梦)。我希望有一些聪明的方法来动态命名这些类,而不必硬编码。
答案 0 :(得分:1)
Namespace可以解决您的问题。
答案 1 :(得分:0)
<强>更新强>
向提问者道歉,因为第一次没有得到这个权利。吕克是对的。 Namespace是最佳选择。
<强>原始强>
有些框架选择在其类名前加上一个字母以避免冲突。 Yii就像前面的C一样:
class CClassName
{
}
答案 2 :(得分:0)
我最终选择的解决方案是创建一个bootstrap.php
文件,让框架的每个实例都注册(在一个全局变量中)它是什么版本及其文件路径。然后我注册一个在加载所有插件/主题后运行的动作,它比较所有版本,只加载与最新版本相关的类。
我看到的唯一缺点是我必须确保我的框架向后兼容,但无论如何我计划这样做。
这是我在bootstrap文件中使用的代码。显然,框架的每个实例中的版本号都需要与所包含框架的版本号相对应。
// register this version of the framework
$GLOBALS['pw_framework_meta']['0.1.2'] = __FILE__;
if ( !function_exists('pw_framework_init') ) {
/**
* Sort the $GLOBALS['pw_framework_meta'] variable for the latest registered
* version of the framework. Include the PW_Framework.php file and then call init()
*/
function pw_framework_init()
{
// get all the different versions registered with $GLOBALS['pw_framework_meta']
$versions = $GLOBALS['pw_framework_meta'];
// sort the versions
uksort($versions, 'version_compare');
// get the latest versions (the last in the array)
$latest = end($versions);
if ( !class_exists('PW_Framework') ) {
require_once( dirname($latest) . '/PW_Framework.php' );
}
PW_Framework::init();
}
// register pw_framework_init() with the 'after_setup_theme' hook
// This way we can ensure that all plugins or themes that might be using PW_Framework
// have had a chance to register with the $GLOBALS['pw_framework_meta'] variable
add_action( 'after_setup_theme', 'pw_framework_init' );
}