如果我在同一个IF语句中放入一个isset(),为什么不通知PHP不存在数组索引?

Hen*_*gen 1 php isset short-circuiting comparison-operators

情况:我们有一小段PHP代码检查变量是否具有某个值,但由于数组索引及其值尚未设置,因此会产生E_NOTICE错误:

这会触发通知

<?php

    $arr = array();

    if ($arr['name']=='john') {
        echo('This should not work');
    } else {
        echo('In your computer, ignoring your notice');
    }
Run Code Online (Sandbox Code Playgroud)

这引起了很好的注意:

PHP Notice:  Undefined index: name in /home/hvanmegen/test.php on line 5
PHP Stack trace:
PHP   1. {main}() /home/hvanmegen/test.php:0
Run Code Online (Sandbox Code Playgroud)

现在请向我解释一下,如果该值检查会抛出错误,下面打印的代码如何正常运行而不会抛出相同的异常?!?!

这不会触发通知!

<?php

    $arr = array();

    if (isset($arr['name']) && $arr['name']=='john') {
        echo('This should not work');
    } else {
        echo('In your computer, ignoring your notice');
    }
Run Code Online (Sandbox Code Playgroud)

输出:

In your computer, ignoring your notice
Run Code Online (Sandbox Code Playgroud)

一旦第一个错误被返回或者什么东西,AND检查是否被中止/抛弃?

PHP是否只是跳过第二次检查,并且只要在比较列表中触发第一次错误,就不会实际执行第二次检查?

另外,将两个if语句分开是否被认为是良好的编码实践,或者我的编码方式过于陈旧?有人会认为检查这个的正确方法是这样的:

<?php

    $arr = array();

    if (isset($arr['name'])) {
        if ($arr['name']=='john') {
            echo('Hi john');
        } else {
            echo('Hi not-john, where is john?');
        }
    } else {
        echo('I cannot check what I do not have');
    }
Run Code Online (Sandbox Code Playgroud)

输出:

I cannot check what I do not have
Run Code Online (Sandbox Code Playgroud)

只是我的OCD想要将'isset()'置于其他声明之外,还是我的方法完全是多余的和过时的?或者我是否坚持你应该用尽可能多的"共同语言"编写代码的想法(使用语言无关的语法,尽可能简单地从一种语言切换到下一种语言)?

其他编程和脚本语言(Java,C++/C#,Javascript,Python)如何处理这个问题?

Boa*_*ann 9

PHP是否只是跳过第二次检查,并且只要在比较列表中触发第一次错误,就不会实际执行第二次检查?

是.这被称为短路评估.

&&如果左侧是假的,则(和)不评估右侧,因为结果必须是假的.

||如果左侧为真,则(或)不评估右侧,因为结果必须为真.

另外,将两个if语句分开是否被认为是良好的编码实践,或者我的编码方式过于陈旧?

虽然编码风格非常个人化,但一旦理解了短路评估,就没有必要将它们分开.我相信大多数程序员if在这种情况下会保持一个条件,特别是因为它们密切相关,并且基本上是检查相同事情的两个步骤.

其他编程和脚本语言(Java,C++/C#,JavaScript,Python)如何处理这个问题?

和PHP一样.