2010-10-04 3 views
1

Я просто хочу, чтобы подтвердить то, как я понимаю, был потрясен тест я сделал на другом сервере, что я ожидал что-то работать, и это не так. Пожалуйста, смотрите вопрос в коде ниже.Включает и функции вызовов

<?php 

function xyz(){ 
} 

include("test.php"); 
/* 
* A function in the above include checks if the function abc function_exists(). 
* Will it return a true? What about for xyz? 
*/ 

function abc(){ 
} 

?> 

Спасибо всем

ответ

3

Вы можете думать о включает в себя, как копирование и вставка целого файла в котором include утверждение.
Так на самом деле, вы смотрите на:

function xyz(){ 
} 

var_dump(function_exists('xyz')); 
var_dump(function_exists('abc')); 

function abc(){ 
} 

Что и возвращает истину, как показано here (т.е. функции, определенные в сценарии доступны в любой точке).

См. Ответ nikic для исключений из этого.

+0

Спасибо, что подтвердили, вот как я это понял.Должно быть что-то не так с моим кодом на другом сервере, какая-то конфигурация ... Во всяком случае, эта проблема так же хороша, как и решена. :) – Abs

0

Сценарий разобранную сверху вниз. Поэтому, когда включен test.php, xyz будет существовать, но abc не будет. Whups, я думал о чем-то другом, но NullUserException прав. Все функции, которые находятся на загруженной странице, будут существовать в соответствии с function_exists().

+0

Что именно вы имеете в виду? – NullUserException

0

а существуют везде, где я проверяю о его существовании. Вероятно, это связано с тем, что PHP двигатель может разобрать код и создать все функции, прежде чем doint что-нибудь еще: это, наверное, читали все строки с «функцией Foobar()», а затем выполнить остальную часть кода

0

Похоже, что функция найдена как существующая, даже если она объявлена ​​после кода проверки.

<?php 

echo function_exists('abc').PHP_EOL; 
echo function_exists('xyz').PHP_EOL; 

function xyz(){ 
} 

function abc(){ 
} 

?> 

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

С уважением, Алинь

2

В PHP функция не должна быть объявлена ​​до ее использования или ссылки. Существует только одно исключение: если функция определена условно (в if заявлении) функция доступна только после того, как if заявление было выполнено. (Но это логично, потому что PHP не может знать, является ли if будет или не будет оценивать.)

Смотрите manual:

Функция не должна быть определена до они ссылаются, за исключением случаев, когда в функция условно определена как , показанная в двух примерах ниже.

Если функция определена в условным образом, например, в двух приведенных примерах . Его определение должно быть обработанным до вызова.

+0

Это не попадет в этот частный случай: 'if (function_exists ('xyz')) {', поскольку он делает вызов функции, которая существует с момента ее создания. – Abs

+0

Это будет работать;) Если вы ссылаетесь на функцию условно, это нормально. Только если вы * определите * функцию в условии ('if (false) {function fooBar() {}}'), это не сработает. – NikiC

Смежные вопросы