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基础知识:控制结构
Dec 13 PHP
使用PHP的日期与时间函数技巧
Apr 24 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
Jan 06 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
前端必学之PHP语法基础
Jan 01 PHP
php用正则判断是否为数字的方法
Mar 25 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 PHP
PHP实现文字写入图片功能
Feb 18 PHP
php中关于换行的实例写法
Sep 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
jQuery TextBox自动完成条
2009/07/22 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
VueJS全面解析
2016/11/10 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
Python3 assert断言实现原理解析
2020/03/02 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
python实现猜拳游戏项目
2020/11/30 Python
通信工程毕业生自荐信
2013/11/01 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
赔偿协议书范本
2014/04/15 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
经理助理岗位职责
2015/02/02 职场文书
员工离职通知函
2015/04/25 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server