require_once 和 include_once 无法正确解析文件

Posted

技术标签:

【中文标题】require_once 和 include_once 无法正确解析文件【英文标题】:require_once and include_once not resolving files correctly 【发布时间】:2011-03-11 15:36:56 【问题描述】:

我遇到了 php 的 require_once、require、include_once 和 include 函数无法正确解析文件的问题。我正在使用 Apache 2.2.11 在 Windows Vista 上运行 PHP 5.3.1。

这些是我遇到的问题:

file_exists('C:/wamp/www/park_factor_network/system/application/shared/config/language.php')

返回真

is_readable('system/application/shared/config/language.php')

返回真

$fp = fopen('C:/wamp/www/park_factor_network/system/application/shared/config/language.php','r');
$contents = fread($fp, filesize('C:/wamp/www/park_factor_network/system/application/shared/config/language.php'));

返回一个有效的文件资源并将其存储到 $contents 中

但是:

require_once('system/application/shared/config/database.php') or die("Cannot Include Language Config");
require_once('C:/wamp/www/park_factor_network/system/application/shared/config/language.php') or die("Cannot Include Language Config");

返回:

Fatal error: require_once() [function.require]: Failed opening required '1' (include_path='.;C:\php5\pear') in C:\wamp\www\park_factor_network\system\application\shared\hooks\select_language.php on line 25

C:\wamp\www\park_factor_network\system\application\news_site\hooks 是 C:\wamp\www\park_factor_network\system\application\shared\hooks 的目录连接

我仅在从框架中的某个位置访问此文件时遇到此问题,但是由于这是直接包含或要求,它不应该受此影响,而且只有 PHP?如果我尝试将文件包含在我的设置中的其他任何位置,它加载正常。

【问题讨论】:

【参考方案1】:

require_once 是一种语言结构。它不是一个函数,也没有返回值。

文件名参数周围的括号是可选的。这似乎意味着在这一行:

require_once('system/application/shared/config/database.php') 
             or die("Cannot Include Language Config");

整个表达式

('system/application/shared/config/database.php') 
 or die("Cannot Include Language Config");

被评估(返回1)并用作文件名参数。 1,显然不存在。

你所做的并没有真正的意义,因为当加载文件失败时include 不会返回falserequire_once() 无论如何都会终止脚本的执行。如果您在生产环境中处理错误报告的切换,您可以轻松地忍受 PHP 致命错误,告诉您文件不存在(而不是您的自定义 die())。

如果您需要优雅地退出脚本,我会在语句之前调用file_exists,如果失败则调用die()

$file = 'system/application/shared/config/database.php';

if ((!is_file($file)) or(!is_readable($file)))
   die("Cannot Include Language Config");

require_once('system/application/shared/config/database.php');

【讨论】:

非常感谢您的明确答复。现在,我们中的几个人在 php 怪胎 IRC 试图让我们的头脑围绕文件解析而变得完全有意义,这与它根本无关。 最好使用is_fileis_readable 而不是file_exists,因为file_exists 对目录也返回true,并且(常规)文件也应该是可读的。 对不起,我的解释应该更清楚一点,我只是使用 file_exists 和 is_readable 来证明文件在那里。 @Ian 但这是事先检查的正确方法,比file_exists() 更好。 (但如果你对致命错误没问题,你就不需要它了。)

以上是关于require_once 和 include_once 无法正确解析文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP:require_once 和继承

使用 require_once() 或不使用 require_once()

require_once 给出警告和致命错误

调用 require_once() 的警告和致命错误

include() 和 require_once() 问题

require与require_once有啥区别?PHP