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)
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)如何处理这个问题?
PHP是否只是跳过第二次检查,并且只要在比较列表中触发第一次错误,就不会实际执行第二次检查?
是.这被称为短路评估.
&&如果左侧是假的,则(和)不评估右侧,因为结果必须是假的.
||如果左侧为真,则(或)不评估右侧,因为结果必须为真.
另外,将两个if语句分开是否被认为是良好的编码实践,或者我的编码方式过于陈旧?
虽然编码风格非常个人化,但一旦理解了短路评估,就没有必要将它们分开.我相信大多数程序员if在这种情况下会保持一个条件,特别是因为它们密切相关,并且基本上是检查相同事情的两个步骤.
其他编程和脚本语言(Java,C++/C#,JavaScript,Python)如何处理这个问题?
和PHP一样.