これは 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
これは 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
いいえ、期待どおりにこれを行うことはできません。
から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 と同様に、あまりエレガントではありませんが、探している動作が得られます。
この質問は少し古いと思いますが、Patchworkは最近リリースされた PHP 5.3 プロジェクトであり、ユーザー定義関数の再定義をサポートしています。ただし、著者が言及しているように、コア/ライブラリ関数にモンキー パッチを適用するには、 runkitまたはphp-test-helpersに頼る必要があります。
jmikola が述べたように、関数にコードを追加したい場合、Patchwork は優れたソリューションです。
これがどのように機能するかについての記事は次のとおりです: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/
いくつかのサンプルコードが付属しています。phpmyweb バージョンは、パッチワークとは異なり、eval() されたコードを使用していないため、わずかに優れたコードを使用していると思います。eval() を使用すると、オペコードをキャッシュできます。