应该 require_once "some file.php" ;出现在文件顶部以外的任何地方?

Posted

技术标签:

【中文标题】应该 require_once "some file.php" ;出现在文件顶部以外的任何地方?【英文标题】:Should require_once "some file.php" ; appear anywhere but the top of the file? 【发布时间】:2010-12-12 18:51:54 【问题描述】:

以下示例适用于 php 的 require_once 构造吗?

function foo( $param )

    require_once "my_file.php" ;
    //
    // do something here

或者在文件开头只包含 require_once 结构更合适?

即使被包含的文件仅在函数的上下文中有用,为了可读性和可维护性,在顶部包含包含不是更好吗?

【问题讨论】:

【参考方案1】:

使用 require_once 时请记住,这不是一些预处理器指令。 require_once 语句在 PHP 运行代码时执行,并且仅在执行期间尚未包含特定脚本时才执行。

例如:

conf.php:

<?php
$maxAge = 40;
?>

myscript.php

<?php
 function foo($age) 
  require_once("conf.php");
  if($age > $maxAge) 
    return "1"; 
  else 
    return "0";


 echo foo(30); // Echos 1
 echo foo(30); // Echos 0
?>

require_once 不会在第二次调用 foo(..) 时执行,因为 conf.php 已经包含了一次。

【讨论】:

【参考方案2】:

这是一场宗教辩论。

文件顶部 requireinclude 语句的优点:

    依赖关系清楚地记录在一致的可靠位置。

    提高了可读性/可维护性

    OP 代码缓存更简单(尽管您可能会争辩说这不会直接影响开发人员)

文件顶部 requireinclude 语句的缺点:

    如果您正在执行某种动态运行时,包括(例如使用 __autoload()),文件顶部的硬编码语句是不可能的。

    如果代码中只有一个执行路径使用包含,每次都包含,无条件地包含资源。

    includerequire 语句的长列表只是开发人员在编辑文件时必须滚动过去的噪音。当然,一长串依赖关系可以被视为代码应该被分解成更小、更集中的部分的标志,所以也许你可以把它作为专业人士来旋转,因为它会让代码味道更加突出。

【讨论】:

【参考方案3】:

如果您不想加载文件,除非需要,请查看 autoloading - 在较新的 PHP 上通过 spl_autoload_register()

【讨论】:

【参考方案4】:

这归结为编码风格和意见的问题。就我个人而言,我将所有require_once 语句保留在我的文件的最顶部,这样我就可以轻松地查看哪些文件包含在哪里,没有什么比一些隐藏的包含弄乱你的脚本更糟糕的了。但是,如果您有几个只需要某些功能的大型必需脚本,那么从性能的角度来看,将require_once 放在一个函数中是可以的,只需确保在页面顶部添加注释即可。

<?php
//require_once "my_file.php" (see function foo)

function foo($param) 
  require_once "my_file.php";

【讨论】:

@tj111:注释掉代码(如您在答案中发布的 sn-p)的潜在问题是,如果某些维护程序员更新 foo() 并删除对 my_file.php 的依赖,他们可能不会知道更新文件顶部的评论。然后,该评论会在每个查看该文件的未来程序员周围徘徊并“撒谎”。 @Asaph:我同意你的观点,并且出于这个原因,我个人不会按照我推荐的方式考虑我的代码。我的意思是作为一种后备措施,以防在每次通话中都包含文件时出现严重问题(例如性能),这是我个人从未遇到过的问题。【参考方案5】:

也许你只在某些情况下需要包含的文件,如果你根本不需要它,如果它是一个大文件,你想避免包含它。所以,我猜你可以只在if - else 语句的一个分支中使用require_once

【讨论】:

以上是关于应该 require_once "some file.php" ;出现在文件顶部以外的任何地方?的主要内容,如果未能解决你的问题,请参考以下文章

php语言:require_once(dirname(__FILE__)."/./config_uc.php");讲解

The Epsilon-Greedy /UCB ("upper confidence bound") for MAB (Multiarmed-bandit) problem som

微信 付款到零钱

PHP:require_once 和继承

在“require_once”之后找不到类

php页面中的包含文件用相对路径(require_once("./smarty/smarty.class.php"))出错了怎么解决