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实现用户认证及管理完全源码
Mar 11 PHP
c#中的实现php中的preg_replace
Dec 21 PHP
php实现查询百度google收录情况(示例代码)
Aug 02 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
Nov 12 PHP
Smarty最简单实现列表奇偶变色的方法
Jul 01 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
php 中的closure用法详解
Jun 12 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
yii2 上传图片的示例代码
Nov 02 PHP
关于php开启错误提示的总结
Sep 24 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 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插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python 解析XML文件
2009/04/15 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
一份python入门应该看的学习资料
2018/04/11 Python
python版大富翁源代码分享
2018/11/19 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python实现最大优先队列
2019/08/29 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
python 图像增强算法实现详解
2021/01/24 Python
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
办护照工作证明范本
2014/01/14 职场文书
酒店大堂副理的职责范文
2014/02/13 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
mysql查找连续出现n次以上的数字
2022/05/11 MySQL