使用'或die()'来停止PHP中的错误

时间:2010-07-21 12:11:02

标签: php boolean-operations

通常在PHP中,我看到:

$result = mysql_query($query) or die();

来自python,我知道为什么这应该有效,因为or如果在布尔上下文中为真,则返回第一个值,否则返回第二个值(参见this)。

但是当我在另一个上下文中尝试PHP中的上述技术时,例如:

$name = "John Doe";
echo $name or "Anonymous";

or不返回第一个值(“John Doe”),它返回1.

为什么这在mysql_query()结果案例中有效,但在其他情况下却没有?在mysql_query()情况下使用是否不好(忽略我没有向用户返回有用错误的事实)?

7 个答案:

答案 0 :(得分:33)

在PHP中,变量赋值(等号)和函数都优先于or运算符。这意味着首先执行函数,然后在or比较中使用函数的返回值。反过来,当您将两个值/变量与or运算符一起使用时,它会比较两个值 first 然后返回一个布尔值。

因此,本例中的评估顺序为:

$result = mysql_query($query) or die();
  1. <强> mysql_query($query)
    返回DQL查询的结果集,例如SELECT,或DDL,DML或DCL查询的布尔值,例如CREATEDROPINSERT,{{1 }},UPDATEDELETE

  2. <强> ALTER
    此查询执行的结果将分配给变量$result = mysql_query($query)

  3. <强> $result
    如果它是结果集或$result /* = ... */ or die();,则认为它是真的(也称为“真理”),因此满足true条件并且语句在此处结束。否则,脚本将or代替。


  4. die()是一种语言结构,因此实际上并不返回值,因此在进行echo比较之前它不像函数那样运行。

    由于or始终为真,因为字符串$name or "Anonymous"非空,因此真实,"Anonymous"隐式将echo转换为true,因此输出

    此示例中的评估顺序为:

    1
    1. <强> $name = "John Doe"; echo $name or "Anonymous";
      非常简单 - 将字符串 John Doe 分配给$name = "John Doe";

    2. <强> $name
      PHP发现$name or "Anonymous"包含字符串 John Doe ,因此最终评估的内容如下:

    3. <强> $name
      由于此处至少有一个字符串非空,因此它被认为是真实的,并且满足条件。然后,此评估将返回"John Doe" or "Anonymous"

    4. <强> true
      echo true /* $name or... */;转换为true并打印数字1。

答案 1 :(得分:2)

为什么or会返回任何内容? or是一个普通的布尔运算符。如果$a or $btrue评估为$a$b评估为true,则false||

oror之间的区别在于,=的运算符优先级较低,甚至低于$result = mysql_query($query) or die(); 。这就是为什么

($result = mysql_query($query)) or (die());

相同
$result = mysql_query($query) || die();

,而

$result = (mysql_query($query) || die());

相同
echo $name or "Anonymous";

在你的情况下

(echo $name) or ("Anonymous");

echo $name ?: 'Anonymous';

您正在寻找的可能是三元运营商:

echo $name ? $name : 'Anonymous';

如果你只使用PHP 5.2,上面的内容将从PHP 5.3开始工作:

{{1}}

答案 2 :(得分:2)

在提问之后不久,我才真正想到了这个原因。这是关于运营商优先权的。 =发生在or之前,所以:

$result = mysql_query($query) or die();

相当于:

($result = mysql_query($query)) or die();

$result = (mysql_query($query) or die());

就像在Python中一样。所以这个:

$a = false or true;

会将$a设置为false,而不是true,这将在未来的某个时刻引起我的注意。

答案 3 :(得分:1)

PHP做了一些经常被称为“类型杂耍”的事情。换句话说:PHP转换当前用例的任何值的类型。由于字符串将转换为“true”值,因此表达式返回true。但echo希望打印一个字符串表达式并将“true”转换为1.在某些情况下有点烦人,但如果你知道它,你也知道如何处理;)

顺便说一下,检查一下:http://php.net/manual/en/types.comparisons.php

答案 4 :(得分:1)

首先计算or子句并返回echo输出的布尔值。如果要输出文本,则需要if / else结构,如:

echo ($name ? $name : 'Anonymous');

答案 5 :(得分:0)

这是因为echo不是函数,它是一种语言结构。它模仿成为一个功能,但它确实不是:)

我永远不会像这样使用die(),它有点粗糙。你应该妥善处理你的错误,不要只是拯救。

答案 6 :(得分:0)

如果您想将该行为和输出复制到屏幕/浏览器,则需要一个返回TRUE以外的函数。 printf()可以帮到你。

echo microtime."&lt;br&gt;";<
$str = "";
printf("%s",$str) or die();
echo "&lt;br&gt;".microtime();

如果$ str为空,null或false,则调用die(),否则脚本将完成执行。