2013-11-09 21 views
2

我'学习PHP的使用CodeIgniter,这是第一次我想出了这个代码:

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

... 

是什么意思?第二行后有一行空格。

是它像一个三元运算符?

====修订DUE TO澄清问题====

对于为例,如果我想使用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);后?为什么下一行是空的,它真的返回了什么?我如何检查?

+0

没有,'| |'就像'OR' –

+0

是的,我知道,但为什么没有'if(something || something2){...}'?并加上下一行是空的 – aspirinemaga

+0

好吧,现在我明白了,我不确定它是否完全如您所说。谢谢 – aspirinemaga

回答

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

如果我们换从ab返回值,所以a将返回falseb将返回true,这两个函数将被执行,因为它会检查,如果第二个呼叫将在if语句返回true。

代码中有类似的情况。 redirect($dashboard)只有在第一个条件($this->user_model->loggedin() == FALSE)被评估为false时才会执行。这段代码可以写在不改变功能是这样的:

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

......或者......

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

...或只是...

if ($this->user_model->loggedin()) { 
    redirect($dashboard); 
} 
+0

完美!现在我看到了差异。非常感谢你Guilherme – aspirinemaga

+0

不客气! =) –

3

这是一个Logical OR运营商。

$一个|| $ b如果$ a或$ b为真,则为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()); 
?> 

有一行空格后的经营和案件的优先级第二行。

这是毫无意义,它意味着什么。你可以从下面拉代码并删除它不会改变任何东西的空行。

Source:

编辑

基础上,以什么你真的想知道你的问题你的新的解释,让我们考虑这个例子。假设您只想在他们的$登录状态为真时向某人显示欢迎消息。这是一种方式你可以这样做:

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

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

+0

谢谢@Hanky的回答! – aspirinemaga

3

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

这就是所谓的'短路'评估。如果第一个表达式返回false,则从不计算第二个表达式。

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

回复:你question--

没有什么在下一行,因为没有什么更多的事情要做。由OR加入的表达式处理所有需要完成的事情。在你的情况下,种类简写为

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

有意义吗?

+1

非常感谢你的解释,如果可能的话,我也会接受你的回答。 – aspirinemaga