2012-01-11 4 views
2

私は、PHPの組み込み関数call_user_func_arrayを大量に使用する従来のコードベースを使用しています。私は(5.2からのアップグレード)それはPHP 5.3で動作するように取得しようとしているが、(「非配列を渡す」の項で)ここに記載されている問題に実行した:一言で言えば組み込みのPHP関数を拡張することはできますか?

http://sixohthree.com/1486/migrating-to-php-5-3-call_user_func_array

問題は、PHPのバージョン5.2と5.3の間で、この関数の実行は基本的に何もしないように変更され、2番目のパラメータが適切な配列/オブジェクト/連想配列でない場合はNULLを返します。 5.2ではこれをしませんでした。そのため、私が扱っているコードベースでは、正しい型のパラメータを渡すように努力していません。これは問題を引き起こします。

これを修正するには、ブログ投稿の指示に従い、コードベースですべてのcall_user_func_arrayコールを呼び出してパッチを当てることができますが、それは非常に面倒です。あるいは、PHPに組み込まれたoverride_function APIコールがあり、組み込み関数をオーバーライドするために使用できることに気付きました。それは便利ですが、私がやりたいことは組み込み関数を拡張するようなものです。 old_call_user_func_arrayはビルトインcall_user_func_array関数である...

function call_user_func_array($method, $params) { 
    $params = is_array($params) ? $params : array($params); 
    return old_call_user_func_array($method, $params); 
} 

は、理想的には私が好きなものをざっとようなものでcall_user_func_arrayの実装を置き換えることができるようにすることです。

これは可能ですか?あれば、どうですか?

+2

コードは文書化されたAPIに準拠していないため、本質的に壊れているので、パッチの上にパッチを重ねるのではなく、いつでもその関数のすべてのインスタンスをいつでも修正する必要があります。とにかく、一時的な回避策が必要な場合がありますので、+1してください。 :) – deceze

+0

おそらく@stackoverflow.com/questions/4725194/php-override-existing-function – Nazariy

+1

の複製@Nazariy - そのスレッドは古い関数を保持することを扱っていません。OPの質問をよく読んでください。 –

答えて

5

あなたはoverride_functionがインストールされている場合、あなたはすでにそれを持っている必要がありますので、APDの延長でもあるrename_functionを使用することができます。

rename_function('call_user_func_array', 'old_user_func_array'); 

function call_user_func_array($method, $params) { 
    $params = is_array($params) ? $params : array($params); 
    old_call_user_func_array($method, $params); 
} 
+0

ありがとう、これはうまくいきましたが、私は、オーバーライドする関数の名前として元の関数名を渡して、 'override_function()'の呼び出しを使って新しい関数定義を指定しなければならないことが分かりました。 – aroth

1

こんにちは、あなたの質問は、実際には、オンラインのPHPドキュメントの3番目または4番目のコメントの投稿で答えられます。コメント欄には非常に便利な情報や例があります(間違いがあるかもしれません)。

... rename_functionを使用すると、元の関数の名前を3番目の名前に変更し、次にOVERRIDING関数の3番目の名前を呼び出すと、目的の効果が得られます。

rename_function( 'strlen'、 'new_strlen');

override_function( 'strlen'、 '$ string'、 'return override_strlen($ string);');

override_strlen機能($文字列){ リターンnew_strlen($文字列);}

0

か、名前空間でコードを置くことができます。

namespace Phpoverride 
{ 
    function call_user_func_array($method, $params) { 
     return \call_user_func_array($method, $params); 
    } 
} 

http://php.net/namespaces

+0

それは本当に問題を解決しません... – deceze