2016-12-16 5 views
1

シナリオ私は非常に大きなphpファイルを持っています。それは、さまざまな機能への多数の呼び出しを持っています。 このファイルは、通常、「複雑な」MVC内で実行されるため、すべてのオブジェクト、メソッド、関数が他の場所で定義されています。PHP 7 CLI:定義されていない関数をスキップする方法はありますか?

PHP CLIから実行される、粗いPHPスクリプトを作成しています。このスクリプトは、この他のファイルを直接インクルードします。

私は、この場合にはにログインし、基本的な何かをする私の新しいスクリプト内の1つの特定の関数の呼び出し

example($string); 

私は(例を定義する)を除いて、ファイル内の何も気にしませんファイル。例えば私は単に、)(例の元の定義を見つけることが私の新しいコードを追加し、一例()は、あらゆる場所に呼ばれ、私は実際にはしたいされているので、通常通り全体のアプリケーションを実行することはできません

example($string){ 
    file_put_contents('file.txt', $string, FILE_APPEND); 
} 

この1つの特定のファイルを対象とします。

質問 未定義の関数に対してPHPを強制的に実行させる方法はありますか? try catchで他の関数のすべてのインスタンスをラップしたくありません(元のファイルはまったく変更しないでください)。私はset_exception_handlerと.iniの例外処理を変更する他の方法を試しましたが、これをカスタマイズすることはできますが、PHPはカスタム例外をスローするときにスクリプトの実行を停止します。

これは警告のみを生成しますので、現在、私は私のCLIスクリプト

function already_defined_function(){ 
     return null; 
    } 

にダミーの関数を作成しています。これは面倒で、たくさんのファイルを対象にしようとするとすぐに壊れます。

定義されていないすべてのメソッド/関数/クラスのインスタンス化を抑制する抽象的な方法があるかどうか不思議です。私は現在、それが不可能であると信じています。

[1094] => Array 
    (
     [0] => 319 
     [1] => example 
     [2] => 172 
    ) 

[1095] => (
[1096] => Array 
    (
     [0] => 323 
     [1] => 'example string parameter example' 
     [2] => 172 
    ) 

[1097] =>) 
[1098] => ; 

私はその後、この配列をループとは、関数呼び出しを再構成できます。私はこのような何かを得るためにトークナイザを使用して、テキスト/文字列としてPHPファイルをロードし、試してみました

。しかし、追加の引数や空白などのようなものが、「完全な」関数呼び出しを構成する配列項目の数を変更しようとしているかどうかはわかりません。

+0

ちょうど '関数の定義を含むファイルをinclude'ないのはなぜ? –

+0

スクリプト内でその関数定義を再定義しています。他の「不要な」機能を定義する他のファイルは、数百のファイルにまたがっています。 – baku

+1

だから、私にこの権利があるかどうかを見てみましょう。既存のものではなく、独自の 'example()'の定義を使いたいとします。はい。しかし、ファイルが定義されていない場合は、何が問題なのですか?他の関数と同じように 'function example(...){...}'を実行するだけで、エラーは発生しません。私はここで何が欠けていますか? –

答えて

0

PHP7では、ほとんどのエラーを捕まえることができます。

try { 
    undefinedfunc('Hello World'); 
} 
catch (Error $e) { 
    echo "Error caught\n"; 
} 
echo "Reached\n"; 

は、私はちょうどあなたがトライcatchブロックで、あなたの呼び出しをラップしたくないと言うが、私はそれが正しい方法はこのようなものを扱うようにと考えている:これは動作するはずです。

私は、このための良い代替がそうのように、あなた自身の発信者を書くことになると思う:

function call_and_catch_function($name, $arguments) { 
    try { 
     return call_user_func_array($name, $arguments); 
    } 
    catch (Error $e) { 
     // Do something 
    } 
} 
+0

私は元のアプリケーション/ファイルを変更していた場合、これを処理する正しい方法であると私は同意します。このシナリオのために、私ができないと仮定しましょう、それは実用的ではありません。 – baku

+0

もう少し追加しましたが、私は他の読者のためにここに残します。 – Devon

関連する問題