在我看到的许多主题(包括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社区的常识,请原谅我:)。只是想知道为什么事情是这样的。
最合适的回答,由SO网友:Andrew Nacin 整理而成
使用类进行封装是许多插件开发人员常用的方法。我这样做,我确实觉得它更干净。但对于插件。主题本质上更具程序性。
我们不会对默认的WordPress主题这样做,因为这会增加进入的障碍。功能非常简单。删除与类相关的操作可能很困难(在特定情况下可能会出现错误)。
此外,默认主题中的许多函数都是可插入的。扩展类并替换方法远比定义函数复杂得多。虽然代码的两个不同方面可以替换不同的函数,但不能动态扩展类。正如您所指出的,需要扩展父类肯定是一个缺点。
我曾考虑过让《二十一世纪》的主题选项代码成为一门课,但从未付诸实践。这种独立的、插件式的功能似乎是一种很好的封装候选者。