似乎我不能在同一语句的后面部分使用if语句中定义的变量。有没有解决的办法?这是声明:
if ($cat = getCat($item) &&
($masterCat= getVC($cat) || $masterCat= getTC($cat))) {
echo "success";
} else {
echo "fail";
}
如您所见,$ cat在第一部分中定义。如果该部分评估为False,则其他部分将不会运行。我的问题是我得到了
未定义的变量:cat
即使调用了getCat并且在&&和RHS之前定义了$ cat。运算符被评估。
构建此代码我了解了short circuit evaluation和Truthy values,但现在我不得不尝试“一行”了。我可以嵌套if语句,但是想知道有三种可能的失败点,如果有一种方法可以做到这一点,其中“失败”部分只定义一次(它在实际代码中更大,而不仅仅是echo“失败”;)< / p>
以下的功能
function getCat($pItem) {
//looks up $pItem and returns a category or null if $pItem doesn't exist
}
function getVC($pCat) {
//looks up $pCat quickly, returns master category or null if not in quick lookup table
}
function getTC($pCat) {
//looks up $pCat thoroughly,
//returns master category OR
//returns null if $pCat has expired (shouldn't happen but prevents crashing if it ever does)
}
答案 0 :(得分:4)
您了解了短路评估,下一讲将包括operator precedence: - )
简而言之:&&
绑定强于=
,因此代码的评估方式如下:
$cat = (getCat($item) && ($masterCat = (getVC($cat) || $masterCat = getTC($cat)))
在括号内,$cat
确实尚未定义。简单修复:自己添加括号:
if (($cat = getCat($item)) &&
(($masterCat = getVC($cat)) || ($masterCat = getTC($cat)))) {
echo "success";
} else {
echo "fail";
}
Re:代码风格,条件内的赋值主要被认为是PHP中的一个坏主意。也就是说,因为未来的读者无法快速区分“聪明”和错误==
,需要考虑理解这种结构。
为了学习PHP语法,你的代码是好的,但在生产环境中你可能想要关注@ FatBoyXPC的建议。
答案 1 :(得分:1)
为什么不在if条件之外定义此变量:
$cat = getCat($item); //define the variable here
if ($cat && ($masterCat= getVC($cat) || $masterCat= getTC($cat))) {
echo "success";
} else {
echo "fail";
}
在if条件之外,变量$cat
也可以在以后使用。
答案 2 :(得分:1)
如果问题是你不能让它作为一个班轮工作,为什么不停止阻碍自己呢?
$cat = getCat($item);
//Ternary if you getVC does not return null use it else use getTC
$masterCat = isset(getVC($cat)) ? getVC($cat) : getTC($cat);
if ($cat && $masterCat) {
echo "success";
} else {
echo "fail";
}
虽然是,但是还有两行你的if语句是可读的,你不必担心一些奇怪的优先级,并且运行时速度没有降低。
实际上修改了这个想法
//if $cat was null I assume $masterCat should be
if (isset($masterCat)) {
echo "success";
} else {
echo "fail";
}
但实际上,你也可以通过捕捉案件和处理它们来给自己一些灵活性。
$cat = getCat($item);
if(isset($cat)){
$masterCat = isset(getVC($cat)) ? getVC($cat) : getTC($cat);
if(isset($masterCat)){
//do work
} else {
//fail for no master
}
} else {
//fail for no cat
}
一个衬里不是更好的可用和可读代码。
其他强>
指向双重调用三元组。你可以先查看getVC
然后关闭那个三元组。
$masterCat = getVC($cat);
$masterCat = isset($masterCat) ? $masterCat : getTC($cat);