置き換えは可能で(monkeypatch)機能PHP?
-
22-08-2019 - |
質問
することができPythonが可能でにPHP?
>>> def a(): print 1
...
>>> def a(): print 2
...
>>> a()
2
例えば:
<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
解決
この ビット 遅いきたいと思いると指摘していてPHP5.3で実際にできるオーバーライド内部の機能を使用せずにPHPいます。
フレキシビリティができる再定義内のPHP関数内の名前空間.でこの考え方に基づいてPHPは名前解決のための機能:
内の名前空間となりB)との通話を無資格の機能を解決する。ここではどのように呼び出機能foo()が解決:
- そのための機能から、現在の名前空間:A B\foo().
- を楽しくすることや、グローバル関数foo()
他のヒント
いいえ、それはこれを行うことはできません。
manual
するます:
PHPは関数のオーバーロードをサポートしていません。また、未定義または以前に宣言された関数を再定義することが可能です。
ただし、 runkit_function_redefine
とそのいとこを使用することができますが、それは...間違いなく非常にエレガントではありません。
また、このような何かをするために create_function
を使用することができます。
<?php
$func = create_function('$a,$b','return $a + $b;');
echo $func(3,5); // 8
$func = create_function('$a,$b','return $a * $b;');
echo $func(3,5); // 15
?>
は、runkitと同じように、それは非常にエレガントではありませんが、それはあなたが探している動作を提供します。
私はこの質問は少し古いですが実現するが、パッチワークのrecently-ですユーザー定義関数の再定義をサポートしてPHP 5.3のプロジェクトを発表しました。著者は言及していますが、あなたはは、runkit に頼る必要があります。 A>やのphp-テストヘルパーはサルにを-patchコア/ライブラリ関数ます。
、パッチワークは良い解決策です。
ここでは、それがどのように機能するかについての記事です: http://phpmyweb.net/2012/ 4月26日/ライト・素晴らしい・プラグインシステム・イン・PHP / の
これは、いくつかのサンプルコードが付属しています。私は彼がevalの() 'Dコードとは異なり、パッチワークを使用しないためphpmywebバージョンは、わずかに優れたコードを使用していますね。 evalのを()を使用するときは、オペコードをキャッシュすることができます。
受け入れ答えは優秀です!私はちょうどあなたが名前空間ブラケットと、デフォルトであなたのコードを置くことができることを、追加しますGLOBAL-SPACEがresettedされます。
いくつかの他の方法:
1) rename_function($ OLD_NAME、$ NEW_NAME)の
2) override_function($ OLD_NAME、$パラメータは、$ new_func)
とほとんど使用しない:の