functions.phpでグローバル関数の代わりにクラスを使用する


11

私が見た多くのテーマ(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コミュニティの一般的な知識であるかどうかはご容赦ください:)。なぜ物事がそうであるのかを理解しようとするだけです。


Kovsheninからテーマを確認できます- 彼はfunctions.phpでOOPアプローチを使用しているwordpress.org/extend/themes/profile/kovshenin
Mamaduka

回答:


9

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

デフォルトのWordPressテーマについては、エントリーの障壁が高くなるため、これを行いません。関数は非常に単純です。クラスに関連付けられているアクションを削除するのは難しい場合があります(特定の状況ではバグが発生する可能性があります)。

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

Twenty Elevenのテーマオプションをクラスにコード化することを検討しましたが、回避できませんでした。この種の別個のプラグインのような機能は、カプセル化の良い候補のようです。


答えをありがとう、ナシン。クラスでのアクションの「解除」の難しさについては考えていませんでした。オプションのカプセル化について-同じことを考えてきました:github.com/jestro/struts
Andy Adams
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.