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 相关文章推荐
截获网站title标签之家内容的例子
Oct 09 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
PHP的基本常识小结
Jul 05 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
php define的第二个参数使用方法
Nov 04 PHP
php异常处理使用示例
Feb 25 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
php并发加锁示例
Oct 17 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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
Zerg剧情介绍
2020/03/14 星际争霸
菜鸟修复电子管记
2021/03/02 无线电
德生PL660的电路分析和打磨
2021/03/02 无线电
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php格式化时间戳
2016/12/17 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
海量经典的jQuery插件集合
2010/01/12 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
xml有哪些解析技术?区别是什么
2016/04/26 面试题
.NET remoting中对象激活的两种方式
2015/06/08 面试题
孝敬父母的演讲稿
2014/05/14 职场文书
党章培训心得体会
2014/09/04 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
党员示范岗材料
2014/12/19 职场文书
婚庆司仪开场白
2015/05/29 职场文书
工商局调档介绍信
2015/10/22 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Python爬虫基础初探selenium
2021/05/31 Python