質問

することができ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()が解決:

  1. そのための機能から、現在の名前空間:A B\foo().
  2. を楽しくすることや、グローバル関数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 のphp-テストヘルパーはサルにを-patchコア/ライブラリ関数ます。

jmikolaが述べたように、あなたが関数にコードを追加したい場合は、

、パッチワークは良い解決策です。

ここでは、それがどのように機能するかについての記事です: 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)

とほとんど使用しない:

3) runkit_function_rename(...)

4) runkit_function_redefine(...)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top