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
php调用dll的实例操作动画与代码分享
Aug 14 PHP
PHP迭代器的内部执行过程详解
Nov 12 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
Sep 30 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
php基于环形链表解决约瑟夫环问题示例
Nov 07 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
Laravel定时任务的每秒执行代码
Oct 22 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 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 ss7.5的数据调用 (笔记)
2010/03/08 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
利用javascript查看html源文件
2006/11/08 Javascript
div移动 输入框不能输入的问题
2009/11/19 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
python制作简单五子棋游戏
2019/06/18 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
英国著名书店:Foyles
2018/12/01 全球购物
大学生四个方面的自我评价
2013/09/19 职场文书
医院护士求职自荐信格式
2013/09/21 职场文书
自我鉴定的范文
2013/10/03 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
五年级学生评语
2014/04/22 职场文书
演讲比赛策划方案
2014/06/11 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python