PHP - Как я могу проверить, назвали ли возврат () от включения () 'd файлом?

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

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);

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

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

5
задан John Himmelman 29 March 2010 в 18:10
поделиться

5 ответов

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

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

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

2
ответ дан 15 December 2019 в 00:56
поделиться

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

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

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

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

1
ответ дан 15 December 2019 в 00:56
поделиться

$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
ответ дан 15 December 2019 в 00:56
поделиться

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

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

1
ответ дан 15 December 2019 в 00:56
поделиться

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

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

0
ответ дан 15 December 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: