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
Dec 14 PHP
php读取msn上的用户信息类
Dec 05 PHP
php使用mkdir创建多级目录入门例子
May 10 PHP
php密码生成类实例
Sep 24 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
Nov 15 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
PHP 获取ip地址代码汇总
Jul 05 PHP
3种方法轻松处理php开发中emoji表情的问题
Jul 18 PHP
php实现简单加入购物车功能
Mar 07 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 PHP
gearman管理工具GearmanManager的安装与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 syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
smarty缓存用法分析
2014/12/16 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
vue车牌号校验和银行校验实战
2019/01/23 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
Python中生成器和yield语句的用法详解
2015/04/17 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
八年级英语教学反思
2014/01/09 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
秋季运动会稿件
2014/01/30 职场文书
文化活动实施方案
2014/03/28 职场文书
寄语学生的话
2014/04/10 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
李开复演讲稿
2014/05/24 职场文书
应用外语系自荐信
2014/06/26 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书