必要なときにだけロードしたい大きな関数があります。したがって、私は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';
}
?>
関数内で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
}
遅延読み込み(ちなみにオペコードキャッシュの問題が発生する可能性があります)を使用したい場合は、代わりに自動読み込みを使用してください。
必要なときにだけロードしたい大きな関数があります。したがって、私はincludeを使用するのが道だと思います。
あなたの基本的な仮定は間違っています。この種の最適化は逆効果です。関数が数百行の長さであっても、PHPのパーサーから関数を非表示にすることに目立った利点はありません。 PHPファイルを解析するためのコストはごくわずかです。実際の注目に値する速度の向上は、より優れたアルゴリズムを見つけること、またはデータベースと通信するためのより優れた方法からもたらされます。
つまり、インクルードファイルに関数定義を含める必要があります。関数の本体をfunc_1.php
に移動するのではなく、全体関数をファイルに移動します。次に、必要な各ファイル内の関数を含むファイルをrequire_once
し、何回含めようとしても、そのファイルが1回だけ含まれていることを確認できます。
例:
function test() {
}
require_once('file1.php');
include('table_of_contents.php');
test();
こんにちは私は問題を解決しました
//connect.php
$connect ="OK";
そして
include "connect.php";
show($connect);
function show($connect){
echo $connect;
}