web-dev-qa-db-ja.com

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' ) );

2つ目のアプローチの利点(私の謙虚な目で):

  • 短い関数名
  • インスタンス変数へのアクセス(最大の利点IMO)
  • グローバル機能なし

デメリット:

  • クラス名はまだ競合を引き起こす可能性があります
  • 子テーマで「カスタマイズ」するのはそれほど明確ではありません(親クラスを拡張する必要があります)
  • ほとんどのテーマはこのようにはしていないので、あなたはトレンドに逆らうことになるでしょう

見逃しているかもしれませんが、なぜOOPのアプローチを取らないのでしょうか。どちらかと言えば、それは私にとって少し「きれい」に感じます。おそらく私は間違っていますか?

私はWordPressのテーマ開発が初めてなので、WPコミュニティでの一般的な知識であればご容赦ください。なぜ物事が彼らのやり方なのかを学ぼうとするだけです。

11
Andy Adams

カプセル化のためにクラスを使用することはプラグインのために多くの開発者によって非常に一般的なアプローチです。私はこれをします、そして私はそれをもっときれいにします。しかしプラグイン用です。テーマは本質的に手続き型です。

デフォルトのWordPressテーマには使用しません。エントリへの障壁が高まるためです。機能はとてもシンプルです。クラスに関連付けられているアクションを削除することは困難です(そして特定の状況では潜在的にバグがある可能性があります)。

また、デフォルトテーマのいくつかの機能はプラガブルです。クラスを拡張してメソッドを置き換えるのは、単に関数を定義するよりもはるかに複雑です。そして、コードの2つの異なる側面が異なる関数を置き換えることができますが、動的にクラスを拡張することはできません。ご指摘のとおり、親クラスを拡張する必要があることは間違いなく不利です。

私はTwenty Elevenのテーマオプションコードをクラスにすることを考えましたが、決してそれを回避しませんでした。そのような独立したプラグインのような機能は、カプセル化に適した候補のようです。

9
Andrew Nacin