震惊!if else 竟然同时输出!

简介: 震惊!if else 竟然同时输出!

首先,大家看看这个代码,应该输出什么:

//示例1
<?php
if(pcntl_fork()){
    echo 1;
}else{
    echo 2;
}
//示例2
<?php
if (1) {
    echo 1;
} else label:{
    echo 2;
}

输出1?还是输出2?

但它其实输出的是1和2:

image.png

为什么呢?

在这边,最主要一点在于pcntl_fork函数:

pcntl_fork

pcntl_fork 函数是php多进程扩展的一个函数,用于创建一个新进程执行,其返回值为 主进程id和0 或者 -1(错误)

那么,很多人就会奇怪了,为什么一个函数的返回值有2个呢?原因就在于此函数将会创建一个新进程,新进程作为调用函数进程的子进程,将复制主进程所有状态.

image.png

如图,对应代码如下:

<?php
$a = 1;
$b = 2;
$pid = pcntl_fork();//在这之后,已经变成了2个进程在执行,所以下面的输出都将输出2次
echo "返回值:{$pid}\\n";
if ($pid > 0) {
    echo "返回值:$pid,最后修改值:a:{$a},b:{$b}\\n"; //主进程
    $a = 3;
    $b = 4;
} elseif ($pid == 0) {
    echo "返回值:$pid,最后修改值:a:{$a},b:{$b}\\n"; //子进程
    $a = 2;
    $b=1;
}
echo "返回值:$pid,最后修改值:a:{$a},b:{$b}\\n";
echo "返回值:$pid,最后修改值:a:{$a},b:{$b}\\n";

将输出:

返回值:13879
返回值:13879,最后修改值:a:1,b:2
返回值:13879,最后修改值:a:3,b:4
返回值:0
返回值:0,最后修改值:a:1,b:2
返回值:0,最后修改值:a:2,b:1

可看到,在pcntl_fork后,子进程将会继承主进程所有变量,状态,但和主进程并非共用,在fork后,2个进程互相隔离,变量互不相干.

通过这个说明,是不是顿时了解了上面为什么会输出1,2呢?其实并不是同时走了if,else,只是不同进程走了不同的判断罢了.

很好,我们已经知道了第一个if else 都走的原理了,那么看看第二个:

<?php
if (1){
    echo 1;
}else label:{
    echo 2;
}

这个输出什么呢?没错!也是1和2,这个又是因为什么呢?

首先,我们需要了解一下, label:  是什么鬼?

goto 语句

php的goto语句可以标记一个程序的位置,并通过goto 进行跳转,例如:

<?php
$i = 1;
testGOTO:
echo  $i;
$i++;
if ($i<=10){
    goto testGOTO;
}

再例如:

<?php
$i = 1;
testGOTO:{
    echo  $i;
}
$i++;

当没有goto时,标记仍然可以使用,但是失去了goto语法的效果,当成了正常语句执行,同时标识可增加 {} 用于标记代码块

看出什么了嘛?上面的label,其实是goto写法的一个标记而已,那么为什么会走if,else呢?

goto 语句可以用来跳转到程序中的另一个位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。

PHP 中对 goto 语句有一定限制,即目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入另一个函数、其他循环或者 switch 结构中。

goto 也可以跳出循环或者 switch,所以可以用来代替多层的 break 语句。

同时,goto 标识,代表着独立的语句,并不能跟之前的代码有关联

在上面的例子中,else label: {}  其实最后解析的代码块为:

<?php
if (1){
    echo 1;
}else;label:{
    echo 2;
}

格式化一下:

<?php
if (1) {
    echo 1;
} else;
label:{
    echo 2;
}

label作为独立语句块,并不能跟前面的语句关联,else 将直接中断,相当于else后面没有执行语句,else后面的2个括号,也只是goto标记的代码块,跟else毫无关联

好了,今天的2个装逼知识小技巧,你学会了吗?

目录
相关文章
|
2月前
|
人工智能 自然语言处理 测试技术
从人工到AI驱动:天猫测试全流程自动化变革实践
天猫技术质量团队探索AI在测试全流程的落地应用,覆盖需求解析、用例生成、数据构造、执行验证等核心环节。通过AI+自然语言驱动,实现测试自动化、可溯化与可管理化,在用例生成、数据构造和执行校验中显著提效,推动测试体系从人工迈向AI全流程自动化,提升效率40%以上,用例覆盖超70%,并构建行业级知识资产沉淀平台。
从人工到AI驱动:天猫测试全流程自动化变革实践
|
机器学习/深度学习 人工智能 自然语言处理
2024年AI辅助研发:科技创新的引擎
2024年AI辅助研发:科技创新的引擎
|
消息中间件 缓存 监控
go高并发之路——消息中间件kafka
本文介绍了高并发业务中的流量高峰应对措施,重点讲解了Kafka消息中间件的使用,包括常用的Go语言库sarama及其版本问题,以及Kafka的版本选择建议。文中还详细解释了Kafka生产者的四种分区策略:轮询、随机、按Key和指定分区,并提供了相应的代码示例。
340 1
go高并发之路——消息中间件kafka
|
10月前
|
人工智能 供应链 搜索推荐
如何降低酒店运营成本?管理者不可不知的优化策略
在竞争激烈的酒店行业,提升管理效率、优化服务质量和客户满意度至关重要。本文探讨如何通过精准市场定位、高效运营管理、智能化管理系统及数字化工具,实现精细化管理,提供个性化服务,有效处理客户反馈,以提升酒店竞争力和客户体验。未来,智能化与个性化将成为行业发展的重要趋势。
534 21
|
Dubbo Java 应用服务中间件
入门运行Soul
入门运行Soul
362 3
入门运行Soul
|
12月前
|
机器学习/深度学习 人工智能 算法
转载:【AI系统】AI 发展驱动力
本文介绍了AI的起源与发展历程,强调了2016年AlphaGo胜利对AI关注度的提升。文中详细解析了AI技术在搜索引擎、图片检索、广告推荐等领域的应用,并阐述了机器学习、深度学习和神经网络之间的关系。文章还深入探讨了AI的学习方法,包括模型的输入输出确定、模型设计与开发、训练过程(前向传播、反向传播、梯度更新)及推理过程。最后,文章概述了AI算法的现状与发展趋势,以及AI系统出现的背景,包括大数据、算法进步和算力提升三大关键因素。
转载:【AI系统】AI 发展驱动力
|
传感器 数据采集 物联网
元宇宙与物联网:连接虚拟与现实
【10月更文挑战第29天】元宇宙与物联网正逐步改变我们的生活和工作方式。元宇宙通过区块链、云计算等技术,构建了一个与现实世界平行的虚拟空间;物联网则通过智能感知和连接,将物体与互联网相连,提供精准数据和服务。两者融合,提升了虚拟空间的真实感和沉浸感,带来了更智能的服务,共同推动社会的数字化和智能化进程。
|
运维 Devops API
阿里云云效操作报错合集之调用api报错:没有权限,是什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151824 5
|
存储 人工智能 安全
密钥密码学(一)(3)
密钥密码学(一)
478 1