web-dev-qa-db-ja.com

関数内にインクルードを使用する方法?

必要なときにだけロードしたい大きな関数があります。したがって、私はincludeを使用するのが道だと思います。しかし、いくつかのサポート関数も必要です-go_do_it()でのみ使用されます。

それらがインクルードされたファイルにある場合、再宣言エラーが発生します。例Aを参照してください

Include_onceにサポート関数を配置すると、正常に機能します。例Bを参照してください。

Func_1コードにinclude_onceを使用すると、2番目の呼び出しが失敗します。

Include_onceが2回目の呼び出しで関数を失敗させる理由について混乱しています。2回目にコードを「参照」しないようですが、ネストされた関数が存在する場合は「参照」します。

例A:

<?php
/*  main.php    */
go_do_it();
go_do_it();
function go_do_it(){
    include 'func_1.php';
}
?>

<?php
/*  func_1.php  */
echo '<br>Doing it';
nested_func()

function nested_func(){
    echo ' in nest';
}
?>

例B:

<?php
/*  main.php    */
go_do_it();
go_do_it();
function go_do_it(){
    include_once 'func_2.php';
    include 'func_1.php';
}
?>

<?php
/*  func_1.php  */
echo '<br> - doing it';
nested_func();
?>

<?php
/*  func_2.php  */
function nested_func(){
    echo ' in nest';
}
?>
17
Mahks

関数内でinclude()を使用する場合の問題は、次のとおりです。

include 'file1.php';

function include2() {
  include 'file2.php';
}

file1.phpはグローバルスコープになります。 file2.phpのスコープは、関数include2に対してローカルです。

現在、すべての関数のスコープはグローバルですが、変数はグローバルではありません。この混乱がinclude_onceであることは驚きではありません。あなたが本当にこの方法を使いたいのであれば-正直言って私はそうしません-古いC/C++プリプロセッサのトリックを借りる必要があるかもしれません:

if (!defined(FILE1_PHP)) {
  define(FILE1_PHP, true);

  // code here
}

遅延読み込み(ちなみにオペコードキャッシュの問題が発生する可能性があります)を使用したい場合は、代わりに自動読み込みを使用してください。

21
cletus

必要なときにだけロードしたい大きな関数があります。したがって、私はincludeを使用するのが道だと思います。

あなたの基本的な仮定は間違っています。この種の最適化は逆効果です。関数が数百行の長さであっても、PHPのパーサーから関数を非表示にすることに目立った利点はありません。 PHPファイルを解析するためのコストはごくわずかです。実際の注目に値する速度の向上は、より優れたアルゴリズムを見つけること、またはデータベースと通信するためのより優れた方法からもたらされます。

つまり、インクルードファイルに関数定義を含める必要があります。関数の本体をfunc_1.phpに移動するのではなく、全体関数をファイルに移動します。次に、必要な各ファイル内の関数を含むファイルをrequire_onceし、何回含めようとしても、そのファイルが1回だけ含まれていることを確認できます。

例:

file1.php

function test() {

}

index.php

require_once('file1.php');

include('table_of_contents.php');
test();
17
meagar

こんにちは私は問題を解決しました

//connect.php


$connect ="OK";

そして

include "connect.php";

show($connect);

function show($connect){


echo $connect;


}
1
amir hossieni