it-swarm.cn

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

在我见过的许多主题(包括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仍可能导致冲突
  • 使用子主题“自定义”并不明确(必须扩展父类)
  • 大多数主题都没有这样做,所以你要逆势而行

我可能会忽略一些事情,但我想知道为什么不采取OOP方法?如果有的话,对我来说感觉有点“干净”。也许我弄错了?

我是WordPress主题开发的新手,所以如果这是WP社区:)的常识,请原谅我。只是想了解为什么事情就是这样。

11
Andy Adams

使用类进行封装是许多开发人员用于插件的一种非常常见的方法。我这样做,我觉得它更清洁。但是对于插件。主题更具程序性。

我们不会为默认的WordPress主题执行此操作,因为它会增加进入的门槛。功能很简单。删除与类绑定的操作可能很困难(并且在特定情况下可能存在错误)。

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

我考虑过将Twenty Eleven的主题选项编写为一个类,但从未接触过它。这种独立的,类似插件的功能似乎是封装的良好候选者。

9
Andrew Nacin