【问题标题】:Is include()/require() with "side effects" a bad practice?具有“副作用”的 include()/require() 是一种不好的做法吗?
【发布时间】:2011-10-08 14:17:53
【问题描述】:

正在做类似的事情

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

_________________________
//header.php
printHeader()

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

考虑过要避免的不良做法?

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

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

【问题讨论】:

  • 可能属于 Programmers.SE
  • 这是一般设计的问题,不是个人喜好。如果您可以根据个人喜好进行设计,那么这是您的个人喜好。做任何你喜欢的事,把语言当作工具。
  • 许多模板引擎依赖于这种副作用。并不意味着这是不好的做法。如果你不喜欢它 - 不要使用它。如果您发现它对您的情况有用,请使用它。

标签: php


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是一般设计的问题,而不是个人喜好。如果您可以根据个人喜好进行设计,那么这是您的个人喜好。随心所欲,将语言用作工具

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 2020-09-07
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      相关资源
      最近更新 更多