2

我正在用 CodeIgniter 学习 PHP,这是我第一次想到这段代码:

...
$dashboard = 'admin/dashboard';
$this->user_model->loggedin() == FALSE || redirect($dashboard); // <-- ???

...

这是什么意思 ?第 2 行之后有一个行空间。

它类似于三元运算符吗?

==== 为澄清问题而更新 ====

例如,如果我想使用IF运算符,我会这样做:

if( $logged_in === TRUE ){
  // do something
}

或者像这样不带{ }大括号的 IF 运算符,其中包含一行:

if( $logged_in === TRUE )
  // do something
  // this line is not a part of 2 lines above

问题是,为什么在那之后什么都没有$this->user_model->loggedin() == FALSE || redirect($dashboard);?为什么下一行是空的,它真正返回了什么?我该如何检查?

4

3 回答 3

3

那是一个逻辑或运算符。

$一|| $b 如果 $a 或 $b 为 TRUE,则为 TRUE。

例如

<?php
$a=TRUE;    // Set this to FALSE and your function will not be executed.
$b=$a==FALSE || 10;
var_dump($b);    // true because 10 || FALSE is true

?>

注意这里要注意的是运算符的优先级和后面部分不会执行的情况

<?php

// --------------------
// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());
?>

第 2 行之后有一个行空间。

这完全没有意义,没有任何意义。您可以从下面提取代码并删除它不会改变任何内容的空行。

来源:

编辑

根据您对您真正想知道的问题的新解释,让我们考虑这个例子。假设您只想在某人的 $login 状态为 true 时向其显示欢迎消息。这是您可以这样做的一种方法:

<?php
$login=FALSE;
$login==TRUE || myFunction();
function myFunction()
{
 echo "Control has reached my function. Welcome You are logged in";
}
?>

为什么这种具体的做法而不是简单的if else?完全取决于程序员他们使用哪种语法以及他们认为哪种语法最适合他们编写的某些代码。这也可以通过许多其他方式来完成,而不是强迫遵循这种风格。

于 2013-11-09T17:38:23.587 回答
3

||是逻辑或运算符。如果左边的表达式计算为真,那么右边的表达式将被计算。在这种情况下,如果loggedin()返回 FALSE 为 true,则 OR 之后的表达式||将被计算: redirect($dashboard)- 否则不会。

这被称为“短路”评估。如果第一个表达式返回 false,则永远不会计算第二个表达式。

看起来代码的目的是在登录失败时重定向请求。

回复:你的问题——

下一行没有任何内容,因为没有更多工作要做。由 OR 连接的表达式负责所有需要完成的事情。在你的情况下,一种简写

if(loggedin() == FALSE) 
  redirect ($dashboard); 

有道理?

于 2013-11-09T17:39:50.393 回答
3

您可能知道,逻辑 OR 运算符 ( ||) 将检查任一布尔表达式是否为真。

假设我们有两个函数ab返回布尔值,我们想检查其中一个是否返回 true:

function a() {
    echo "function a was called\n";
    return true;
}

function b() {
    echo "function b was called\n";
    return false;
}

if (a() || b()) {
    echo "hello\n";
}

在这种情况下,输出将是:

函数 a 被调用

你好

如果我们正在检查至少一个表达式是否为真并且第一个表达式的计算结果为true,我们不需要检查第二个表达式是否也为真,对吗?这就是为什么我们没有function b was called在这个例子的输出中看到。

如果我们从aand交换返回值b,那么a将 returnfalsebreturn true,这两个函数将被执行,因为它必须检查第二个调用是否会在 if 语句中返回 true。

您的代码中有类似的情况。只有当第一个条件 ( ) 被评估为 falseredirect($dashboard)时才会执行。$this->user_model->loggedin() == FALSE可以通过以下方式编写此代码而无需更改功能:

if (!($this->user_model->loggedin() == FALSE)) {
    redirect($dashboard);
}

...或者...

if ($this->user_model->loggedin() == TRUE) {
    redirect($dashboard);
}

...要不就...

if ($this->user_model->loggedin()) {
    redirect($dashboard);
}
于 2013-11-09T17:51:10.243 回答