【问题标题】:require_once problem with templatingrequire_once 模板问题
【发布时间】:2009-07-20 14:19:47
【问题描述】:

我是 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='.:') 失败

这在以前没有发生过。 (文件都在根文件夹中)。我看不出问题出在哪里,因为它们在同一个文件夹中 - 我不必返回 '../' 或引用任何其他文件夹。我在这里错过了什么?

谢谢。

【问题讨论】:

  • 从错误来看,它看起来不像是在尝试要求“header.php”,它看起来像是在试图要求“1”。你显示的那行真的在第 15 行吗?如果您发布更多代码可能会有所帮助
  • 是的,它是第 15 行的确切代码:

标签: php filesystems


【解决方案1】:

在你的评论中你说你的代码是:

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

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

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

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

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

因为 require_once 不是函数,而是 php 中的语句,所以大括号是可选的,php 将上述解释为布尔表达式,其中字符串“header.php”被评估为布尔值“true”。 True 被强制转换为一个字符串(结果为“1”),然后这个字符串被传回 require 一次。

所以上面的代码被解释为

require_once("1")

以下是它的逐步解释方式:

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

希望这会有所帮助;)

【讨论】:

  • 没有模具,页面加载,但页眉和页脚不存在。
  • 嗯,你说页眉和页脚真的有内容要显示吗?例如,某些东西得到了回应?页面是否显示任何 php 警告?
  • 我已经直接查看了 header.php 和 footer.php,它们的内容都很好。
  • 请将此代码放在代码中的 require_once 之前:ini_set('display_errors', 1);错误报告(E_ALL | E_STRICT);并告诉我是否有任何错误/警告
  • 我做到了,但什么也没发生。
【解决方案2】:

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

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

【讨论】:

  • 由于 header.php 和 master.php 都在同一个目录中,并且包含路径有 '.'那么这不应该是必需的。
  • 当前目录(include_path = .)是调用脚本的路径,而不是脚本所在的目录。
  • 那我先解决你的问题中cmets中提到的问题
  • @soulmerge:调用目录和脚本所在目录有何不同?
  • 您可以在shell中输入以下内容,例如:php other/dir/file.php。如果“master.php”被包含在另一个目录中的文件中,也会发生这种情况:那么当前目录是包含脚本的目录,而不是 master.php 的目录。
【解决方案3】:

这可能是因为master.php另一个与header.php 不在同一目录中 的脚本文件包含或需要。也就是你访问索引的时候,知道调用/解析的是哪个文件吗?

查看documentationinclude(),它也适用于require()

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

更新

为了解决一些 cmets:我没有说 include() 会改变 CWD。我的意思是,如果 CWD 不是 master/header.php 所在的位置,那可能就是问题所在。

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

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

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

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

【讨论】:

  • 您可以使用 getcwd(), php.net/getcwd 获取/检查/显示当前工作目录。 include()/require() 确实改变 cwd,只有像 chdir() 这样的东西。
  • 我使用了 getcwd();它给了我 /Users/MyName/Sites/MySite - 因此 require_once("Views/header.php");应该工作,但它没有。它给了我同样的错误!
  • 此外,Peter 在上面提出了一个很好的观点,即 master.php 被不在同一目录中的另一个脚本所需要/包含。所以我去了localhost/~MyName/MySite/Views/master.php,我得到了完全相同的错误!
  • VolkerK,请看我的更新,我没有说包括或需要更改 CWD。​​span>
  • Peter 我尝试使用 CWD (/Users/MyName/Sites/MySite) : require_once("/Users/MyName/Sites/MySite/Views/header.php");我得到同样的错误:(。
【解决方案4】:

你需要有这样的第 15 行:

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

但是,当找不到 header.php 时,require 是致命的,那么你应该有:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 2012-03-17
    • 2017-12-10
    • 2012-12-22
    • 2013-07-14
    • 1970-01-01
    • 2013-09-10
    • 2017-08-10
    • 2017-02-23
    相关资源
    最近更新 更多