在unctions.php中使用类而不是全局函数

时间:2011-10-10 作者:Andy Adams

在我看到的许多主题(包括TwentyEleven)和我在网上找到的示例中functions.php 主题的文件所有功能都在全局范围内声明。为了澄清,这是典型函数文件的外观:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( \'foo_hook\', \'my_theme_do_foo\' );
在我看来,如果使用类,事情可以“封装”得更好一些:

class MyTheme {
    function do_foo() { // ... }
    function do_bar() { // ... }
}

$my_theme = new MyTheme();

add_action( \'foo_hook\', array( &$my_theme, \'do_foo\' ) );
第二种方法的优点(在我谦逊的眼中):

更短的函数名访问实例变量(IMO的最大优点)没有全局函数的缺点:

Classname仍然可能会导致冲突,无法与子主题“自定义”(必须扩展父类)

  • 大多数主题都没有这样做,因此你可能会逆势而行,我可能忽略了一些事情,但我想知道为什么不采取面向对象的方法?如果有的话,我觉得有点“干净”。也许我弄错了?

    我对WordPress主题开发相当陌生,如果这是WP社区的常识,请原谅我:)。只是想知道为什么事情是这样的。

  • 1 个回复
    最合适的回答,由SO网友:Andrew Nacin 整理而成

    使用类进行封装是许多插件开发人员常用的方法。我这样做,我确实觉得它更干净。但对于插件。主题本质上更具程序性。

    我们不会对默认的WordPress主题这样做,因为这会增加进入的障碍。功能非常简单。删除与类相关的操作可能很困难(在特定情况下可能会出现错误)。

    此外,默认主题中的许多函数都是可插入的。扩展类并替换方法远比定义函数复杂得多。虽然代码的两个不同方面可以替换不同的函数,但不能动态扩展类。正如您所指出的,需要扩展父类肯定是一个缺点。

    我曾考虑过让《二十一世纪》的主题选项代码成为一门课,但从未付诸实践。这种独立的、插件式的功能似乎是一种很好的封装候选者。

    结束