Какова область применения require_once в PHP? - PullRequest
13 голосов
/ 21 апреля 2010

Простой вопрос: является ли область действия 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 дважды для одного и того же файла включения)

Я видел эту ветку раньше, но она не совсем отвечала на вопрос:

Должен require_once "some file.php"; появляются где-нибудь, кроме верхней части файла?

Спасибо за вашу помощь!

Ответы [ 3 ]

6 голосов
/ 21 апреля 2010

require_once() в основном полагается на физический файл, чтобы определить, был ли он включен. Таким образом, это не столько контекст, в который вы вызываете require_once(), это вопрос, требовался ли ранее этот физический файл.

В приведенном выше коде ваша функция foo() не будет повторно анализировать baz.php, поскольку это будет тот же файл, который был ранее включен вверху.

Однако вы получите другие результаты в зависимости от того, включили ли вы его в foo() или включили его сверху, так как область действия будет применяться, когда require_once() действительно удастся.

5 голосов
/ 21 апреля 2010

Это не так. Отслеживание 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.

3 голосов
/ 21 апреля 2010

Чтобы более конкретно ответить на ваш вопрос, во второй раз, когда вы позвоните require_once в этом файле, он ничего не будет делать, потому что он уже включен.

Если в вашем включении есть функции и т. Д., У вас все равно будут проблемы с включением его в функцию, поэтому область действия не имеет значения. Если это просто переменные, которые определяются или обрабатываются, то вы можете просто использовать require вместо require_once, если хотите, чтобы он снова был включен, переопределяя переменные в вашей области видимости.

...