2010-03-29 1 views
5

Как узнать, вызван ли return() из включенного файла. Проблема в том, что include() возвращает 'int 1', даже если return() не был вызван. Вот пример ...PHP - Как я могу проверить, был вызван return() из файла include() 'd?

included_file_1.php

<?php 

return 1; 

included_file_2.php

<?php 

echo 'no return here, meep'; 

main.php

<?php 

$ret = include('included_file_1.php'); 

// This file DID return a value, int 1, but include() returns this value even if return() wasn't called in the included file. 
if ($ret === 1) 
{ 
    echo 'file did not return anything'; 
} 

var_dump($ret); 

$ret = include('included_file_2.php'); 

// The included file DID NOT return a value, but include() returns 'int 1' 
if ($ret === 1) 
{ 
    echo 'file did not return anything'; 
} 

var_dump($ret); 

Редактировать: Как временное решение, я получаю вывод от include() (от операторов echo/print). Если какой-либо вывод был произведен, я игнорирую возвращаемое значение из include().

Не очень, но он обеспечивает функциональность, которая мне нужна в моем веб-приложении/каркасе.

ответ

2

Хороший вопрос. Глядя на примеры в manual, я думаю, вы не можете.

Лучшая обходная идея, которая приходит на ум, состоит в том, чтобы все ваши включенные в проект проекты не возвращали голые значения, а массив, содержащий возвращаемое значение (return array(1);).

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

0

Если во включенном файле ничего не вернуть, функция включения возвращает по умолчанию. В противном случае он вернет все, что отправляется включенным файлом. Операторы Echo и print не являются возвратом, это должен быть оператор return, назначенный PHP. Все остальное будет обрабатываться нормально. Этот код в основном говорит: «Правильно ли файл выполнялся?» и он возвращается 1, «да, да».

PHP: include - Manual - Взгляните на «Обращение с возвратом» прямо под предупреждающими сообщениями безопасности, а затем посмотрите пример 5 и текст, расположенный под ним. Это прекрасно объясняет.

+0

Да, но если скрипт включен, include() вернет значение, переданное в return() во включенном файле OR 'int 1', чтобы указать успешное включение. Итак, когда include() возвращает 'int 1', я не могу определить, является ли это возвращаемым значением из включенного файла или include(). –

+0

Глупости. Если вы ЗНАЕТЕ, что файл возвращает свое значение, вы можете предположить, что это значение, которое вы хотели бы вернуть. Include никогда не будет переопределять возвращаемое значение, чтобы отправить 1, который он завершил. Речь идет о том, что вы точно знаете, что делают ваши файлы и какие значения выходят из них. Если вы знаете, что ваш файл ничего не возвращает, значение всегда должно быть 1. – animuson

+0

Animuson: Да, но я не знаю, что делают файлы других народов. Также будут случаи кросс, которые будут всплывать, что нарушит структуру, и станет лавочкой для отладки других. –

1

Такое поведение является дизайн - include оператор возвращает 1, когда включают успешна (или значение return «ред включаемого файла), а выполнение сценария может продолжаться даже если include терпит неудачу, и программист может что проверить для этого случая.

Из инструкции:

[возвращаемое значение] является 1, поскольку включают успешно. Обратите внимание на разницу между приведенными выше примерами. Первый использует return() в файле , а другой - нет. Если файл не может быть включен, возвращается FALSE, а E_WARNING - .

В этом случае, просто не использовать 1 в коде в качестве возвращаемого значения для файла, то есть, это возвращаемое значение эффективна зарезервированное для использования заявления PHP include.

+0

Это воняет, тогда я не смогу изящно обрабатывать вывод :(Я полагаю, что единственной альтернативой является проверка, если include() произвел любой вывод (эхо/печать). Если это так, то я проигнорирую возвращаемое значение. –

0

$ ret = include ('...'); Всегда будет возвращать 1, если файл существует.

Попробуйте создать переменную и установите флажок.

include_file_1.php

<?php 
$includeFile1 = true; 

main.php

<?php 
include('included_file_1.php'); 

if (isset($includeFile1) == true) 
{ 
    echo "It was included"; 
} 
1

Вы могли бы использовать debug_backtrace(), но это на самом деле не является идеальным решением. Это медленно, и вам нужно будет много работать, чтобы получить нужные вам результаты.

К сожалению, описанная вами ситуация выходит за рамки обычного использования include и return. Я бы просто изменил вашу логику, чтобы работать с ней. Почему бы не иметь файлы, которые обычно не звонят return в конце, просто позвоните return 2? Таким образом, вы получите значение, которое по-прежнему оценивается как true при нормальных сравнениях, но вы можете использовать его как различие между другими вызовами return 1.

+0

Отличная идея с 'debug_backtrace' - не думала об этом.Тем не менее, я не думаю, что это сработает, так как включенный файл не оставит никаких следов (без каламбура) в backtrace при вызове после включения. –

+0

Zombat: Большой совет, но я debug_backtrace() пропускает include(), а не в. Но я мог бы использовать eval() для выполнения кода с добавленным debug_backtrace(). Но этот подход слишком запутан и может привести к другим, более трудным для отладки, кромкам. Печальный день :(. –

0

Никогда не нужно, и никогда не знал, что вы могли бы, но я мог бы использовать это в конце каждого включенного сценария:

return __FILE__; 

или:

return basename(__FILE__); 

или, если вам не нужно эта специфика, используйте 2, как было предложено ранее.

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

  • Нет связанных вопросов^_^