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 分页类(模仿google)-面试题目解答
Sep 13 PHP
如何让CI框架支持service层
Oct 29 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
Mar 19 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
YII使用url组件美化管理的方法
Dec 28 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
Apr 01 PHP
Laravel如何自定义command命令浅析
Mar 23 PHP
smarty模板的使用方法实例分析
Sep 18 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 PHP
laravel 自定义常量的两种方案
Oct 14 PHP
php swoft框架实例用法
Dec 22 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 调用远程url的六种方法小结
2009/11/02 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
2013/06/24 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
react基本安装与测试示例
2020/04/27 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
关于python 跨域处理方式详解
2020/03/28 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
协议书的格式
2014/04/23 职场文书
委托书的写法
2014/08/30 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
2014年销售员工作总结
2014/12/01 职场文书