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 相关文章推荐
实用函数5
Nov 08 PHP
工厂模式在Zend Framework中应用介绍
Jul 10 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 PHP
php批量删除操作(数据访问)
May 23 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
YII框架http缓存操作示例
Apr 29 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
php调用mysql存储过程
2007/02/14 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
ThinkPHP路由详解
2015/07/27 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
Web服务器框架 Tornado简介
2014/07/16 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
对Django外键关系的描述
2019/07/26 Python
学python安装的软件总结
2019/10/12 Python
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
让世界充满爱演讲稿
2014/05/24 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
碧霞祠导游词
2015/02/09 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis