Включает () / require () с «побочными эффектами» плохую практику?

Делает что-то вроде

_________________________ //index.php ... require("header.php"); ... _________________________ _________________________ //header.php printHeader() function printHeader(){ echo 'something'; ... } _________________________ 

считается плохой практикой, чтобы избежать?

Я лично считаю, что выполнение вызова require() (или require_once() или include() , а это не тот) должен только добавить ссылку на другие функции / объекты и никогда ничего не выполнять самостоятельно. Другими словами, по моему мнению, требование должно вести себя очень похоже на импорт / использование других языков оо.

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

Да, ИМХО это (очень) плохая практика, если она не была явно задокументирована .

include или require (и их эквиваленты на других языках), как правило, должны вводить новые функции в текущую область действия и никогда не запускать их вызов.

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

Например, если вы используете PHP в качестве замены для серверной части, это довольно распространенное явление, которое включает в себя в основном HTML с некоторыми фрагментами PHP. С этим были построены великолепные объекты. Нет ничего плохого в таком дизайне в реальном мире.

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

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

 /** * include a file with it's own local scope. * * @param string path to include file * @param array (optional) variables, keyed with variable name. * @return mixed return value of include */ function include_helper() { if (!func_num_args()) { return NULL; } elseif (2 === func_num_args() && is_array(func_get_arg(1))) { extract(func_get_arg(1)); } return include(func_get_arg(0)); } 

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