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 相关文章推荐
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
php获取网页上所有链接的方法
Apr 03 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
php如何连接sql server
Oct 16 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
Aug 11 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
php中的explode()函数实例介绍
Jan 18 PHP
php校验公钥是否可用的实例方法
Sep 17 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
Dec 02 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中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
python使用RNN实现文本分类
2018/05/24 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
什么造成了Java里面的异常
2016/04/24 面试题
求高于平均分的学生学号及成绩
2016/09/01 面试题
求职推荐信范文
2013/12/01 职场文书
青年文明号事迹材料
2014/01/18 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
预备党员转正意见
2015/06/01 职场文书
无房证明样本
2015/06/17 职场文书