包含()/require() 与"side effects"是一种不好的做法吗?



是否在做类似

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

被认为是要避免的坏做法?

我个人认为,require()(或require_once()include(),这不是重点)调用的执行应该只添加到其他函数/对象的"链接",而不要单独执行任何东西。换句话说,在我看来,require的行为应该与其他oo语言的导入/使用非常相似。

我上面写的例子是相当微不足道的,但显然我也写了各种各样的"副作用"。define函数或一些会话技巧是我在一些包含的文件中经常发现的其他滥用

是的,在我看来这是(非常)糟糕的做法,除非非常明确地记录

includerequire(以及它们在其他语言中的等价)通常应该只新函数引入当前作用域,而不触发它们的调用。

这是一个总体设计问题,与个人偏好无关。如果你可以用个人偏好来设计,那么它就是你的个人偏好。把语言当作工具使用

例如,如果您使用PHP作为服务器端include的替代品,那么include通常包含大部分HTML和一些PHP片段。伟大的网站就是用这个建造的。在现实世界中,这样的设计并没有什么不好的。

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

的例子,你在你的问题,但看起来没有太多的概念背后,无论如何,也许它应该允许有局部变量在一个包含,但这可以更容易地实现通过动态包含在一个包含的辅助函数,如:

/**
 * include a file with its 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), EXTR_OVERWRITE);
    }
    return include(func_get_arg(0));
}

因此不必在每个include中定义一个与include同名的函数

相关内容

最新更新