应该 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】:这是一场宗教辩论。
文件顶部 require
和 include
语句的优点:
依赖关系清楚地记录在一致的可靠位置。
提高了可读性/可维护性
OP 代码缓存更简单(尽管您可能会争辩说这不会直接影响开发人员)
文件顶部 require
和 include
语句的缺点:
如果您正在执行某种动态运行时,包括(例如使用 __autoload()),文件顶部的硬编码语句是不可能的。
如果代码中只有一个执行路径使用包含,每次都包含,无条件地包含资源。
include
或 require
语句的长列表只是开发人员在编辑文件时必须滚动过去的噪音。当然,一长串依赖关系可以被视为代码应该被分解成更小、更集中的部分的标志,所以也许你可以把它作为专业人士来旋转,因为它会让代码味道更加突出。
【讨论】:
【参考方案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("./smarty/smarty.class.php"))出错了怎么解决