PHP的变量类型和作用域详解


Posted in PHP onMarch 12, 2014

PHP中变量的作用域可以分为:超全局(全局变量的特殊类型,在局部范围里可直接使用),全局,局部,静态(是局部变量的特殊类型)
在PHP中,全局变量实际上是静态全局变量,如果不用unset显式的释放,那么等脚本运行结束全局变量才会被释放掉
局部静态变量细分可以是 局部静态函数变量(函数中声明的static变量),局部静态成员变量(类中声明的 static 属性,被所有类实例共享)
局部静态变量只有脚本运行结束才会被自动释放

超全局变量:在一个脚本的任何作用域里都可以被访问,这些都是PHP内置的

$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_SESSION(持久化存储)
$_COOKIE(持久化存储)
$_REQUEST
$_ENV

全局变量:声明的变量不在class,function,if等语言结构内部,如果要在class,function,if等语言内部使用,需要用关键词global或者超全局变量$GLOBALS

静态变量: 在function中使用关键词static声明的变量,静态变量的值保留直至脚本结束
局部变量:在class,function,if/while/for等结构语句内部声明的变量

1.global关键词和$GLOBALS实例

<?php
$a = 0;
function foo()
{
    global $a;
    echo $a;
}
function foo2()
{
    echo $GLOBALS['a'];
}

2.static 变量和普通局部变量区别实例
<?php
function foo1()
{
    $var = 0;
    $var++;
    return $var;
}
echo foo1();
echo foo1();
//输出都是1
function foo ()
{
    static $var = 0;
    $var++;
    return var;
}
echo foo();
echo foo();

//第一次输出1 第二次2
3.static 关键词还可以声明静态属性和静态方法
静态属性只能被类调用,而不能被类实例调用
静态方法里不能使用$this,只能用self访问类的静态属性

另外理解static变量的一段代码:

<?php
class t
{
        static $v = 10;
        public function a()
        {
                static $var = 10;
                $var++;
                echo $var . "<br>\n";
        }
        public static function aa()
        {
                self::$v++;
                echo self::$v . "<br>\n";
        }
}
$o1 = new t();
$o1->a();//输出11
$o2 = new t();
$o2->a();//输出12
t::aa();//输出11
$o1->aa();//输出12
$o2->aa();//输出13

从上面的代码中,可知如果一个类成员方法中有静态变量,即使是不同的类实例,他们也会共享这个静态变量,尽管这个静态变量不是类静态成员变量,这点容易让人迷惑。

PHP 相关文章推荐
如何在PHP中使用Oracle数据库(4)
Oct 09 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
第四章 php数学运算
Dec 30 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
php绘制一个矩形的方法
Jan 24 PHP
thinkPHP3.2简单实现文件上传的方法
May 16 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
Jul 13 PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
Apr 26 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
php图像验证码生成代码
Jun 08 PHP
PHP四大安全策略
Mar 12 #PHP
PHP中4个加速、缓存扩展的区别和选用建议
Mar 12 #PHP
php使用websocket示例详解
Mar 12 #PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
Mar 12 #PHP
php实现快速排序的三种方法分享
Mar 12 #PHP
php二分查找二种实现示例
Mar 12 #PHP
php遍历文件夹和文件列表示例分享
Mar 11 #PHP
You might like
PHP判断文件是否存在、是否可读、目录是否存在的代码
2012/10/03 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
CI框架常用函数封装实例
2016/11/21 PHP
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
Django小白教程之Django用户注册与登录
2016/04/22 Python
Django与JS交互的示例代码
2017/08/23 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
信息管理员岗位职责
2013/12/01 职场文书
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
优秀公益广告词大全
2014/03/19 职场文书
房屋转让协议书
2014/04/11 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
市场部岗位职责范本
2015/04/15 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
python小程序之飘落的银杏
2021/04/17 Python