之间有什么区别
if (!isset($_SESSION['lang']) && !isset($_GET['lang'])) return 'ru';
和
if (!isset($_SESSION['lang'], $_GET['lang'])) return 'ru';
为什么第一个工作正常,但第二个总是返回'ru'? 据我所知,这两个条件是相同的,但为什么它们在相同条件下的工作方式不同?
没有session和get参数,第一个版本什么都不返回(因为我需要它),但是第二个版本总是返回true,无论是否设置了任何参数。
答案 0 :(得分:2)
第一个条件意味着必须设置它们
if (! isset($_SESSION['lang']) && ! isset($_GET['lang']))
第二个条件:
isset($_SESSION['lang'], $_GET['lang']
表示:both are set
。
!(isset($_SESSION['lang'], $_GET['lang'])
表示:at least one is unset
因此,如果$_SESSION['lang']
已设置且未设置$_GET['lang']
,则第二个条件将显示ru
答案 1 :(得分:1)
如果提供了多个参数,则
isset()
将仅返回TRUE
如果设置了所有参数。评估从左到右 并在遇到未设置的变量时立即停止。
这意味着isset(A,B)
与isset(A) && isset(B)
相同。
因此你的第二个版本
!isset(A,B)
相当于
!(isset(A) && isset(B))
相当于
!isset(A) || !isset(B) // DeMorgan
NOT 等同于您的第一个版本
!isset(A) && !isset(B)
答案 2 :(得分:0)
您使用的是错误的条件。 您可以使用以下3个条件中的任何一个。
if ((!isset($i)) || (!isset($j))) echo 'ru1';
if (!(isset($i) && isset($j))) echo 'ru3';
if (!isset($i,$j)) echo 'ru2';