2012-01-03 6 views
0

PHPのネイティブ関数をオーバーライドすることは可能ですか?私の場合は、自分のフレームワーク内でのみempty()関数を無効にする方法を探しています。これは、__get()メソッドを無視するように見える自動生成データモデルと、__isset()が常に有効な結果をもたらすわけではないためです。フレームワーク内でのみネイティブPHP関数をオーバーライド

これは、複数のオートローダーを登録して、OOPの原則から継承されたメソッドを使用して構造を作成することができますか?私はフレームワークで動作するためにのみこれを必要とします。

+2

'empty()'は関数ではありません。それを上書きすることはできません。 – mario

答えて

2

あなたは、emptyを呼び出すか、あなたの問題のあるクラスに関していくつかの魔法を実行する関数を書くべきです。

それ以外の場合は、emptyで動作するようにクラスを修正しますが、最初に選択します。多くのPHP関数はあなたが望むものを正確に実行できません。したがって、もしもフレームワークが得られれば、私はそれらのほとんどをラップして、あなた自身の機能を追加する可能性が常にあります。

+0

私は '空($ foo-> bar)'が '__get($ p)'によってトリガされないというのは本当に私のせいではないでしょうか? 'これらの問題クラス'は正常に動作しますが、これは予想される動作です(http://php.net/manual/en/function.empty.php)。 2番目の注意を参照してください。 – Ben

+1

私はあなたのせいだと言っているわけではありません。代替案を提案しようとしています。あなたが言及した2番目の注釈は、 '__isset'マジックメソッドを実装しているようです。したがって、コア関数をオーバーライドする代わりに(おそらく、あなたのフレームワークと組み合わせて使用​​するライブラリを壊すかもしれません)、あなたもそれを試すことができます。 – GolezTrol

4

(離れてソースコードを修正することから)私はPHPの関数を再定義するのを認識しています唯一の方法は、runkitである - これは問題に正解する時間はかなり決してありますが。ただし、これはおそらくempty()では機能しません。なぜなら、これは言語構造であり、関数ではないからです。

+0

それはまたちょっと重いようですか? – Ben

+0

@BenFransen申し訳ありませんが、「重い」というのはどういう意味ですか?私はそれを持ち上げることはできませんが、それは私の手に関係しており、実際には重量よりむしろその厄介なコードを拾うことを拒否しているという事実... ;-) – DaveRandom

0

問題が正しく理解されている場合、empty($foo->bar)Foo::__get()をトリガーしていません。これは技術的に正しい動作です。$foo->barは存在しません。、もちろんそれは空です。あなたは探している振る舞いを得るためにいくつかの選択肢がありますが、それらのほとんどは独自の関数またはクラスメソッドを定義します。を使用します。Foo::__get()。例:

public function isEmpty($prop) { 
    $foo = $this->__get($prop); 
    return empty($foo); 
} 

希望するものがあります。

関連する問題