在开发插件时,为了避免对所有函数和变量使用前缀,通常会对插件代码使用包装器。我在许多地方看到了使用类的实践,我想将其与简单地使用函数作为包装器进行比较。
A、 类包装器
class Nice_Plugin {
var $plugin_dir = plugin_dir_url(__FILE__);
function __contruct() {
is_admin() ? $this->build_admin() : $this->build_public();
}
function build_admin() {
register_activation_hook(__FILE__, array($this, \'activate\'));
register_deactivation_hook(__FILE__, array($this, \'deactivate\'));
register_uninstall_hook(__FILE__, array($this, \'uninstall\'));
}
function build_public() {
add_action(\'wp_enqueue_scripts\', array($this, \'add_scripts\'));
add_action(\'wp_footer\', array($this, \'add_html\'));
}
public function activate() {}
public function deactivate() {}
public function uninstall() {}
public function add_scripts() {}
public function add_html() {}
}
new Nice_Plugin();
B.函数包装器
function nice_plugin() {
$plugin_dir = plugin_dir_url(__FILE__);
is_admin() ? build_admin() : build_public();
function build_admin() {
register_activation_hook(__FILE__, \'activate\');
register_deactivation_hook(__FILE__, \'deactivate\');
register_uninstall_hook(__FILE__, \'uninstall\');
}
function build_public() {
add_action(\'wp_enqueue_scripts\', \'add_scripts\');
add_action(\'wp_footer\', \'add_html\');
}
function activate() {}
function deactivate() {}
function uninstall() {}
function add_scripts() {}
function add_html() {}
}
nice_plugin();
我已经测试了这两个,它们工作得很好。
(我想指出的是,我正在开始学习WP开发和我在这里介绍的结构,尽管为了满足我项目的当前需求,可能需要为更复杂的项目进行更改。这就是为什么我在这里向有更多经验的人询问未来可能会发生什么以及什么是更好的做法。)
虽然我喜欢类和OOP,但我倾向于方法B,原因如下:
我认为应该尽可能简单,如果给出两个类似的解决方案,越简单越好。如果没有很好的理由定义一个类并创建一个对象,那么简单地使用函数作为包装似乎更好我读到,主题大多是基于过程的,而不是基于类的,WordPress core也是如此。我不喜欢将类主要用于插件的想法问题:
上述做法是否都有效使用类本身是否更好额外问题:
关于案例B,我不太明白一点:如果只传递字符串名称,挂钩如何获得目标函数的作用域例如,如果您在全局范围内:
function niceplugin_add_scripts() {}
add_action(\'wp_enqueue_scripts\', \'niceplugin_add_scripts\');
在本例中,我假设字符串名称用于从全局范围调用函数。
但是,当您传递的函数位于“nice\\u plugin”函数的范围内时,如何访问它?范围是如何通过的?
function nice_plugin() {
function add_scripts() {}
add_action(\'wp_enqueue_scripts\', \'add_scripts\');
}
我测试了这个,当我看到它工作时,我很惊讶。
最合适的回答,由SO网友:Nathan Johnson 整理而成
上述做法是否都有效?
我从未见过有人使用方法B。函数中声明的函数仍然需要唯一。因此,仅仅因为它们是在另一个函数中声明的,并不保证不会有名称冲突。据我所知,这样做没有什么用处。
使用类本质上更好吗?
对使用类更好。然后,您可以在类中根据需要命名这些方法。更好的方法是使用名称空间。然后,可以按预期使用类,而不是作为伪名称空间。
关于案例B,有一点我不了解:如果只传递字符串名称,挂钩如何获得目标函数的范围?
你不只是传递字符串。传递数组:
静态方法:[ \'MyClass\', \'MyMethod\' ]
非静态方法:[ new MyClass(), \'MyMethod\' ]
如果您使用名称空间(您应该这样做),那么它将是:
静态方法:[ \'\\MyNamespace\\MyClass\', \'MyMethod\' ]
非静态方法:[ new \\MyNamespace\\MyClass(), \'MyMethod\' ]
例如,假设我们有一个名为class-stackexchange-example.php
在StackExchange命名空间中包含一个名为example的类,如下所示:
<?php
namespace StackExchange;
class example {
public function register() {
//* Do something awesome
}
}
现在假设我们的主插件文件(stackexchange-example.php)想要挂接到admin\\u init hook上的register方法。为此,我们将在stackexchange示例中添加以下内容。php文件:
add_action( \'admin_init\', [ new \\StackExchange\\sample(), \'register\' ] );
假设您正确地包含了所需的PHP文件,现在将调用admin\\u init钩子上StackExchange命名空间中示例类的register方法。
PHP 5.3中引入了名称空间。除非您需要支持5.2,否则我鼓励您在新项目中使用它们。