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中GET变量的使用
Oct 09 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
PHP实现页面静态化的超简单方法
Sep 06 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 PHP
在Laravel5中正确设置文件权限的方法
May 22 PHP
TP5框架请求响应参数实例分析
Oct 17 PHP
PHP网页缓存技术优点及代码实例
Jul 29 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 数字左侧自动补0
2008/03/31 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
php的常量和变量实例详解
2017/06/27 PHP
jquery 简单应用示例总结
2013/08/09 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
个人小程序接入支付解决方案
2019/05/23 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
python中ConfigParse模块的用法
2014/09/29 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
文秘自荐信
2014/06/28 职场文书
敬老月活动总结
2014/08/28 职场文书
初中思想品德教学反思
2016/02/24 职场文书