2010-04-21 4 views
13

Простой вопрос: Является ли объем require_once глобальным?Какова область require_once в PHP?

Например:

<?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 два раза подряд для одного и того же файла include)?

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

Should require_once "some file.php" ; appear anywhere but the top of the file?

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

ответ

6

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

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

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

+0

Отлично - спасибо всем за ваши ответы! – TMG

2

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

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

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.