非常に大きな関数があり、ページが読み込まれるたびに読み込まれる場合は、関数スクリプトのサイズを最小限に抑えるためにfunction foo(){ include(.../file_with_function's_code); return; }
を記述したほうがよいでしょうか。または、関数がロードされると(実行されない)、インクルードに含まれていてもコンテンツもロードされるため、問題ではありませんか?ありがとうございました。
(編集:私の質問はそれが可能かどうかについてではありません)
@Luceosの回答は技術的には正しい(最良の種類の正しい)が、あなたが尋ねた質問には答えません。つまり、これをより良くしているのでしょうか、それとも関数呼び出しに関係なくインクルードが発生するのでしょうか。
私はこれを最も基本的な方法でテストしました(OP、なぜあなたはしませんでしたか?):
_<?php
echo "Testing...";
function doThing() {
include nonExistantFile.php;
}
//doThing();
echo "Done testing.";
_
結果:
doThing();
を呼び出すと、ファイルが見つかりませんという警告が表示されます。
doThing();
...をコメントアウトしてもエラーはありません!したがって、これを行うことでファイルのロード時間を節約できます。
または、優れた代替手段として、関数をクラスにカプセル化し、 ___autoload
_ を利用します。
_function __autoload($class_name) {
include $class_name . '.php';
}
_
myBigFunction()
をクラスにカプセル化する
_class myBigFunction {
public static function run() {
//the old code goes here
}
}
_
_myBigFunction.php
_として保存します
クラスの静的メソッドとして関数を呼び出す場合:
_myBigFunction::run()
_
___autoload
_はファイルをロードしますが、その前はロードしません。
はい、それは可能です。参照 http://www.php.net/manual/en/function.include.php
インクルードが呼び出し元ファイル内の関数内で発生した場合、呼び出されたファイルに含まれるすべてのコードは、その関数内で定義されているかのように動作します。したがって、その関数の変数スコープに従います。
問題は、含まれているファイルに周囲の関数定義を追加してみませんか。関数内に含める唯一の実行可能な理由は、その関数内のコードをビットに分割することだと思います。
Luceos 'と Albatrosz の両方が誤読される可能性があるので、これらを明確にする必要があると感じました。
includeディレクティブのセットは、runtimeZEND_INCLUDE_OR_EVAL参照ファイルをコンパイルするためにZendコンパイラを呼び出す操作。したがって、一般的に、は、次のように、関数にincludeステートメントを埋め込むべきではありません。
インクルードは、関数が呼び出されたときにコードパスが取得されるたびに実行されます。同じビットのコードを何百回もコンパイルするのは悪い考えです。
コードにグローバルスコープの要素(関数やクラスの宣言など)が含まれている場合、その宣言を2回実行するとコンパイラエラーが発生します。
したがって、何をしているのかわからない限り、しないでください。そのような使用技術は、Albatroszによって記述されたものです。ちなみに、彼の__autoload()
関数は、これが有効な例外の一種の例にすぎません。