require_once模板问题

时间:2009-07-20 14:19:48

标签: php filesystems

我是MVC的新手,我正在重做很多代码。

我有master.php(索引),其中包含:

<?php require_once("header.php"); ?>

master.phpheader.php都在同一个文件夹中,但我收到以下错误:

  

警告:require_once(1)[function.require-once]:无法打开流:第15行/Users/MyName/Sites/MySite/Views/master.php中没有此类文件或目录

     

致命错误:require_once()[function.require]:在第15行的/Users/MyName/Sites/MySite/Views/master.php中打开所需的'1'(include_path =':')失败

此前没有发生过。 (文件都在根文件夹中)。我不知道问题是什么,因为它们在同一个文件夹中 - 我不必返回'../'或引用任何其他文件夹。我在这里缺少什么?

感谢。

4 个答案:

答案 0 :(得分:5)

在评论中,您说您的代码是:

<?php require_once("header.php") or die; ?>

请尝试省略“或死” - &gt; ist不是必需的,因为如果找不到文件,require_once将触发致命错误。

编辑: 我测试了它,省去了“或死”,它会起作用。

编辑2:解释为什么会发生这种情况: 上面的代码也可以这样写:

require_once ( ("header.php") or die() );

因为require_once不是函数,而是php中的语句,大括号是可选的,php将上面解释为布尔表达式,其中字符串“header.php”被计算为布尔值“true”。 True会被强制转换为字符串(结果为“1”),并且此字符串将被传递回需要一次。

所以上面的代码被解释为

require_once("1")

以下是逐步解释的方法:

(("header.php") or die()) = (TRUE or die())
(TRUE or die()) = TRUE 
(string) TRUE = '1';

希望这会有所帮助;)

答案 1 :(得分:1)

PHP开始在根文件夹中查找“header.php”,但找不到它。如果它与当前脚本位于同一目录中,则应使用魔术常量__DIR__

<?php require_once __DIR__ . '/header.php'; ?>

答案 2 :(得分:1)

可能是因为master.php不在同一目录中的其他脚本文件包含或要求header.php。也就是说,当您访问索引时,您知道正在调用/解析哪个文件吗?

查看include()的{​​{3}},这也适用于require()

  

首先查看包含文件   for for each include_path条目   相对于目前的工作   目录,然后在目录中   当前脚本例如。如果你的   include_path是库,current   工作目录是/ www /,你   包括include / a.php,还有   在该文件中包含“b.php”,b.php   首先看看/ www / libraries /   然后在/ www / include /

<强>更新

要解决一些评论:我没有说include()会改变CWD。我说如果CWD不是master / header.php所在的那个,那可能是问题。

例如,假设您index.php位于与master.phpheader.php不同的文件夹中;它包含或要求master.php使用正确的路径。现在,master.php有声明:

<?php require_once("header.php"); ?>

但是,此时CWD 不包含 header.php,因为CWD是index.php的。

要解决此问题,您需要使用从当前脚本的CWD到require_once的正确路径调用header.php,而不是master.php的路径。

答案 3 :(得分:0)

你需要第15行:

<?php (require_once("header.php")) or die(); ?>

然而,由于找不到header.php时,要求是致命的,那么你应该:

<?php (include_once("header.php")) or die(); ?>

<?php require_once("header.php"); ?>
相关问题