1

WordPress CMS の通常のインストールは、何百ものスクリプト、プラグイン、およびテーマで構成されています。この概念により、スクリプトのコピーを作成し、変更されたバージョンを適切なディレクトリに配置するだけで、スクリプトを置き換えることができます。ただし、スクリプトまたはプラグインの新しいバージョンがインストールされても、コピーされたスクリプトは更新されません。スクリプト内には、多くの場合、何百もの関数があります。1 つの関数を変更すると、他の関数も更新されなくなります。多くの場合、特定の機能を追加または抑制するには、Wordpress のフックとフィルターで十分ですが、常にそうとは限りません。

更新プログラムがインストールされるたびに元のスクリプトが CMS によって置き換えられるように、関数を再宣言またはオーバーロードする方法を探しています。私はこれを試しました:

rename_function( 'wp_function' , 'old_wp_funtion )

function wp_function(){
        // things to do before the function
    $a = $b;
        // call the old function
    $result = old_wp_function();
        // things to do afterwards
    $b = $c;

    return $result;
}

しかし、うまくいきません。また、Wordpress では、アスペクトする引数の種類と数がわかりません。オーバーロードされた関数もそれに対処する必要があります。

私の質問は次のとおりです。これをどのように実行して、任意の数と任意のタイプの引数を使用して、すべての場合に機能させるか。また、元の関数/スクリプトを変更する必要はありません。元の関数/スクリプトは、Wordpress の更新によって上書きされる可能性があり、上書きされる必要があるためです。

4

1 に答える 1

1

PHP は、一度宣言された関数の再定義を標準でサポートしていません。これを強制する方法はいくつかありますが、一般的には、プログラミングの実践方法が非常に貧弱であると考えられており、強くお勧めできません。

PHP でコードをオーバーロードしたい場合は、クラスを簡単に拡張してメソッドをオーバーロードできるため、単純な関数ではなくクラスでコードを記述した方がはるかに優れています。これはあなたにとって断然最良の選択肢です。コードを少し手直しする必要があるかもしれませんが、とにかくクラスでコードを書くことをお勧めします。そのため、コードの品質を向上させるチャンスと考えてください。

もう 1 つのオプションは、名前空間を使用することです。PHP 5.3 以降では名前空間がサポートされています。つまり、同じ関数名を複数回宣言できますが、異なる名前空間で宣言できます。コードで現在名前空間を使用していない場合、実装にはかなりの量の作業が必要になる可能性がありますが、必要なことを実行できるようになる可能性があります。しかし、前に述べたクラスオプションの方が良いと思います。

rename_function()ここで使用しようとしている関数への具体的な参照: ADP と呼ばれる非標準のデバッガー拡張機能の一部です。これは開発者用のデバッガーであるため、本番システムでは使用しないでください。

やりたいようにやろうと決心した場合は、試してみることができる他のオプションとして、Runkit 拡張機能を含めることができます。これは、まさにあなたが求めている種類の考え方を可能にするように明示的に設計されています。繰り返しますが、これは開発者のみを対象としており、本番環境での使用は推奨されていません。

もう 1 つのオプションは、Patchwork ライブラリです。これは、純粋な PHP コードです (つまり、PHP 拡張機能をインストールする必要はありません)。これにより、はるかに魅力的なソリューションになります。しかし、繰り返しになりますが、著者は、開発環境以外で使用しないことを明示的に推奨しています。

いくつかのオプションがあります。説明したルートを進む必要がある場合は、Patchwork ライブラリを使用することをお勧めします。

しかし、あなたが求めているのは良い考えではないことをもう一度言います。大きな手がかりは、他の誰もこのようにやっているわけではなく、同様のことをしている人はあらゆる機会にそうすべきだと言っているということです。本番環境では使用できません。

便利なツールと見なされる唯一のケースは、回避できない依存関係があるテスト スクリプトを作成する場合です。依存関係をモックまたはスタブに再定義すると、そうでなければテストできないコードの単体テストを作成できるようになります。

しかしそれとは別に、PHP の世界からの一貫したメッセージは次のとおりです。関数を再定義しないでください。

于 2013-02-21T10:41:57.273 に答える