14

簡単な質問:範囲はrequire_onceグローバルですか?

例えば:

<?PHP

require_once('baz.php');

// do some stuff
foo ($bar);

function foo($bar) {
    require_once('baz.php');
    // do different stuff
}

?>

fooが呼び出されると、baz.phpを再解析しますか?または、メインのphpファイルからすでに必要なファイルに依存していますか(同じインクルードファイルに対してrequire_onceを2回連続して呼び出すのと同じです)?

私は以前にこのスレッドを見ましたが、それは質問に完全には答えませんでした:

require_once "some file.php"; ファイルの先頭以外の場所に表示されますか?

ご協力いただきありがとうございます!

4

4 に答える 4

7

require_once()基本的に、物理ファイルに依存して、ファイルが含まれているかどうかを判断します。つまり、呼び出しているコンテキストではrequire_once()なく、その物理ファイルが以前に必要であったかどうかです。

上記のコードでは、関数は以前に上部に含まれていたものと同じファイルになるため、foo()再解析されません。baz.php

foo()ただし、スコープがrequire_once()成功したときに適用されるため、内部に含めたか、上部に含めたかによって、異なる結果が得られます。

于 2010-04-21T00:37:27.283 に答える
5

そうではありません。require_onceの追跡は内部関数に適用されます。ただし、次のスクリプトはエラーを生成します。

a.php

<?php
require_once('b.php');
function f() { require_once('b.php'); echo "inside function f;"; }
?>

b.php

<?php
f();
?>

関数f()はに事前定義されていないためb.phpです。

于 2010-04-21T00:58:04.900 に答える
3

より具体的にあなたの質問に答えるために、あなたrequire_onceがそのファイルを二度目に呼び出すとき、それはすでに含まれているので、それは何もしません。

インクルードに関数などが含まれている場合は、とにかく関数内にインクルードする際に問題が発生するため、スコープは関係ありません。定義または処理されている変数だけの場合は、再度含める場合requireの代わりに使用して、スコープ内の変数を再定義できます。require_once

于 2010-04-21T00:42:03.603 に答える
0

少なくともPHP7.3では、require_onceグローバルスコープがあります。
そうでない場合は、両方ともx.php、次のようz.phpにエラーをスローする必要y.phpがあります。

a.php

<?php function a() { require_once 'b.php'; b(); }

b.php

<?php function b() { debug_print_backtrace(); }

x.php

<?php
require_once 'a.php';
a();
b();

->

#0 c() called at [/var/www/b.php:2]  
#1 b() called at [/var/www/a.php:3]  
#0 c() called at [/var/www/a.php:4]  

y.php

<?php
require_once 'a.php';
b();

->致命的なエラー:キャッチされないエラー:3行目の/var/www/y.phpにある未定義の関数b()を呼び出します

z.php

<?php
require_once 'a.php';
require_once 'b.php';
b();

->

#0 b() called at [/var/www/z.php:4]
于 2019-11-21T02:03:11.010 に答える