使用&&

时间:2017-03-08 14:20:29

标签: php if-statement

似乎我不能在同一语句的后面部分使用if语句中定义的变量。有没有解决的办法?这是声明:

if ($cat = getCat($item) && 
    ($masterCat= getVC($cat) || $masterCat= getTC($cat))) {
    echo "success";
} else {
    echo "fail";
}

如您所见,$ cat在第一部分中定义。如果该部分评估为False,则其他部分将不会运行。我的问题是我得到了

  

未定义的变量:cat

即使调用了getCat并且在&&和RHS之前定义了$ cat。运算符被评估。

构建此代码我了解了short circuit evaluationTruthy 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)
}

3 个答案:

答案 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);