我们知道,函数、类会改变当前变量的作用域。if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见。

但是C语言不支持if,while等分支循环结构内部作用域对外可见,而PHP则不然。

在PHP中,if,while等分支循环结构中声明的局部变量,在分支循环结构后面仍然有效。

比如,函数中声明的变量在函数外面是不可见的

C语言:01 #include<stdio.h>
02  
03 int foo()
04 {
05     int bar;
06     bar  = 3;
07 }
08  
09 int main()
10 {
11     printf("%d\n",bar);
12     return 0;
13 }

报错:
scope.c: In function ‘main’:
scope.c:11: 错误:‘bar’ 未声明 (在此函数内第一次使用)
scope.c:11: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
scope.c:11: 错误:所在的函数内只报告一次。)

PHP语言:1 <?php
2 function foo()
3 {
4     $bar = 1;
5 }
6  
7 echo $bar;

报错:
Notice: Undefined variable: bar in scope.php on line 7
PHP Notice:  Undefined variable: bar in scope.php on line 7

而if,while等循环分支结构会继承外部作用域,即外部变量对循环分支结构内部可见

类似的:

C语言:01 #include<stdio.h>
02  
03 int main()
04 {
05     int foo = 1;
06     if(1)
07     {
08         int bar = foo;
09         printf("%d\n",bar);
10     }
11  
12     while(1)
13     {
14         int bar = foo;
15         printf("%d\n",bar);
16         break;
17     }
18  
19     return 0;
20 }

输出:

1

1

PHP语言:01 <?php
02 $foo = 1;
03 if(1)
04 {
05     $bar = $foo;
06     echo $bar,"\n";
07 }
08  
09 while(1)
10 {
11     $bar = $foo;
12     echo $bar,"\n";
13     break;
14 }

输出:

1

1

但是不一样的地方来了。

C语言:01 #include<stdio.h>
02  
03 int main()
04 {
05     int foo = 1;
06     if(1)
07     {
08         int bar = foo;
09         printf("%d\n",bar);
10     }
11  
12     printf("%d\n",bar);
13  
14     while(1)
15     {
16         int bar = foo;
17         printf("%d\n",bar);
18         break;
19     }
20  
21     printf("%d\n",bar);
22  
23     return 0;
24 }

报错:

scope.c: In function ‘main’:
scope.c:12: 错误:‘bar’ 未声明 (在此函数内第一次使用)
scope.c:12: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
scope.c:12: 错误:所在的函数内只报告一次。)

PHP语言
01 <?php
02 $foo = 1;
03 if(1)
04 {
05     $bar = $foo;
06     echo $bar++,"\n";
07 }
08  
09 echo $bar,"\n";
10  
11 while(1)
12 {
13     $bar2 = $foo;
14     echo $bar2++,"\n";
15     break;
16 }
17  
18 echo $bar2,"\n";

输出:

1

2

1

2

这就是需要注意的地方!

if、while中变量的作用域问题的更多相关文章

  1. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  2. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  3. 注意for循环中变量的作用域-乾颐堂

    1 2 for e in collections:     pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...

  4. 注意for循环中变量的作用域

    for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个 ...

  5. JavaScript 中变量、作用域和内存问题的学习

    这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...

  6. C语言中变量的作用域和生命周期

    变量的类型: 1. 局部变量和全局变量 局部变量也称为内部变量. 局部变量是在函数内作定义说明的.其作用域仅限于函数内, 离开该函数后再 使用这种变量是非法的. 全局变量也称为外部变量,它是在函数外部 ...

  7. Delphi过程和函数中变量的作用域

    变量的作用域是指变量能被某一子程序识别的范围. 全局变量和局部变量.全局变量是指在程序的type区定义的变量,而局部变量是在过程或函数的定义部分声明的变量.全局变量在整个程序中都有意义,局部变量只在它 ...

  8. Python中变量的作用域

    一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...

  9. C/C++中变量的作用域和存储类型简介

    写在开头 对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆.作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概 ...

随机推荐

  1. Makefile特殊标签

    http://www.gnu.org/software/make/manual/html_node/Special-Targets.html

  2. iOS通讯录相关知识-浅析

    本文来自于:贞娃儿的博客  http://blog.sina.com.cn/zhenwawaer  在开发一些应用中,我们如果需要iPhone设备中的通讯录信息.或者,需要开发通讯录相关的一些功能.那 ...

  3. learn go anonymous function

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.8.md im ...

  4. 基本SQL命令

    1.SQL命令的使用规则 1.每条命令必须以 ; 结尾 2.SQL命令不区分字母大小写 3.使用 \c 来终止当前命令的执行 2.库的管理 1.库的基本操作 1.查看已有库 show database ...

  5. Redis学习总结之一——Redis初入

    Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis是一个key-value存储系统. ...

  6. mysql 导入 csv文件中数据,只能导入第一行

    用workbench导入csv数据,只能导入数据的第一行,也就是标注每一列的列名的那一行.但问题是,每次导入完成时,系统提示已经导入了500条记录(这个文件中的确有500条记录),可是刷新数据库后打开 ...

  7. Codeforces 914H Ember and Storm's Tree Game 【DP】*

    Codeforces 914H Ember and Storm's Tree Game 题目链接 ORZ佬 果然出了一套自闭题 这题让你算出第一个人有必胜策略的方案数 然后我们就发现必胜的条件就是树上 ...

  8. 基于 task 为 VSCode 添加自定义的外部命令

    我们有很多全局的工具能在各处使用命令行调用,针对某个仓库特定的命令可以放到仓库中.不过,如果能够直接为顺手的文本编辑器添加自定义的外部命令,那么执行命令只需要简单的快捷键即可,不需要再手工敲了.   ...

  9. 用firefox获取html页面元素的Xpath

    Xpath在分析网页尤其是采集固定格式数据时,非常有用,且比正则表达式和首尾截取式更加简便.准确! 工具/原料   FireFox FireBug XpathChecker UserAgentSwit ...

  10. MySQL 导入.sql文件

    对于新手,刚接触Mysql数据库不知道,怎么导入sql脚本数据库. 或者说几百M的,导入肯定会卡死,所以用命令来导入是比较好的选择, 讲下方法. 在 linux 终端下 执行 mysql -uroot ...