php 函数中使用static变量

 代码如下 复制代码

function sendHeader($num, $rtarr = null)
{    
static $sapi = null;    
if ($sapi === null)
{        
$sapi = php_sapi_name();    
}    
return $sapi++;

看PW源码的时候发现setHeader()函数中使用static关键字,很奇怪,以前也没这样用过。

static用在函数里面,声明一次变量后,如果再次调用这个函数将会在初始值延续,如$sapi这里将累加。

 代码如下 复制代码

?echo sendHeader(1)."<br>";
echo sendHeader(2)."<br>";
echo sendHeader(3)."<br>";

output:

?apache2handler
apache2handles
apache2handlet

  和global有点类似,但不同的是作用域。static只能作用于此函数。

有点意思。需要深入研究。

 

 代码如下 复制代码
class test
{
public static function a(){}
public function b(){}
}
$obj = new test;

调用 代码

 代码如下 复制代码

test::a();
$obj->a();
$obj->b();

变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失

例子 使用静态变量的例子

 代码如下 复制代码
<?php
   function test()
   {
   static $w3sky = 0;
   echo $w3sky;
   $w3sky++;
   }
   ?>

现在,每次调用 test() 函数都会输出 $w3sky 的值并加一。

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

时间: 2024-10-01 14:22:58

php 函数中使用static变量的相关文章

【类中的static变量在栈中吗?】

问题描述 [类中的static变量在栈中吗?] 解决方案 在静态区中,是一个独立的区域,和堆.栈并列的 解决方案二: 数据区,跟全局变量等在一个sector 解决方案三: 局部变量: 栈区 局部静态变量:静态区 全局变量: 静态区的常量区 全局静态变量:静态区 内存分四个区:静态区,栈区,堆区,代码区 解决方案四: 当然不在,类中的一切变量都在堆上.堆栈上只有函数的局部变量. 解决方案五: 这个其实很好理解,都不需要死记硬背,也不需要看书. 一说你就明白了.为什么要堆栈?因为函数允许嵌套调用,所

C++中的static变量

虽然是老生常谈,但下面这篇文章还是概括地很全面的. C++中的static有以下三种不同的效果: 当用于成员变量时,表示它将由类分配管理而不是实例. 当在一个函数中时,数据将会被静态分配,在函数第一次被调用时初始化,且一直存在到程序退出.它当然也仅在当前函数中可用.这个特性经常被用于单例的延迟建构.  当在一个编译单元中(如源文件),它可以在本单元中视为全局的,但对于其它单元却是不可见的. 第三种情况会在无命名空间中允许类定义中并未导出的声明 (Use (3) is somewhat disco

python类和函数中使用静态变量的方法

  本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossible]的事, 但总有解决的办法,下面通过实现一个类或函数的累加器来介绍一些较为非主流的方法 方法一.通过类的__init__和__call__方法 ? 1 2 3 4 5 6 7 8 9 10 11 class foo: def __init__(self, n=0): self.n = n d

c语言-C语言:在子函数中修改结构变量中元素的值

问题描述 C语言:在子函数中修改结构变量中元素的值 要写一个处理学生成绩信息的程序,使用单向链表,创建,遍历已经没有问题,但在修改结点的数据时出现问题,输入数据后程序就停止运行. 修改的思路是先根据学号定位到指定结点,然后修改数据,修改函数如下 void Correct(float *a,float *b,float *c,float *d,float *e,float *f) { printf("请依次输入学生正确的的英语 数学 物理 C语言成绩n"); scanf("%f

settimeout-javascript在函数中使用setTimeout变量的作用域问题

问题描述 javascript在函数中使用setTimeout变量的作用域问题 function test1(){ var n = 10; setTimeout("alert(n)", 500); } function test2(){ var n = 10; setTimeout(function(){alert(n)}, 500); } test1(); test2(); 上面的代码中,执行test1会报错,提示n没有定义,执行test2会把10打印出来. 上面两个函数区别在哪里?

模块内的函数体内的static变量问题

问题描述 模块内的函数体内的static变量问题 我想问的是,在模块内的static变量是否又有函数体内跟函数体外之分,意思就是在模块内的某一个函数体内声明的static变量能否被模块内的另一个函数调用? 解决方案 函数体内声明的static变量不能被其他函数所引用,所声明的变量的作用域 只限于这个函数体内

asp.net中的static变量用法介绍

由于我们每次访问ASP.NET页面都是一个全新的对象,而不是我们上一次访问的对象.所以上次页面访问时我们对页面中变量的改动都没有保留.遇到这个问题的时候,很多初学者的直觉就是将这个变量申明为static,自己在测试的时候发现还真的保留住了页面的状态.窃喜之余没有发现这又有引入了另外一个错误.因为你要的只是页面能保留住状态,而这个状态是针对一个客户端的(session的效果).而得到的结果是只要一个客户端改变了该值所有的其他客户端都受到了影响(如同Applicatin的效果).这种情况下,需要的极

ajax异步回调函数中给外部变量赋值的问题探讨_AJAX相关

复制代码 代码如下: <!doctype html> <head> <meta charset="utf-8"> </head> <body> <script src="http://localhost/UIBMSPHPProj/public/js/jquery-1.8.2.min.js"></script> <script> $(function(){ var str

ajax异步回调函数中给外部变量赋值的问题探讨

复制代码 代码如下: <!doctype html> <head> <meta charset="utf-8"> </head> <body> <script src="http://localhost/UIBMSPHPProj/public/js/jquery-1.8.2.min.js"></script> <script> $(function(){ var str