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() 一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。

最新文章

  1. C语言内存对齐详解
  2. spring实战四之Bean的自动装配(注解方式)
  3. Web程序员最常用的11款PHP框架
  4. yum添加网易和搜狐源
  5. jQuery在updatepanel中使用造成内存泄露
  6. Exchanger, Changing data between concurrent tasks
  7. 3DShader之移位贴图(Displacement Mapping)
  8. animation实现动画效果
  9. EntityFramework Core 2.0自定义标量函数两种方式
  10. Java实现简易联网坦克对战小游戏
  11. SQL总结——存储过程
  12. vue 父子组件之间传参
  13. u-boot移植(九)---代码修改---NAND
  14. day 10 函数名的运用,闭包,迭代器
  15. [BZOJ 1135][POI2009]Lyz
  16. 【BZOJ1970】[AHOI2005]矿藏编码(模拟)
  17. Java编程的逻辑 (13) - 类
  18. .Net AppDomain详解(一)
  19. 小波变换——哈尔小波,Haar
  20. linux du df ls

热门文章

  1. How to enable wire logging for a java HttpURLConnection traffic?
  2. 过Hard题目.周末
  3. Android中的AsyncTask异步任务的简单实例
  4. RISC设计原则及基本技术
  5. Windows server 2008 布署FTP服务器实例(适用于阿里云)!
  6. ubuntu,jdk安装成功后,点击eclipse,提示信息A Java RunTime Environment (JRE) or Java Development Kit (JDK)
  7. matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
  8. sicily 1000. LinkedList
  9. 使用Java操作Redis(二)
  10. .NET简谈——跨进高级编程门槛的必经之路