这个本来是之前在微博上有个同学说他经常用来面试别人,大概是说,对于如下代码,你觉得会输出啥:
$a = true; if ($a) { echo “true”; } else label: { echo “false”; }
当时觉得有点偏,没想写,今天中午又有人问我,我想那就介绍下这个原因吧.
首先,上面的代码输出truefalse, 如果你知道原因,那就不用继续往下看了,如果不知道,那么:
这块让人比较迷惑的原因可能是因为,我们会很直观的认为:
label : { statement; }
应该是一个整体, 就好比类似:
if ($a) { } else switch($a) { }
或者:
if ($a) { } else do { } while (!$a);
因为在PHP的语法设计中,if else本质上是:
if_stmt: if_stmt_without_else T_ELSE statement
也就是说,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); }
大家可以看到, do while, switch 都会联合他们的body归约为statement(语句),但标签(label)有点不同,”label :”本身会规约为一条statement, 这就导致了这个看起来比较迷惑的问题的出现,他本质上就变成了:
$a = true; if ($a) { echo "true"; } else { label: ; //单独的一条语句 } echo "false";
最后多说一句,我忘了之前在那看到的,说是这个世界上本无elseif,有的只不过是else (if statement),本质上其实就跟这个意思是一样的。 就是,else后面可以接语句(statement)。
善用这个结合switch, for, do while等,有的时候可以让我们的代码更精简。
比如,我们要遍历处理一个数组,当数组的长度为零的时候,要做点其他事,那很多人可能会这么写:
if (count($array)) { for ($i = 0; $i < count($array); $i++) { } } else { //数组为空的逻辑 }
但你也可以写成:
if (count($array) == 0) { //数组为空的逻辑 } else for ($i = 0; $i < count($array); $i++) { }
至于这俩中写法孰好孰坏, 那就是萝卜白菜了。
最后,大家如果在实际中遇到类似让大家觉得迷惑的问题,可以留言,也许以后也可以单独成文。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

드림위버 CS6
시각적 웹 개발 도구
