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 相关文章推荐
我的论坛源代码(四)
Oct 09 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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
利用 window_onload 实现select默认选择
2006/10/09 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python随机模块random使用方法详解
2020/02/14 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
Java面试题:为什么要用Java
2012/05/11 面试题
中学门卫岗位职责
2013/12/26 职场文书
财务管理职业生涯规划范文
2013/12/27 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang