PHP - Как я могу проверить, вызывается ли return () из файла include ()? - PullRequest
5 голосов
/ 29 марта 2010

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

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 ().

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

Ответы [ 6 ]

2 голосов
/ 29 марта 2010

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

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

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

1 голос
/ 29 марта 2010

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

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

1 голос
/ 29 марта 2010

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

Из руководства:

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

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

0 голосов
/ 18 февраля 2012

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

return __FILE__; 

или

return basename(__FILE__);

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

0 голосов
/ 29 марта 2010

$ 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";
}
0 голосов
/ 29 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...