2011-05-13 85 views
2

以下代码不会给出任何错误。但是我对第二部分的研究很有帮助。php和问题

.......... 
// Get meta data for the module 
$this->template->module_details = $this->module_details =  
$this->module_m->get($this->module); 

// If the module is disabled, then show a 404. 
empty($this->module_details['enabled']) AND show_404(); 
.......... 

对于我来说,第二部分应该是这样的。

if(empty($this->module_details['enabled']){ 
show_404(); 
} 

Q1。它是一样的吗? AND发生了什么? Q2302。你可以把第一部分放两倍吗?你为什么需要这样做? (A = B = C)

在此先感谢。

回答

3

Q1:每个布尔运算符都表现为“懒惰”。这意味着,如果表达式definitly解析为true,或false,它不会评估以下的(子)表达

true or doSomething(); 
false and doeSomething(); 

在两种情况下,不执行doSomething(),因为布尔表达式是已经知道是true/false。另一种方式圆

true and doSomething(); 
false or doSomething(); 

这里doSomething()始终执行,因为它的执行,直到(完全)表达式的结果是未知的。

所以,你是对的,那show_404()被执行,如果与empty()部分计算为true,在if什么样的结果语句来你给。 Q2:在PHP中,每个运算符都有一个返回值。在=(赋值)的情况下,返回值就是分配的值。

$a = $b = 1; 
// => 
$a = ($b = 1); // where ($b = 1) === 1 

没有人真正需要,但有时它是有用的,因为它比较明显,那$a$b具有相同的在这一点上的价值。

2

问题一

and用作logical short circuit

为了执行表达式的第二部分,第一部分需要为真。这实质上构成了LHS对于执行RHS的条件 - 这是一个有用的,如果有时难以理解的句法快捷方式。

如果LHS是错误的,那么解释者知道它不需要麻烦检查RHS,因为从(false && (true || false) === false)起,整个语句将评估为false

问题二

的分配总是返回RHS的值。

你可以很轻松地把它分解到:

$this->module_details = $this->module_m->get($this->module); 
$this->template->module_details = $this->module_details; 

..或将支架使得它多一点显而易见:

$this->template->module_details = 
    ($this->module_details = $this->module_m->get($this->module)); 

举个例子,评估赋值的右手边是常用于while循环中,例如:

while ($row = mysql_fetch_assoc($query)) {} 

这是可行的,因为mysql_fetch_assoc re在没有结果时变为false,因此($row = false)的计算结果为false并停止while循环。

2

它不应该混淆你太多,你可能已经看到了替代品,但只是没有连接它。

记住

mysql_query($sql) OR die(" :("); //false or die('died'); 

这意味着,执行查询或死!

empty($this->module_details['enabled']) AND show_404(); 

这里恰恰相反。

If it's empty, show 404; //true and die('died'); 

您可以使用||代替OR就像在其他情况下,它只是运算符优先级是不同的。

至于你的第一个问题。

这只是意味着我们为a,bc设置了相同的值;

$a = $b = $c = 0; //setting all to 0; 
+0

'='是assigment而不是比较'=​​='/'===' – KingCrunch 2011-05-13 10:22:22

+0

@KingCrunch我知道这一点。如示例中清楚显示的,我将相同的值分配给所有变量。我已经重新陈述了这个陈述,以免其他人错误地假设 – JohnP 2011-05-13 10:24:33