Php 将include()/require()与;副作用“;坏习惯?

Php 将include()/require()与;副作用“;坏习惯?,php,Php,他在做什么 _________________________ //index.php ... require("header.php"); ... _________________________ _________________________ //header.php printHeader() function printHeader(){ echo 'something'; ... } _________________________ 被认为是要避免的坏习惯

他在做什么

_________________________
//index.php
...
require("header.php");
...
_________________________

_________________________
//header.php
printHeader()

function printHeader(){
    echo 'something';
    ...
}
_________________________
被认为是要避免的坏习惯

我个人认为执行
require()
(或
require\u once()
include()
,这不是重点)调用应该只添加到其他函数/对象的“链接”,而决不单独执行任何操作。换句话说,我认为require的行为应该与其他oo语言的导入/使用非常相似

我上面写的例子很简单,但很明显,我写的也是针对各种“副作用”的。define函数或会话中的一些技巧是我在一些包含的文件中经常发现的其他滥用。

是的,除非有非常明确的文档记录,否则这(非常)不好


include
require
(以及其他语言中的等价物)通常只应将新函数引入当前范围,而不会触发它们的调用。

这是一个一般设计问题,而不是个人偏好。如果你能根据个人喜好进行设计,那么这就是你的个人喜好。做你喜欢做的事,将语言作为工具使用

例如,如果您使用PHP替换服务器端的Include,很常见的情况是Include主要包含HTML和一些PHP片段。伟大的网站是用这个建造的。在现实世界中,这种设计没有什么不好的

然而,如果您需要更细粒度的控制,您主要是指对象而不是文件。在这种情况下,我建议您的代码中不应该包含任何include,而应该有一个自动加载器,根据需要在应用程序中按类名进行请求

然而,您在问题中的示例看起来似乎没有太多的概念,可能它应该允许在include中包含局部变量,但是通过在include helper函数中动态包含可以更容易地实现,如:

/**
 * 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));
}

因此,可以在每个包含中定义一个与包含同名的函数。

可能属于程序员。这是一般设计的问题,而不是个人偏好的问题。如果你能根据个人喜好进行设计,那么这就是你的个人喜好。不管你喜欢做什么,把语言当作一种工具。许多模板引擎都依赖于这种副作用。这并不意味着这是一种坏习惯。如果你不喜欢它,就不要使用它。如果你觉得它对你的情况有用,那么就使用它。