转载地址:https://mp.weixin.qq.com/s/ilfoYetC-tLaKAoCdtvdVg

刚翻了下鸟哥的公众号,发现一个有意思的文章,转来mark一下。

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

$a = true;if ($a) {  echo “true”;} else lable: {  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。

但lable这块稍微有点特别(可以说是一个设计违反直觉的”缺陷”吧), 在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(语句),但标签(lable)有点不同,”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++) {}

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

一个关于if else容易迷惑的问题(转自鸟哥公众号)相关推荐

  1. 良心推荐 一个可以下载各种编程软件(含安装教程)微信公众号!

    好多学编程的老铁在网上到处下载编程软件,但往往效率很低,即使下载好了,可能因为没有教程不会安装.因此给各位推荐一个微信公众号( dnzscomcn ).本人亲自实测,该公众号上不仅有很多编程软件,还有 ...

  2. 一个可在微信聊天框中生成短链接的微信公众号

    我们都知道腾讯.新浪的短网址功能并没有官方网站,很多时候我们想生成短链接需要去一些第三方网站,费时费力,有些还带广告或流量劫持! 所以做了这个功能,在聊天框中直接生成短链接,只需要发送网址,一秒内就会 ...

  3. 编程难在哪里? 一个美国实习生的故事。(转自刘欣老师的微信公众号——码农翻身)

    阿莱克西斯 码农翻身 3天前 作者:阿莱克西斯 来源: https://www.zhihu.com/question/22508677/answer/276595266 记得之前组里来了一个美国实习生 ...

  4. 一个星期内怎样学会微信公众号运营?

    作者:傅小瑶Fayola 链接:https://www.zhihu.com/question/322301275/answer/836357719 来源:知乎 著作权归作者所有.商业转载请联系作者获得 ...

  5. python爬取公众号阅读量_分享一个牛逼的Python项目:公众号文章爬虫

    我订阅了近 100 个公众号,有时候想再找之前读过的文章,发现搜索起来特别困难,如果忘了收藏,估计得找半小时,更让人无语的是,文章已经发布者删除,或者文章因违规被删除.那么有没有这样的爬虫,可以将公众 ...

  6. 公众号如何发布一个投票活动

    用公众号的人或团队越来越多,对粉丝做个小调查和建议,那就在所难免.公众号的投票活动可以让你得以实现. 那么怎样发布一个投票活动呢.步骤如下: 第一,登陆微信公众号后台,点击"功能" ...

  7. python 数据拟合 预测_GitHub - wanng-ide/Python-WeChat-Predict: 用现有的数据对微信公众号的一些数据做一个预测,主要采用多项式拟合来构建模型。...

    Python-WeChat-Predict 用现有的数据对微信公众号的一些数据做一个预测,主要采用多项式拟合来构建模型. 概述 项目主要内容是对32个微信公众号在30天的数据进行处理,初始数据全部保存 ...

  8. Carson带你学Android:这是一个与众不同的Android微信公众号

    前言 今天,我想向广大Android开发者介绍一个与众不同.有特色的Android微信公众号,希望你们会喜欢. 注:我是本Android微信公众号的运营者carson_ho,简单介绍如下: 附:各大技 ...

  9. mysql编写倒计时_微信公众号开发,实现倒计时的一个功能(纯代码)

    微信公众号开发,实现倒计时的一个功能(纯代码),请在,公众,订单,代码,时间 微信公众号开发,实现倒计时的一个功能(纯代码) 易采站长站,站长之家为您整理了微信公众号开发,实现倒计时的一个功能(纯代码 ...

最新文章

  1. Numpy之N维数组-ndarray
  2. php 5.6 新特性,PHP 5.6正式发布:新特性、及功能改进介绍
  3. lenze变频器怎么更改地址_英威腾变频器GD300维修
  4. linx vim 文件操作 ubuntu server 软件源
  5. 领会一些比较巧妙的算法
  6. Atitit 信息管理概论 艾提拉总结 信息的采集 信息格式转换 信息整合 信息的tag标注 信息的结构化 信息检索,,索引 压缩 信息分析 汇总 第1章 信息管理的基本概念 第
  7. shell awk学习3
  8. 2021年危险化学品经营单位安全管理人员实操考试视频及危险化学品经营单位安全管理人员操作证考试
  9. 融云亮相GTC全球流量大会 荣膺鲸鸣奖2019年度优秀出海服务商
  10. XP下免U盘安装Ubuntu 18.04(持续更新遇到的问题,20200422更新)
  11. BigDATA面试题
  12. 书论20 袁昂《古今书评》
  13. Android初级教程短信防火墙
  14. linux 显示bin 文件格式,bin文件扩展名,bin文件怎么打开?
  15. 时间复杂度和空间复杂度及多道例题讲解
  16. Presto的学习笔记
  17. JAVA十六进制数据转换
  18. VR专业的面试题你都见过没?相信我绝对有用
  19. Python 打印和输出
  20. android 启动页大小,android引导页大图

热门文章

  1. jsp EL表达式比较时间
  2. 史上最全ClassLoader总结
  3. 别傻了,人家离职你也离
  4. 说说自己写PHP框架的一些感受
  5. squid 简单介绍及代理说明
  6. Spring -Bean的作用域
  7. 基于8086CPU微处理器的汇编学习之JMP指令
  8. Eclipse 编码区-保护色-快捷大全
  9. Ubuntu 13.04设置root用户登录图形界面
  10. 【转】Android应用的自动升级、更新模块的实现 (2)