问题描述

当没有必要时,我看到很多使用 object-oriented 编码的插件。

但更糟糕的是,主题开发人员开始做同样的事情。商业主题和免费受欢迎的主题,如 Suffusion,甚至我最喜欢的主题 – 混合,将所有的功能都放在一个类中,在 functions.php 中实例化一次,并以程序方式运行它的功能:)

跆拳道?这是什么意思?显然,您不会同时使用两个或更多个相同主题的实例。

我们假设插件为命名空间做了这个 (这是可笑的),但主题是什么呢?我错过了什么吗?

编码这样的主题有什么好处?

最佳解决方案

我可以根据你提供的例子了解你的困惑。这真的是一个糟糕的方式来使用一个类… 只是因为使用一个类,不会使系统 OOP 。

在混合的情况下,他们只是使用一个类来命名其功能。考虑到混合是一个主题框架,这样做是为了让孩子的主题可以让 re-use 的函数名不用开发人员担心名字冲突。在许多情况下,主题框架 (父主题) 是如此复杂,许多儿童主题开发人员根本不会明白什么。

如果 Hybrid 没有使用类结构,则子主题开发人员需要知道现有的所有函数调用是否可以避免使用 re-using 名称。是的,您可以使用独特的插件为所有的功能添加前缀,但这会使代码难以阅读,难以维护,如果您开发更多使用相同功能的系统,那么 non-reusable 是固有的。

回答你的问题

Wtf? What’s the point of doing this? Obviously you won’t be using two or more instances of the same theme, at the same time.

不,您不会使用两个或多个相同主题的实例。但是像我所说的,在这种情况下,想到类的结构是命名函数,而不是创建一个传统的对象实例。将所有内容集中在一个类中,并将其实例化为调用方法 (myClass->method();) 或直接调用方法 (myClass::method();) 是以可读,可重用的方式命名空间的一种非常干净的方式。

当然,你可以随时使用像 myClass_method(); 这样的东西,但是如果你想在其他主题,插件或者 antoher 框架中重新使用这些代码,你必须回头再来改变所有的前缀。将所有内容都保持在一个课堂上是比较干净的,并允许您更快地重新开发和重新部署。

Let’s assume that the plugins do this for the namespace (which is ridiculous), but what’s the theme excuse? Am I missing something?

在大多数情况下,我同意你的看法。然而,这个多数人正在迅速消失。我在 MultiSite 上安装多个使用相同主题变体的站点。而不是 re-create 相同的主题一遍又一遍地有微小的差异,我有一个单一的”class” 为父主题和所有的小题目扩展该类。这允许我为每个站点定义自定义功能,同时仍然保持整个网络的一致性。

一方面,主题开发人员可以选择一个 class-based 方法来命名其功能 (如果您在一个或多个同一代码的 re-use 块中工作的环境中工作,这是不可笑的) 。另一方面,主题开发人员可以选择一种 class-based 方法,以便通过儿童主题进行易于扩展。

What’s the advantage of coding a theme like this?

如果您只在您的网站上使用混合版,那么对于最终用户来说,几乎没有什么优势。如果您正在为 Hybrid 构建一个子主题,那么它们具有命名空间和扩展性的优点。如果您为 ThemeHybrid 工作,则优势在于您可以在其他项目 (Prototype,Leviathan 等) 中快速高效的代码重用。

如果您是一个喜欢 Hybrid 而不是整个主题的特定功能的主题开发人员,则优势在于您的 non-Hybrid 项目中的快速,高效的代码重用 (假设它也是 GPL) 。

次佳解决方案

Speed

我目前的基础主题有 13 节课。当我建立一个新的主题,我要么使用这些类,因为它们是或我扩展它们。该系统使得构建新主题的过程非常快速。

紧密的范围

我很少需要全局变量,因为我的代码必须知道的一切隐藏在类成员中。所以我可以在两个非常不同的过滤器或动作之间共享一个变量,而不会与写入不当的插件相冲突。

Maintenance

每个类都是一个文件。如果我需要更新客户端的主题,我只是更新一些文件。只要我提供相同的 API,班级内的任何事情都取决于我。

一个例子:在 comment_form(); 调用之上,我使用一个简单的动作:

do_action( 'load_comment_class' );
comment_form();

将加载哪个注释类决定我的控制器。在评论类中确切发生的是决定单个类。

尝试一个纯粹的程序方法,你会坚果。 🙂

Readability

如果您根据任务分离了所有内容,几个月后就可以轻松地重读和理解自己的代码。

一些有用的类层次结构的例子

  •  Meta_Box – > 由 Shortdesc_Meta_BoxSimple_Checkbox_Meta_Box 扩展 – > 由 Sidebar_Switch 扩展
  •  User_Profile_Addon – > 由 User_Profile_Checkbox 延伸 (见 Question 3255)
  •  Comment_Form – > 由 {$theme_name}_Comment_Form 扩展

第三种解决方案

另一点要考虑:速度。

if ( !class_exists('cccYourClassName') )
// VERSUS
if ( !function_exists('ccc_your_function_name') )

经过短暂的查看/打印出来,我发现〜 1.700 内部功能和〜 1.400 个用户功能=〜 3.100 / 3.200 功能 VS. 〜 250 课。我想这最多关于需要多少查询。如果您在主题中调用了大约 50-100 个功能的!function_exists(''),只需设置一个计时器,然后开始做一些数学。即使不是 OOP,这是编写代码的好方法

1) 可重复使用 2) 可维护 3) 可交换 4) 更快

当您浏览在网络上浮动的不同类别,可以帮助您快速地进行元框,小工具等,那么使用 @toscho 所提到的控件,这是很好的,因为您只需将类插入并且只是替换控制器中的一些处理你的类的行。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。