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和ACCESS写聊天室(八)
Oct 09 PHP
PHP 中执行排序与 MySQL 中排序
Apr 21 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
php实现插入排序
Mar 29 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
php array_keys 返回数组的键名
Oct 25 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 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 如何向 MySQL 发送数据
2006/10/09 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
Javascript 继承机制实例
2009/08/12 Javascript
javascript事件问题
2009/09/05 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
js判断节假日实例代码
2017/12/27 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python:接口间数据传递与调用方法
2018/12/17 Python
python画双y轴图像的示例代码
2019/07/07 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
学雷锋演讲稿
2014/03/04 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
委托公证书范本
2014/04/03 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Python图片检索之以图搜图
2021/05/31 Python