PSR-1 2.3 Пример правила побочных эффектов

Следуя этому другому вопросу.

В Руководстве PSR-1 правило раздела 2.3 "Побочные эффекты" запрещает использование include и объявление функций в том же файле, например:

<?php
// side effect: loads a file
include "file.php";

// declaration
function foo()
{
    // function body
}

Но можете ли вы include сделать файл внутри функции?

e.g.

<?php
// declaration
function foo()
{
    // side effect: loads a file
    include "file.php";
}

person icc97    schedule 26.09.2014    source источник
comment
Да, вы можете, но вы можете использовать его только в этом методе.   -  person Vincent Beltman    schedule 26.09.2014
comment
Согласно описанию, правило основано на файлах, а не на функциях. -a файл- не должен иметь побочного эффекта. Насколько я понимаю, ваш второй пример кода использовать не следует. Кодирование ООП полностью избегает этого, потому что у вас нет никаких включений вне автозагрузчика.   -  person Daniel W.    schedule 26.09.2014
comment
Вот тут и возникает мое замешательство - первый комментарий говорит, что все в порядке, второй комментарий говорит, что это не так.   -  person icc97    schedule 26.09.2014
comment
@icc97 Просто отдельное объявление функции и включает. include(config file); секунда include(function declarations file)...   -  person Daniel W.    schedule 26.09.2014


Ответы (2)


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

require_once 'utility_functions.php';

Вы включаете этот файл, потому что хотите использовать некоторую служебную функцию, которая находится в этом файле. Вам необходимо включить этот файл, чтобы использовать любую функцию в нем, вы не можете не включать этот файл. Однако, если этот файл срабатывает и вызывает некоторые побочные эффекты, просто потому, что вы его включили, вы только что попали в глубокую кроличью нору. Например, предположим, что файл всегда изменял ваши настройки отчетов об ошибках. Это будет сильно раздражать. Вам всегда придется сбрасывать отчет об ошибках каждый раз, когда вы включаете этот файл:

require_once 'utility_functions.php';
error_reporting(E_ALL);
ini_set('error_display', false);

Это явное безумие и источник потенциальных проблем.

С другой стороны, когда вы выполняете код, вы ожидаете, что выполнение кода что-то сделает, возможно, даже побочный эффект. И вы можете управлять выполнением кода, в отличие от того, что делает файл, просто будучи включенным.

require_once 'utility_functions.php';

utility_do_something(); // side effects here are OK and/or expected
person deceze♦    schedule 26.09.2014
comment
Я ссылался на этот ответ и следуя вашему веб-сайту, я только что заметил ваш Kunstube-Router и, в частности, RouteFactory.php. Это содержит require ...; class RouteFactory{...} - я делал что-то подобное довольно много раз. Но насколько я могу судить, это нарушает правило «побочное влияние». Правильный? - person icc97; 20.10.2014
comment
Ну да, в этом смысле эта библиотека не совсем совместима с PSR. В то время я не хотел диктовать использование автозагрузчика, и я еще не дошел до его обновления. - person deceze♦; 21.10.2014
comment
Хорошо, отлично, по крайней мере, я лучше понимаю, что соответствует / не соответствует :) - person icc97; 21.10.2014

Да, вы можете использовать include внутри функции.

Что касается этого правила, вы можете делать все, что хотите, пока внутри функции. Простое выполнение или включение файла, объявляющего функцию, не запускает код внутри функции. Функция будет работать только в том случае, если к ней есть вызов в каком-то другом файле.

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

person bdsl    schedule 18.05.2018