PHP 是不是需要、require_once 或包含在页面加载时自动读取文件?

Posted

技术标签:

【中文标题】PHP 是不是需要、require_once 或包含在页面加载时自动读取文件?【英文标题】:Does PHP require, require_once, or include automatically read the file at page load?PHP 是否需要、require_once 或包含在页面加载时自动读取文件? 【发布时间】:2011-07-14 05:52:58 【问题描述】:

我有几个页面在 php 中使用 include 或 require 语言结构。其中许多位于 IF、ELSE 语句中。

我确实意识到,如果缺少必需的文件,则页面根本不会加载,但包含这种方式的主要目的是:

1) 减少页面上的代码混乱

2) 除非满足声明,否则不加载文件。

不管是否发出 include 或 require 语句都会加载文件(从而消除了我试图通过放置在 if/else 语句中来实现的好处?

简单示例:

<?php


$i = 1

if($i ==1) 

      require_once('somefile.php');

 else 

     require_once('otherfile.php');


?>

在页面加载时,是否都检查并加载了两个文件?

【问题讨论】:

【参考方案1】:

如果您将include/require 语句放在if 的主体中(或else,它将在if 的条件下执行是真的。

if ($a == 10) 
    // your_first_file.php will only be loaded if $a == 10
    require 'your_first_file.php';
 else 
    // your_second_file.php will only be loaded if $a != 10
    require 'your_second_file.php';

而且,如果你愿意,你可以很容易地测试它。 第一个例子:

if (true) 
    require 'file_that_doesnt_exist';

会得到你:

Warning: require(file_that_doesnt_exist) [function.require]: failed to open stream: No such file or directory
Fatal error: require() [function.require]: Failed opening required 'file_that_doesnt_exist'

require 被执行——但由于文件不存在而失败。

而这第二个例子:

if (false) 
    require 'file_that_doesnt_exist';

不会得到任何错误:require 未执行。

【讨论】:

哈哈哈哈!帕斯卡尔·马丁又来了——一如既往地提供出色而详细的输入。 :) +1 展示如何测试它【参考方案2】:

在页面加载时,是否都检查并加载了两个文件?

不,至少从 (IIRC) PHP 4.0.1 开始没有。

如果您想减少包含混乱,并且主要使用面向对象的代码,还可以查看 PHP 的 autoloading。

【讨论】:

谢谢!我只是不想浪费不必要的资源,一直想知道 这是一些反对自动加载的好理由——大多数与字节码缓存有关。 @ThiefMaster:我不遵循你的推理(嗯,没有)。我使用启用了操作码缓存的 APC,我的应用程序通常会大量使用自动加载,但我从来没有遇到过任何问题。我究竟做错了什么?遇到问题该怎么办? 我不记得究竟是什么原因造成的。但我想我是在 SO 上读到的,所以搜索一下可能会有所帮助。 自动加载器和操作码缓存过去无法相处。在现代 PHP 中不再是这种情况(因为创建了真实路径缓存),尽管设计不佳的自动加载器可能会导致比严格必要的更多的文件系统戳和刺激。【参考方案3】:

不,只会加载其中一个文件。

【讨论】:

【参考方案4】:

includerequire 构造仅在通过时进行评估。仅当满足您的表达式时才会读取文件。

考虑到结构可能包含变量,这很容易解释:

require_once("otherfile-$i.php");

支持。但它不可能在 PHP 运行到该特定行之前工作,因为它需要知道 $i 的状态才能加载正确的文件。

【讨论】:

希望有人复制您的脚本并将$i 替换为$_GET['i'] :D(是的,我很邪恶,呵呵) 你的建议会给你带来不愉快的来世。 哦,谁知道呢。也许你只需要在他们把你送到地狱之前说' OR 1 --,你就会神奇地降落在天堂里;)+1

以上是关于PHP 是不是需要、require_once 或包含在页面加载时自动读取文件?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 检查 require_once() 内容是不是为空

如何知道是不是通过 require_once() 调用了 php 脚本? [复制]

php require_once 包含相对于文件而不是工作目录的文件

require_once 返回 true 而不是预期的对象

PHP:require_once 和继承

防止 PHP require_once 永远运行