Что возвращает include/require?

133
31 октября 2019, 05:30

Содержимое файла canChangeStatus.php:

<?php
return array (
    1 => [1,1,1,1,1,1,1,1,1],
    2 => [0,1,1,1,1,1,1,0,1],
    3 => [0,0,0,1,1,1,1,0,0],
    4 => [0,0,0,1,1,1,1,0,0],
);

Подключаю файл и вывожу $can:

$can = include_once ROOT.'/config/canChangeStatus.php';
var_dump($can);
// bool(true)

Почему тогда работает данная конструкция:

var_dump( $can[$userRights][$new-1]) //int(1) или int(0)

UPD Метод:

public static function checkCanUserChangeСurrentOnSelected ( int $userRights, int $new ) {
$can = include_once ROOT.'/config/canChangeStatus.php';
echo "Вызов метода checkCanUserChangeСurrentOnSelected <br>";
var_dump($can);
# Разрешено ли пользователю с данными правами поменять текущий статус на выбранный ( 1 = разрешено )
# -1 т.к. отсчёт массива начинается с нуля
if ( $can[$userRights][$new-1] === 0 ) throw new Exception(' К сожалению, вы не можете изменить текущий статус на выбранный! 11');
return true;
}

Вызов:

# Может ли сотрудник с данными ему правами менять текущий статус на выбранный
            self::checkCanUserChangeСurrentOnSelected ( $userGroup, $authorizations['statusId'] );

Вывод:

Вызов метода checkCanUserChangeСurrentOnSelected
<br>
bool(true)

Версия PHP 7.2.

Answer 1

include ведёт себя так:

include returns FALSE on failure and raises a warning. Successful includes, unless overridden by the included file, return 1. It is possible to execute a return statement inside an included file in order to terminate processing in that file and return to the script which called it. Also, it's possible to return values from included files. You can take the value of the include call as you would for a normal function.

В дополнение к этому у вас используется include_once:

This is a behavior similar to the include statement, with the only difference being that if the code from a file has already been included, it will not be included again, and include_once returns TRUE.

В вольном переводе картина следующая:

  • оба вернут FALSE и WARNING при ошибке
  • include_once вернёт TRUE если файл уже был подключен ранее. Это полностью объясняет наблюдаемое вами поведение. В текущем виде ваша функция checkCanUserChangeСurrentOnSelected может работать максимум один раз.
  • вернут значение из return выражения, если такое было встречено на уровне файла (как canChangeStatus.php в вопросе)
  • значение 1 если файл обработан, но return выражения не было
Answer 2

require и include вернут то, что вернёт скрипт, который они подключают. Но обратите внимание на _once. Это другая функция (хотя и очень похожая).

Скорее всего вы уже подключали свой скрипт раньше.

return.php:

<?php
return 'Hello';

main.php:

<?php
$foo = include_once __DIR__ . '/return.php';
var_dump($foo); // 'Hello'
$bar = include_once __DIR__ . '/return.php';
var_dump($bar); // true

Для скриптов, которые возвращают значение используйте require или include без _once.

READ ALSO
Как вытащить данные вложенного массива?

Как вытащить данные вложенного массива?

Посылаю в функцию массив, для дальнейшей обработкиВ этом массиве есть вложенные массивы

131
Opencart, добавить в опции тип слайдер (ползунок)

Opencart, добавить в опции тип слайдер (ползунок)

Стандартно в Opencart для выбора опций товара установлены переключатели, флажки, датаКак добавить к ним ползунок?

124
Формулы в PHPExcel

Формулы в PHPExcel

Возникла проблема с работой формул в PHPExcelФормулы записываются в значения ячейки, но чтобы вывело результат работы формулы, нужно нажать...

124