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
不会返回false
。 require_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_file
和is_readable
而不是file_exists
,因为file_exists
对目录也返回true,并且(常规)文件也应该是可读的。
对不起,我的解释应该更清楚一点,我只是使用 file_exists 和 is_readable 来证明文件在那里。
@Ian 但这是事先检查的正确方法,比file_exists()
更好。 (但如果你对致命错误没问题,你就不需要它了。)以上是关于require_once 和 include_once 无法正确解析文件的主要内容,如果未能解决你的问题,请参考以下文章