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制作静态网站的模板框架(一)
Oct 09 PHP
Ha0k 0.3 PHP 网页木马修改版
Oct 11 PHP
php自动加载的两种实现方法
Jun 21 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
Jul 31 PHP
php bootstrap实现简单登录
Mar 08 PHP
PHP面向对象程序设计之类与反射API详解
Dec 02 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 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
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
JS 获取滚动条高度示例代码
2013/10/24 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
python字符串,数值计算
2016/10/05 Python
python 生成器协程运算实例
2017/09/04 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
python实现任意位置文件分割的实例
2018/12/14 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
浅析Python 条件控制语句
2020/07/15 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
物流专业大学生求职信范文
2013/10/28 职场文书
经典大学生求职信范文
2014/01/06 职场文书
企业总经理职责
2014/02/02 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python