好的,我有两个大项目,在这两个项目中,我对服务器的控制足够多,可以使用名称空间并依赖于自动加载。
首先。自动加载非常棒。不担心需求是一件相对较好的事情。
这是我在几个项目中使用的加载程序。首先检查以确保该类位于当前命名空间中,如果不在,则将其清除。从这里开始,只需一些字符串操作即可找到类。
<?php
spl_autoload_register(__NAMESPACE__ . \'\\\\autoload\');
function autoload($cls)
{
$cls = ltrim($cls, \'\\\\\');
if(strpos($cls, __NAMESPACE__) !== 0)
return;
$cls = str_replace(__NAMESPACE__, \'\', $cls);
$path = PLUGIN_PATH_PATH . \'inc\' .
str_replace(\'\\\\\', DIRECTORY_SEPARATOR, $cls) . \'.php\';
require_once($path);
}
可以很容易地将其调整为无需名称空间即可使用。假设插件/主题类的前缀是统一的,那么只需测试前缀即可。然后在类名中使用下划线作为目录分隔符的占位符。如果您使用了很多类,那么可能需要使用某种类型的类映射自动加载器。
名称空间和挂钩
WordPress的挂钩系统通过使用
call_user_func
(和
call_user_func_array
), 它将函数名作为字符串,并在
do_action
(以及随后,
call_user_func
) 进行函数调用。
对于名称空间,这意味着您需要将包含名称空间的完全限定函数名传递到挂钩中。
<?php
namespace WPSE\\SomeNameSpace;
add_filter(\'some_filter\', \'WPSE\\\\SomeNameSpace\\\\the_function\');
function the_function()
{
return \'did stuff\';
}
最好是自由地利用
__NAMESPACE__
如果要这样做,请使用魔法常量。
<?php
namespace WPSE\\SomeNameSpace;
add_filter(\'some_filter\', __NAMESPACE__ . \'\\\\the_function\');
function the_function()
{
return \'did stuff\';
}
如果你总是把钩子放在类中,那就容易多了。类的标准创建实例和构造函数中的所有挂钩
$this
工作正常。
<?php
namespace WPSE\\SomeNameSpace;
new Plugin;
class Plugin
{
function __construct()
{
add_action(\'plugins_loaded\', array($this, \'loaded\'));
}
function loaded()
{
// this works!
}
}
如果像我希望的那样使用静态方法,则需要将完全限定的类名作为数组的第一个参数传递。这需要做很多工作,所以你可以使用魔法
__CLASS__
常量或
get_class
.
<?php
namespace WPSE\\SomeNameSpace;
Plugin::init();
class Plugin
{
public static function init()
{
add_action(\'plugins_loaded\', array(__CLASS__, \'loaded\'));
// OR: add_action(\'plugins_loaded\', array(get_class(), \'loaded\'));
}
public static function loaded()
{
// this works!
}
}
使用核心类,PHP的类名解析有点不可靠。如果要使用核心WP类(
WP_Widget
在以下示例中)您必须提供
use
声明。
use \\WP_Widget;
class MyWidget extends WP_Widget
{
// ...
}
或者可以使用完全限定的类名——基本上只需在其前面加一个反斜杠。
<?php
namespace WPSE\\SomeNameSpace;
class MyWidget extends \\WP_Widget
{
// ...
}
定义这是更通用的PHP,但它咬了我一口,就是这样。
你可能想定义你经常使用的东西,比如插件的路径。使用define语句会将内容放在根命名空间中,除非将命名空间显式传递到define的第一个参数中。
<?php
namespace WPSE\\SomeNameSpace;
// root namespace
define(\'WPSE_63668_PATH\', plugin_dir_path(__FILE__));
// in the current namespace
define(__NAMESPACE__ . \'\\\\PATH\', plugin_dir_path(__FILE__));
您还可以使用
const
PHP 5.3 plus文件根级别中的关键字。
consts
始终在当前命名空间中,但不如
define
呼叫
<?php
namespace WPSE\\SomeNameSpace;
// in the current namespace
const MY_CONST = 1;
// this won\'t work!
const MY_PATH = plugin_dir_path(__FILE__);
Please feel free to add any other tips you might have!