Содержимое файла 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.
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 выражения не было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.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей