php中局部变量和全局变量

代码1:函数内部使用函数外部变量错误方法

<?php
$name = 'fish';
function animal() {
echo $name;
}
animal();

运行结果:Notice: Undefined variable: name in D:\wamp\www\index.php on line 5 
由此得知,animal()方法中的name和方法外部的name和方法外部的name不是同一个变量。

如何才能在函数内部访问到函数外部的变量呢?可以在函数内部或者外部将name变量定义为全局变量,在name变量定义为全局变量,在name之前加上global即可;如下所示:

代码2:函数内部使用函数外部变量正确方法

<?php
$name = 'fish';
function animal() {
global $name;
echo $name;
}
animal();

<?php
global $name;
function animal() {
$name = 'fish';
echo $name;
}
animal();

运行结果:fish

那么,如果$name变量是在函数内部定义的,能够在函数外部或者别的函数中使用到吗?答案是显而易见的,不能,这就是局部变量,可以看下下面的代码段:

代码3:函数外部使用函数内部变量错误方法

<?php
function animal() {
$name = 'fish';
}
echo $name;

运行结果:Notice: Undefined variable: name in D:\wamp\www\index.php on line 6 
$name变量只能在animal()函数内部有意义。问题来了,如果我非要想在函数外部也能使用到函数内部定义的变量该怎么办? 
“可以在函数内部定义变量时将其声明为global”,请看如下代码段:

代码4:函数外部使用函数内部变量正确方法

<?php
function animal() {
global $name;
$name = 'fish';
}
animal();
echo $name;

运行结果:fish

可以看到,我们先执行了animal()方法,然后再使用name变量,就有效果了,当然,如果你没有执行animal()函数,那么,该段程序根本就没有声明变量name的操作,所以,需要记住的是,函数只有被调用了才有意义,且程序执行的顺序时从上到下,从左往右的。


局部变量:在函数内部中定义的变量,它的作用域为函数定义范围内。
全局变量:在函数外部定义的变量,它的作用域从定义处一直到文件结尾。
 
在php中函数被视为单独的程序片,所以局部变量会覆盖全局变量,即使局部变量中并定义没有全局变量相同的变量,也会被覆盖。
如下:
$a=5;
$b=3;
function t()
{
 echo $a-$b;//输出0
}
要想在函数中直接使用全局变量可以通过 global关键字声明 或者通过php中自定义的$GLOBALS数组获取
function t()
{  
 global $a,$b;
 echo $a-$b;
}

function t()
{
 echo $GLOBALS['a']-$GLOBALS['b'];
}

静态变量:通过static 定义一个静态变量, 如: 
function test()
{
 static $t;
$t++;
return $t;
}
for($i=0;$i<6;$i++)
{
echo test()."<br />";
}
输出 1 2 3 4 5 
即静态变量在第一次初始化后,该变量的值就一直存在内存中,不会随着函数而被注销。

注意:如果在函数中 unset() 一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。

php中局部变量和全局变量的更多相关文章

  1. JavaScript中局部变量与全局变量的不同

    JavaScript中局部变量与全局变量 我们知道,JavaScript的变量是松散型的变量,也就是说,其变量只需用var声明,其赋值的类型是不限定的.比如: var person=18; perso ...

  2. [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别

    C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...

  3. 对js中局部变量、全局变量和闭包的理解

    对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...

  4. 对JavaScript中局部变量、全局变量和闭包的理解

    对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...

  5. Labview中局部变量和全局变量

    局部变量的作用域是整个VI,它用于在单个VI中传输数据: 全局变量的作用域是整台计算机,它主要用于多个VI之间共享数据

  6. sql server中局部变量与全局变量的 申明与赋值(转)

    来源:http://www.111cn.net/database/mssqlserver/36734.htm 例子:http://www.cnblogs.com/sunxi/p/4497493.htm ...

  7. python中局部变量和全局变量

    局部变量,就是在函数内部定义的变量 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响 局部变量的作用,为了临时保存数据需要在函数 在函数外边定义的变量叫做全局变量 全局变量能够在所有 ...

  8. 关于c++中局部变量和全局变量的存储位置及内存回收机制

    局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收. new出来的内存空间存放在堆中,不受作用域管理,不会被系统自动回收,只有在使用delete删除或者整个程序结束 ...

  9. 理解LoadRunner中的局部变量和全局变量

    在C语言中,变量有效性的范围称变量的作用域.不仅对于形参变量,C语言中所有的量都有自己的作用域,按作用域范围不同,可分为局部变量和全局变量两种变量类型. 在LoadRunner中应用全局变量和局部变量 ...

随机推荐

  1. NOIp2018模拟赛三十七

    奇怪的一场... 前两题都是全场题,C题明显不可做,我题目都没看懂...(STO lhx OTZ) 成绩:100+100+8=208 貌似十几个208的...A题暴力$O(nmc)$能过...暴力容斥 ...

  2. BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)

    题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...

  3. python_模块学习

    '''import sysprint(sys.path) #打印环境变量 #运行结果为:['D:\\PyCharm Community Edition 2018.2.2\\NewYear\\untit ...

  4. Noip-pj2018游记

    2019/1/3 搬运于我的luogu博客 2018/10/9 没有去试机,在学校搞文化课去了.准考证是让学校的信息课老师帮我拿的 回家后随手A了P1198 P3870 P2846 P1531 感觉真 ...

  5. MAC中Parallels Desktop windows忘记密码的解决办法

    由于工作或是生活,在国内的环境下我们总有些时候要用到Windows才能完成某些任务,对于不经常使用Windows的用户,相信在虚拟机上安装一个Windows是不错的选择.小编就使用了Paralles ...

  6. c++_benchMark_vector_list_deque

    title: c++_benchMark_vector_list_deque date: 2015-08-01 22:32:39 作者:titer1 + ZhangYu 出处:www.drysalte ...

  7. SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用

    依然是项目结构图和所需jar包图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsi ...

  8. PhpStorm Live Template加PHP短语法Short Open Tags打造原生模板

    关于Php要不要使用模板一直被大家讨论,支持的说使用模板更简洁,易与前端project师交流.反对的说Php本身就支持内嵌语法,不是必需再用个模板,减少性能. 事实上使用Php的短语法.直接嵌入也不是 ...

  9. 11.字符,字符常见开发,_itoa函数

    各种字符所占字节 wchar_t wch = L'我'; //占4个字节 char ch;//占1个字节 printf("%d\n", sizeof("A")) ...

  10. MyBatis多参数传递之注解方式示例--转

    原文地址:http://legend2011.blog.51cto.com/3018495/1015003 若映射器中的方法只有一个参数,则在对应的SQL语句中,可以采用#{参数名}的方式来引用此参数 ...