PHP的变量类型和作用域详解

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

从上面的代码中,可知如果一个类成员方法中有静态变量,即使是不同的类实例,他们也会共享这个静态变量,尽管这个静态变量不是类静态成员变量,这点容易让人迷惑。

(0)

相关推荐

  • PHP 变量类型的强制转换

    也就是说,如果把一个字符串值赋给变量 var,var 就成了一个字符串.如果又把一个整型值赋给 var,那它就成了一个整数. PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型. 复制代码 代码如下: <?php $foo = 10; echo "转换前:\$foo=".$foo; //输出一个整数 echo "<br/>" //输出:$foo=10 echo "<br/>";

  • PHP 判断变量类型实现代码

    PHP 包括几个函数可以判断变量的类型,例如:gettype(),is_array(),is_float(),is_int(),is_object() 和 is_string(). 复制代码 代码如下: <?php $s = "this is a string"; $i = 9; $arr = array(2,4,6); is_string($s); //返回TRUE,表示$s是一个字符串变量 is_string($i); //返回FALSE,表示$i不是一个字符串变量 is_a

  • PHP查看当前变量类型的方法

    下面把PHP查看当前变量类型的背景.过程以及解决方案都给大家写整理出来了,具体如下: 解决背景 折腾过程一: 已解决 PHP中的json的json_decode不工作没有任何输出 期间,需要搞懂一个: 复制代码 代码如下: PHP: curl_exec – Manual curl_exec 返回的变量$respJson的类型是什么,是不是string类型. 折腾过程二: 1.搜: 复制代码 代码如下: php check variable type 参考: PHP: gettype – Manu

  • php判断变量类型常用方法

    现在让我们了解下具体的使用方法 gettype() gettype 会根据 参数类型返回下列值 "boolean"(从 PHP 4 起) "integer" "double"(如果是 float 则返回"double",而不是"float") "string" "array" "object" "resource"(从 PHP

  • PHP的变量类型和作用域详解

    PHP中变量的作用域可以分为:超全局(全局变量的特殊类型,在局部范围里可直接使用),全局,局部,静态(是局部变量的特殊类型)在PHP中,全局变量实际上是静态全局变量,如果不用unset显式的释放,那么等脚本运行结束全局变量才会被释放掉局部静态变量细分可以是 局部静态函数变量(函数中声明的static变量),局部静态成员变量(类中声明的 static 属性,被所有类实例共享)局部静态变量只有脚本运行结束才会被自动释放 超全局变量:在一个脚本的任何作用域里都可以被访问,这些都是PHP内置的 复制代码

  • js变量以及其作用域详解

    一.变量的类型 Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量.例如: 复制代码 代码如下: i=100;//Number类型 i="variable";//String类型 i={x:4};//Object类型 i=[1,2,3];//Array类型 JS的这种特性虽然让我们的编码更加灵活,但也带来了一个弊端,不利于Debug,编译器的弱检测让我们维护冗长的

  • 基于java变量和作用域以及成员变量的默认初始化(详解)

    ava中的变量有成员变量和局部变量,定义在类中方法之外的变量成为成员变量或者成员字段(域),表示一个类所具有的属性,定义为类的成员变量的变量的作用于是整个类,该变量在定义的时候不需要初始化,在使用前java会自动初始化成员变量,对于基本数据类型的的自动初始化如下: java基本类型默认初始化值 int 0 short 0 byte 0 long 0 float 0.0 double 0.0 boolean false char 0 例如: public class test{ private i

  • Python中的变量和作用域详解

    作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:globa,全局变量,就是模块级别定义的变量: B:built-in,系统固定模块里面的变量,比如int, bytearray等. 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB. x = int(2.9) # int bu

  • 关于JS变量和作用域详解

    ECMAScript 变量: 1.基本类型值(简单数据段) 2.引用类型值(可能由过个值构成的对象) → 保存在内存中的对象 ------ 动态属性: 只能给引用型值动态添加新属性,以便将来使用. ------ 复制变量值 : 基本类型值的复制 → 在变量对象上创建一个新值 → 复制给新变量(互不影响) 引用类型值的复制 → 将存储在变量对象中的值复制到新变量分配空间中(复制的是一个指针,指向同一个对象,相互影响) ------ 传递参数: ECMAScript中所有函数的参数都是按值传递 .

  • Python中变量的作用域详解

    目录 1.作用于的概念 2.局部变量 3.全局变量 4.变量的查找 5.作用域中可变数据类型变量 6.多函数程序执行流程 总结 1.作用于的概念 变量作用域指的是变量生效的范围,在Python中一共有两种作用域. 全局作用域 全局作用域在程序执行时创建,在程序执行结束时销毁.所有函数以外的区域都是全局作用域.在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问. 函数作用域 函数作用域在函数调用时创建,在调用结束时销毁.函数每调用一次就会产生一个新的函数作用域(不调用不产

  • Python进阶_关于命名空间与作用域(详解)

    写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空间 1.1 什么是命名空间 Namespace命名空间,也称名字空间,是从名字到对象的映射.Python中,大部分的命名空间都是由字典来实现的,但是本文的不会涉及命名空间的实现.命名空间的一大作用是避免名字冲突: def fun1(): i = 1 def fun2(): i = 2 同一个模块中的两个函数中,两个同名名字i之间绝没有任何

  • 基于Python闭包及其作用域详解

    关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被称为闭包(closure),而这个被内部函数引用的变量则被成为自由变量 闭包和函数调用没多少相关,而是关于使用定义在其他作用域的变量 命名空间和作用域 我们把命名空间看做一个大型的字典类型(Dict),里面包含了所有变量的名字和值的映射关系.在 Python 中,作用域实际上可以看做是"在当前

  • Java面试突击之Bean作用域详解

    目录 1.作用域 2.作用域分类 2.1 singleton 2.2 prototype 2.3 request 2.4 session 2.5 application 3.作用域设置 总结 Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看. PS:Java 中的公共类可称之为 Bean 或 Java Bean. 1.作用域 Bean 的作用域是指 Bean 在

  • TypeScript中定义变量方式以及数据类型详解

    目录 TypeScript定义变量 变量声明格式 变量类型推导 JS和TS的数据类型 TS中使用JS的数据类型 number类型 boolean类型 string类型 Array类型 Object类型 Symbol类型 null和undefined类型 TS自身特有的数据类型 any类型 unknown类型 void类型 never类型 tuple类型 总结 TypeScript定义变量 变量声明格式 我在前面强调过,在TypeScript中定义变量需要指定 标识符 的类型. 所以完整的声明格式

随机推荐