【问题标题】:require_once () or die() not workingrequire_once () 或 die() 不工作
【发布时间】:2010-11-12 21:42:00
【问题描述】:

有谁知道为什么我的 require_once() 或 die();不管用。它总是显示致命错误,而不是我在 die() 中键入的错误消息。我的代码见下文:

require_once ('abc.php') or die("oops");

错误信息显示如下

“致命错误:controller::require_once() [function.require]: 无法打开所需的 '1' (include_path='....."

而不是我键入的消息(“oops”)。

【问题讨论】:

    标签: php


    【解决方案1】:

    or 的优先级高于 require/require_once。因此php评估

    ('abc.php') or die("oops")
    

    在将结果传递给 require_once 之前。 Or 接受两个布尔操作数。 ('abc.php') 计算结果为 true 因此整个表达式为 true

    require_once true;
    

    被调用。 require_once 接受一个字符串,bool(true)->string => 1 =>

    打开失败需要'1'
    你不需要 or die(...) 那里。如果无法读取文件,require_once 无论如何都会停止 php 实例。

    【讨论】:

    • 出色的答案。需要强调的是 require_once 不是一个函数。它是一元运算符(或语言结构,如果您愿意),echo、new、include 等也是如此。
    • 谢谢!虽然通过以看似可接受的方式添加die() 有点糟糕,但它会引发一个错误,看起来像是找不到文件和/或需要它 - 或 - 包含文件中的错误......当它真的是require() or die() 的错误代码
    【解决方案2】:

    由于include 是一种特殊的语言结构而不是函数,所以它不需要为参数列表加上括号:

    因为include() 是一种特殊的语言结构,所以它的参数不需要括号。比较返回值时要小心。

    事实上,它只有一个参数,并且将其包裹在额外的括号中并不会改变任何内容:

    1 ≡ (1) ≡ ((1)) ≡ (((1))) ≡ …

    所以您的声明与此相同(参数只是包装):

    require_once (('abc.php') or die("oops"));
    

    所以我们有一个布尔表达式作为参数,它要么是true,要么是false。并且这些值的字符串等效于 "1""" 分别:

    var_dump((string) true === "1");
    var_dump((string) false === "");
    

    这就是为什么得到这个Failed opening required '1'错误消息的原因。

    但是像这样在正确的地方使用括号可以让它像你想要的那样工作:

    (@include_once 'abc.php') or die("oops");
    

    这里'abc.php'显然是参数,与die("oops")的析取是在include_once的返回值上进行的。 @ operator 只是为了忽略文件不存在时includ_once 将抛出的错误消息。

    PS:print 也是一种特殊的语言结构,工作方式相同。

    【讨论】:

      【解决方案3】:

      评估时:

      require_once ('abc.php') or die("oops");
      

      由于某种原因,PHP 首先评估 'OR die("oops")'。 强制 PHP 评估“require_once ('abc.php')” 将其括在括号中。

      (require_once ('abc.php')) OR die("oops");
      

      但是,如果“require”失败,PHP 会停止处理,因此请改用“include”(请参阅​​https://stackoverflow.com/a/2418514/1704651)。此外,include_once 之前的 @ 符号会抑制来自 MySQL 的错误消息,因此仅输出“oops”。

      (@include_once ('abc.php')) OR die("oops");
      

      按预期工作。

      来源:我自己的挫败感和https://bugs.php.net/bug.php?id=22342

      【讨论】:

      • include or die 也是我使用的。当您需要澄清文件丢失的原因(例如您需要定义的配置文件)时,它会很有帮助
      • 将@ 放在include 之前可能是个坏主意。 @include 导致包含文件中的所有错误以及该文件包含的任何文件都被抑制,这使得故障排除和错误处理成为一场噩梦。
      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 2017-11-13
      • 1970-01-01
      • 2013-12-22
      • 2011-04-20
      • 2014-09-20
      • 2011-04-02
      • 2011-01-24
      相关资源
      最近更新 更多