2009-07-13 5 views
8

今日は面白い問題を抱えていました。 Zend Frameworksのキャッシュ機能を利用するアプリケーションがあります。このアプリケーションへの要求は、一般的にcall_user_func_arrayとcall_user_func

$result = call_user_func_array(array("myclass", "factory"), array($id)); 

アイデアは我々が後でアクセスできるファクトリメソッドからオブジェクトを返すことです次の行を使用してファクトリメソッドを呼び出します。キャッシング機能を実装したとき、この呼び出しはまあまあです。エラーはなく、白い画面になります。エラーログには何もありません。 okの前に行を記録する際にエラーが発生する可能性がありますが、ファクトリメソッド内でerror_logを試行しても何も起こりません。

は興味深いことに、に行を変更:

$result = call_user_func(array("myclass", "factory"), $id); 

することは問題が修正されます。

バグレポートを調べるのに数時間を費やしてきましたが、この動作を説明するのにあまり時間がかかりませんでした。誰か思う?

+0

私のコードをすべて名前空間に変換している間に、この問題が最近気付きました。クラスは正常に存在し、インスタンスをインスタンス化できます。 しかし、私はインスタンスを取って_arrayを使ってメソッドを呼び出そうとすると何も起こりません。コードは続行されますが、メソッドは決して呼び出されないようです。 –

答えて

2

:-)作業の多くのthatsこのように、まだロードされていないクラスがPHPコマンドで呼び出されたときに、__autoloadが正しく起動しないようになった。私が知っている限り、黙々と試行錯誤する以外の戦略はありません。PHPコマンドの前にクラスを明示的に呼び出す行があなたのために解決するなら、試してみてください。

+0

私の理論では、call_user_func_arrayは、呼び出しをしようとすると少し不器用です(より良い用語がないため)。それらを比較する2つの機能のソースを見ることは興味深いでしょう。私はこの問題についてPHPにバグ報告を提出し、彼らの言うことを見ていきます。 – goose77

+0

'__autoload'を直接呼び出すか、少なくとも' class_exists'(2番目のパラメータが真で、デフォルトです)を呼び出すことは、オートローダーを起動するためのより安価な方法です。そうすれば、クラスのインスタンスをインスタンス化するメモリを浪費することはありません。 – jason

0

あなたはどのバージョンのPHPを使用していますか?ある時点でcall_user_func_arrayReflectionClassを組み合わせる際に問題がありました。私はそれがまだ固定されているかわからない。

+0

私たちは5.2.8を使用しています – goose77

+0

私が話している問題はそれより古いと確信しています。 – troelskn

0

segfaultingですか?あなたの 'root'のapacheログ(バーチャルホストの外)をチェックし、何が起こっているのかを見てください。そのスレッドがセグメンテーションしている場合は、PHPのメーリングリストやバグトラッカーでそのスレッドを解決したいかもしれません。

代わり

あなたは、PHPのデバッグ・コンパイルと、GDBに、シングルユーザーモードでHTTPを実行してみてください、あなたはそれをキャプチャすることができるかどうかを確認できますが、私は問題があった

+0

私はすべてのログを精査しました。そして、Apacheがsegfaultingしているという兆候はありません。 シングルユーザーモードでApacheをデバッグする時間があることを願っています。 – goose77

+1

待って...チェックしてください...それはsegfaultでした。 PHPをオフにします。 – goose77

+0

私は、クラスでオートロードを使用しているときに、PHPでsegfaultsをデバッグするのに苦労しました。基本的に、クラスが存在しない場合でもオートローダーをトリガーしない関数もありますが、致命的なエラーを投げず、無謀な放棄を続行する関数もあります。良い例は、まだ含まれていないクラス名を表す文字列でmethod_exists()を使うことです。== segfault。 – jason

関連する問題