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文章按日期(月日)SQL归档语句
Nov 29 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
PHP回调函数简单用法示例
May 08 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 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开发规范手册之PHP代码规范详解
2011/01/13 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
RequireJs的使用详解
2017/02/19 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
python使用cookie库操保存cookie详解
2014/03/03 Python
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
python中readline判断文件读取结束的方法
2014/11/08 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
详解Python中的type()方法的使用
2015/05/21 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
python针对excel的操作技巧
2018/03/13 Python
使用Python处理BAM的方法
2018/09/28 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
Django实现学生管理系统
2019/02/26 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
TCP/IP模型的分界线
2012/12/01 面试题
秋季运动会广播稿大全
2014/02/17 职场文书
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python