1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值

2.静态局部变量只会初始化一次

3.静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。

4.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

代码如下 复制代码
function test()
{
    static $var = 5;  //static $var = 1+1;就会报错
    $var++;
    echo $var . ' ';
}
 
 
test(); //2
test(); //3
test(); //4
echo $var; //报错:Notice: Undefined variable: var

关于静态全局变量

代码如下 复制代码
//全局变量本身就是静态存储方式,所有的全局变量都是静态变量
function static_global(){
    global $glo;
    $glo++;
    echo $glo.'<br>';
}
 
static_global(); //1
static_global(); //2
static_global(); //3
echo $glo . '<br>'; //3

$a 将会在包含文件 b.inc 中生效。

代码如下 复制代码

<?php 
    $a = 1; 
    include "b.inc"; 
    ?>

<?php 
    //局部变量测试 
    $s1= "out s1"; //全局变量  
     
    function say(){ 
        $s1 = "in s1"; //局部变量 
        echo "say():$s1"; 
    } 
    say(); //输出局部变量: in s1 
    echo "<br/>"; 
    echo "function out:$s1"; ////输出全局变量:out s1 
     
     
    //static变量测试 
    function count1(){ 
        $num = 0; 
        $num++; 
        echo $num." "; 
    } 
     
    function count2(){ //www.111cn.net
        static $num = 0; 
        $num++; 
        echo $num." "; 
    } 
     
    for($i=0; $i<10; $i++){ 
        count1(); //11 1 1 1 1 1 1 1 1 1  
    } 
    echo "<br/>"; 
    for($i=0; $i<10; $i++){ 
        count2(); //1 2 3 4 5 6 7 8 9 10  
    } 
     
     
    echo "<br/>"; 
     
    //全局变量在函数中运用,加global 
     
    $a="php"; 
    $b = "java"; 
     
    function show(){ 
        echo $a; // 无输出 
        global $b; 
        echo $b; //定义global,输出java 
    } 
    show(); 
    ?>

输出3

代码如下 复制代码
    <?php 
    $a = 1; 
    $b = 2; 
     
    function Sum() 
    { 
        global $a, $b; 
     
        $b = $a + $b; 
    } 
     
    Sum(); 
    echo $b; //3 
    ?>

在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组

代码如下 复制代码

<?php 
    $a = 1; 
    $b = 2; 
     
    function Sum() 
    { 
        $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; 
    } 
     
    Sum(); 
    echo $b; 
    ?>

静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数

代码如下 复制代码

function Test() 
    { 
        static $count = 0; 
     
        $count++; 
        echo $count; //12345678910  
        if ($count < 10) { 
            Test (); 
        } 
        //$count--; 
    } 
    Test();

总结

局部变量——用在函数内,作用域就是所在函数
全局变量——在函数外,作用域在整个php文件(包含了 include 和 require 引入的文件),但在函数中不能读到,除非重新申明为global
静态变量——用在函数内,被调用完后,内存不释放,保留最后值,多用来统计累加。

更多详细内容请查看:http://www.111cn.net/phper/php/57862.htm

PHP static静态局部变量和静态全局变量总结的更多相关文章

  1. 静态局部变量、静态全局变量、extern全局变量、自动变量 札记

    静态局部变量 静态局部变量. 从称呼上我们可以看出,静态局部变量首先是一个局部变量,因此其只在定义它的函数内有效,冠以静态的头衔后,其生存期就被延长了,不会随着函数的返回而被撤销.我们可以这样来理解: ...

  2. static静态全局变量和static静态局部变量

    static静态全局变量: 静态全局变量就是将全局变量变成静态的.如何变?——全局变量加个static. static就是一个存储类说明符,a这个全局变量就成了一个静态全局变量了. 静态全局变量的特点 ...

  3. C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别

    全局变量.局部变量.静态全局变量.静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作 ...

  4. C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 (转)

    1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局 ...

  5. 单片机之静态局部变量static

    HL-1慧静电子 上程序: main.c #include <reg52.h>#include "Timer.h" /********P1口低有效*********** ...

  6. C语言中的静态局部变量

    代码: 0x601070 0x7ffcf44243fc 0x60106c 0x60106c 0x60106c [hu@localhost test]$ cat test.cpp #include &l ...

  7. 静态局部变量(面向过程的static关键字)

    对于一个完整的程序,在内存中的分布情况如下图: 一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区.自动变量一般会随函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量) ...

  8. c语言局部变量 静态局部变量 全局变量与静态全局变量

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  9. C语言 全局变量、静态全局变量、局部变量、静态局部变量

    //test.c #include <stdio.h> extern int global_var; void test_global_var() { global_var++; prin ...

随机推荐

  1. C#连接SQLite数据库方法

    --结合Enterprise Library连接,操作SQLite 企业库是我们常用的框架之一,可以从http://entlib.codeplex.com/下载Enterprise Library 5 ...

  2. 次表面散射(SubSurface Scattering) Shader 【转】

    原文 http://www.azure.com.cn/article.asp?id=231 用深度值近似模拟物体的厚度,厚度越小处透光越多. varying vec4 position;varying ...

  3. git项目添加.gitigore文件

    以前一直没有注意这个文件,最近读到了黄勇的<架构探险>,觉得这个文件还是很有用的. .gitigore文件可以自己配置. 我使用的是书中所用的配置,简洁明了. # Maven # targ ...

  4. [Angular2 Form] Create and Submit an Angular 2 Form using ngForm

    Forms in Angular 2 are essentially wrappers around inputs that group the input values together into ...

  5. 使用贝赛尔曲线画扇形、圆形、弧线、多边形,实现App下载时的动画效果demo

    // // MyView.swift // TestUIBezierPath // // Created by iCodeWoods on 16/5/8. // Copyright © 2016年 i ...

  6. birt 批改导出的文件名【转】

    birt 修改导出的文件名 birt 修改导出的文件名分两种实现方法, 第一种:修改 web.xml 中 配置的 BIRT_FILENAME_GENERATOR_CLASS <!-- Filen ...

  7. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  8. leetcode二分查找问题整理

    自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...

  9. NServiceBus

    官方网站:http://docs.particular.net/nservicebus/      NServiceBus 是一个用于构建企业级 .NET系统的开源通讯框架.它在消息发布/订阅支持.工 ...

  10. 你应该知道的基础 Git 命令

    我们在早先一篇文章中已经快速介绍过 Vi 速查表了.在这篇文章里,我们将会介绍开始使用 Git 时所需要的基础命令. Git Git 是一个分布式版本控制系统,它被用在大量开源项目中.它是在 2005 ...