我有以下开关声明。
该URL包含推荐ID,例如twitter,facebook或电子邮件,例如mail@mail.com。这存储为$ref
我有以下开关声明:
switch ($ref) {
case "twitter":
echo "twitter";
break;
case "facebook":
echo "facbeook";
break;
case "blog":
echo "blog";
break;
case strstr($ref,'@'):
echo "email = ".$ref;
default:
echo "no referral found";
break;
}
但是,如果没有传递URL(例如www.mything.co.uk
),那么我希望转到default
案例。
相反,我得到以下输出:
email = no referral found
为什么默认值还包括我为case strstr($ref,'@')
设置的文字?
答案 0 :(得分:2)
OP问题:&#34; 为什么默认值还包括我为案例strstr设置的文字($ ref,&#39; @&#39;)?&#34; < / p>
答案:输出后面没有break;
,因此通过落到默认情况。
更新:解决将声明置于case
范围内的问题,我还包括一个简单的解决方法:
switch ($ref) {
case "twitter":
echo "twitter";
break;
case "facebook":
echo "facbeook";
break;
case "blog":
echo "blog";
break;
default:
if (strstr($ref,'@')) {
echo "email = ".$ref;
} else {
echo "no referral found";
}
break;
}
答案 1 :(得分:1)
当$ref
为空字符串时,strstr($ref,'@');
也返回空字符串,这就是case strstr($ref,'@'):
匹配交换机输入$ref.
的原因
问题是,您甚至无法使用像
filter_var($ref, FILTER_VALIDATE_EMAIL)
如果输入为空而不是空字符串,则返回false
,但switch
执行松散比较,这意味着"" == false
将返回true
:< / p>
http://php.net/manual/en/types.comparisons.php#types.comparisions-loose
因此,我看到的唯一解决方案是使用===
运算符使用if语句:
if($ref == 'twitter') {
echo "twitter";
} else if($ref == 'facebook') {
echo "facbeook";
} else if($ref == 'blog') {
echo "blog";
} else if($ref === filter_var($ref, FILTER_VALIDATE_EMAIL)) {
echo "email = ".$ref;
} else {
echo "no referral found";
}
答案 2 :(得分:-1)
这是因为您的测试执行方式与if ($ref == strstr($ref, '@'))
类似,其中strstr
返回false
,等于空字符串。您无法在switch
语句中真正使用动态比较。如果需要,请使用if..else
。或者,滥用switch
一点:
switch (true) {
case $ref == 'twitter':
..
case strstr($ref, '@'):
..
}
答案 3 :(得分:-1)
这将有效:
case (strstr($ref, '@') ? true : false):
但实践并不是很好。