web-dev-qa-db-ja.com

PHP関数内に含める/必要とする

非常に大きな関数があり、ページが読み込まれるたびに読み込まれる場合は、関数スクリプトのサイズを最小限に抑えるためにfunction foo(){ include(.../file_with_function's_code); return; }を記述したほうがよいでしょうか。または、関数がロードされると(実行されない)、インクルードに含まれていてもコンテンツもロードされるため、問題ではありませんか?ありがとうございました。

(編集:私の質問はそれが可能かどうかについてではありません)

15
Albatrosz

@Luceosの回答は技術的には正しい(最良の種類の正しい)が、あなたが尋ねた質問には答えません。つまり、これをより良くしているのでしょうか、それとも関数呼び出しに関係なくインクルードが発生するのでしょうか。

私はこれを最も基本的な方法でテストしました(OP、なぜあなたはしませんでしたか?):

_<?php
echo "Testing...";

function doThing() {
    include nonExistantFile.php;
}
//doThing();
echo "Done testing.";
_

結果:

doThing();を呼び出すと、ファイルが見つかりませんという警告が表示されます。

doThing();...をコメントアウトしてもエラーはありません!したがって、これを行うことでファイルのロード時間を節約できます。

21
Digital Chris

または、優れた代替手段として、関数をクラスにカプセル化し、 ___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_はファイルをロードしますが、その前はロードしません。

11
davidkonrad

はい、それは可能です。参照 http://www.php.net/manual/en/function.include.php

インクルードが呼び出し元ファイル内の関数内で発生した場合、呼び出されたファイルに含まれるすべてのコードは、その関数内で定義されているかのように動作します。したがって、その関数の変数スコープに従います。

問題は、含まれているファイルに周囲の関数定義を追加してみませんか。関数内に含める唯一の実行可能な理由は、その関数内のコードをビットに分割することだと思います。

4
Luceos

Luceos 'と Albatrosz の両方が誤読される可能性があるので、これらを明確にする必要があると感じました。

includeディレクティブのセットは、runtimeZEND_INCLUDE_OR_EVAL参照ファイルをコンパイルするためにZendコンパイラを呼び出す操作。したがって、一般的に、は、次のように、関数にincludeステートメントを埋め込むべきではありません

  • インクルードは、関数が呼び出されたときにコードパスが取得されるたびに実行されます。同じビットのコードを何百回もコンパイルするのは悪い考えです。

  • コードにグローバルスコープの要素(関数やクラスの宣言など)が含まれている場合、その宣言を2回実行するとコンパイラエラーが発生します。

したがって、何をしているのかわからない限り、しないでください。そのような使用技術は、Albatroszによって記述されたものです。ちなみに、彼の__autoload()関数は、これが有効な例外の一種の例にすぎません。

2
TerryE