include()/ require()带有“副作用”是一种不好的做法吗?

时间:2011-10-08 14:17:53

标签: php

正在做类似

的事情
_________________________
//index.php
...
require("header.php");
...
_________________________

_________________________
//header.php
printHeader()

function printHeader(){
    echo 'something';
    ...
}
_________________________

被认为是一种避免不好的做法?

我个人认为执行require()(或require_once()include(),这不是点)调用应该只添加一个“链接”到其他函数/对象,永远不会自己执行任何事情。换句话说,在我看来,require的行为与导入/使用其他oo语言非常相似。

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

2 个答案:

答案 0 :(得分:5)

是的,恕我直言,这是(非常)不良做法除非明确记录

includerequire(及其他语言中的等价物)通常只应新函数引入当前作用域,并且永远不会触发它们的调用。

答案 1 :(得分:2)

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

例如,如果您使用PHP作为服务器端包含的替代品,那么包含大多数包含一些PHP片段的HTML是非常常见的。用这个建立了很棒的网站。在现实世界中,这种设计没有什么不好。

但是,如果您需要更细粒度的控制,那么您主要是指对象而不是文件。在这种情况下,我建议您不要在代码中包含任何内容,而应根据应用程序中的classname请求自动加载器。

你在问题​​中的例子看起来似乎背后没有太多的概念,也许它应该允许在include中包含局部变量,但是通过动态包含在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中定义一个与include包含相同名称的函数。