Heim > Schlagzeilen > Hauptteil

Eine verwirrende Frage, wenn sonst!

藏色散人
Freigeben: 2020-07-10 14:36:20
nach vorne
3646 Leute haben es durchsucht

Eine verwirrende Frage, wenn sonst!

这个本来是之前在微博上有个同学说他经常用来面试别人,大概是说,对于如下代码,你觉得会输出啥:

$a = true;
if ($a) {
  echo “true”;
} else label: {
  echo “false”;
}
Nach dem Login kopieren

当时觉得有点偏,没想写,今天中午又有人问我,我想那就介绍下这个原因吧.

首先,上面的代码输出truefalse, 如果你知道原因,那就不用继续往下看了,如果不知道,那么:

这块让人比较迷惑的原因可能是因为,我们会很直观的认为:

label : {
  statement;
}
Nach dem Login kopieren

应该是一个整体, 就好比类似:

if ($a) {
} else switch($a) {
}
Nach dem Login kopieren

或者:

if ($a) {
} else do {
} while (!$a);
Nach dem Login kopieren

因为在PHP的语法设计中,if else本质上是:

if_stmt:
 if_stmt_without_else T_ELSE statement
Nach dem Login kopieren

也就是说,else后面可以接一切statement,如果条件不成立,执行流就跳到else后面的statement,而while, switch都可以归约为statement。

但label这块稍微有点特别(可以说是一个设计违反直觉的”缺陷”吧), 在zend_language_parser.y中:

statement:
  ...
  | T_DO statement T_WHILE '(' expr ')' ';' {...}
  | T_SWITCH '(' expr ')' switch_case_list {...}
  | T_STRING ‘:’ { $$ = zend_ast_create(ZEND_AST_LABEL, $1); }
Nach dem Login kopieren

大家可以看到, do while, switch 都会联合他们的body归约为statement(语句),但标签(label)有点不同,”label :”本身会规约为一条statement, 这就导致了这个看起来比较迷惑的问题的出现,他本质上就变成了:

$a = true;
if ($a) {
 echo "true";
} else {
 label: ;  //单独的一条语句
}
echo "false";
Nach dem Login kopieren

最后多说一句,我忘了之前在那看到的,说是这个世界上本无elseif,有的只不过是else (if statement),本质上其实就跟这个意思是一样的。 就是,else后面可以接语句(statement)。

善用这个结合switch, for, do while等,有的时候可以让我们的代码更精简。

比如,我们要遍历处理一个数组,当数组的长度为零的时候,要做点其他事,那很多人可能会这么写:

if (count($array)) {
  for ($i = 0; $i < count($array); $i++) {
  }
} else {
  //数组为空的逻辑
}
Nach dem Login kopieren

但你也可以写成:

if (count($array) == 0) {
   //数组为空的逻辑
} else for ($i = 0; $i < count($array); $i++) {
}
Nach dem Login kopieren

至于这俩中写法孰好孰坏, 那就是萝卜白菜了。

最后,大家如果在实际中遇到类似让大家觉得迷惑的问题,可以留言,也许以后也可以单独成文。

Verwandte Etiketten:
Quelle:laruence.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage