PHP static静态局部变量和静态全局变量总结

 更新时间:2016年11月25日 14:59  点击:1503
使用静态局部变量的原因是它不能被外部使用,但是它的值依然在没此使用后保留。虽然使用全局变量可以实现相同的功能,但是它经常会造成意外。 静态局部变量的特点:

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
静态变量——用在函数内,被调用完后,内存不释放,保留最后值,多用来统计累加。

sprintf与print 及printf都是输出字符串,但它们在细节中会有很大的区别,下面本文章就来重点介绍这个问题。

下面是一个示例:四舍五入保留小数点后两位

 代码如下 复制代码

<?php
$num1 = 21;
echo sprintf("%0.2f",$num1)."<br />"; //输出 21.00
$num2 = 16.3287;
echo sprintf("%0.2f",$num2)."<br />"; //输出 16.33
$num3 = 32.12329;
echo sprintf("%0.2f",$num3)."<br />"; //输出 32.12 www.111Cn.net
?>

解释下 %0.2f 的含义:

% 表示起始字符
0 表示空位用0填满
2 表示小数点后必须占两位
f 表示转换成浮点数


转换字符
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
% 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字元。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。

printf与sprintf的区别

1. printf函数:

int printf ( string format [, mixed args [, mixed ...]] )

Produces output according to format , which is described in the documentation for sprintf() .

Returns the length of the outputted string.

 

把文字格式化以后输出,如:

 代码如下 复制代码
$name="hunte";
$age=25;
printf("my name is %s, age %d", $name, $age);

2. sprintf函数:
string sprintf ( string format [, mixed args [, mixed ...]] )

Returns a string produced according to the formatting string format .

 

跟printf相似,但不打印,而是返回格式化后的文字,其他的与printf一样。


3. print函数:

是函数,可以返回一个值,只能有一个参数。

int print ( string arg )

Outputs arg . Returns 1 , always.

 

最后一个数组元素在php中方法有很多,一个是根据长度来取最大下标值,一个是使用end函数,还一个对数据进行排序之后最下标0即可下面我们一起来看看吧。

 代码如下 复制代码


$array=array(1,2,3,4,5);  


echo $array[count($array)-1];//计算数组长度,然后获取数组最后一个元素,如果数组中最后一个元素含有非数字键名,结果可能跟预期不符合  
//适用于键名为数字的数组  


echo '<br>';  
echo end($array);//将数组的内部指针指向最后一个单元,适用于所有数组  


rsort($array);//对数组逆向排序,如果数组中含有字母或汉字,结果可能不符合预期,最适用于数字数组
echo $array[0];


 

删除最后一个元素

 代码如下 复制代码

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);//www.111cn.net
?>
经过此操作后,$stack 将只有 3 个单元:
Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)

在php中header()函数是很大的作用可以发送各种状态代码,也可以实现一些输出下载,下面我们一起来看看一些相关实例吧。

什么是头信息?
这里只作简单解释,详细的自己看http协议。
在 HTTP协议中,服务器端的回答(response)内容包括两部分:头信息(header) 和 体内容,这里的头信息不是HTML中的<head></head>部分,同样,体内容也不是<BODY>< /BODY>。头信息是用户看不见的,里面包含了很多项,包括:服务器信息、日期、内容的长度等。而体内容就是整个HTML,也就是你所能看见的全 部东西。

头信息有什么用呢?
头信息的作用很多,最主要的有下面几个:

1、跳转:当浏览器接受到头信息中的 Location: xxxx 后,就会自动跳转到 xxxx 指向的URL地址,这点有点类似用 js 写跳转。但是这个跳转只有浏览器知道,不管体内容里有没有东西,用户都看不到。

2、指定网页的内容: 同样一个XML文件,如果头信息中指定:Content-type: application/xml 的话,浏览器会将其按照XML文件格式解析。但是,如果头信息中是:Content-type: text/xml 的话,浏览器就会将其看作存文本解析。(浏览器不是按照扩展名解析文件的)

3、附件:不知道大家有没 有注意,有些时候在一些网站下载东西,点下载连接以后,结果浏览器将这个附件当成网页打开了,里面显示的都是乱码,这个问题也和头信息有关。有时候浏览器 根据Content-type 来判断是打开还是保存,这样有时就会判断错误(主要是网站设计者忘记写Content-type)。其实,还有一个可以来指定该内容为附件、需要保存,这 个就是:Content-Disposition: attachment; filename=”xxxxx”

在PHP中如何写?
1、跳转:

 代码如下 复制代码
header(“Location: http://www.example.com/”);

2、指定内容:

 代码如下 复制代码
header(‘Content-type: application/pdf’);

3、附件:

 代码如下 复制代码
header(‘Content-type: application/pdf’); // 指定内容格式
header(‘Content-Disposition: attachment; filename=”downloaded.pdf”‘); // 指定内容为附件
readfile(‘original.pdf’); // 打开文件,并输出

最后要提醒大家注意一点,所有头信息都必须在体内容之前,如果一旦有任何输出了的话,header函数写的头信息就没用了。比如,在文件最开头 的<?php 处,如果前面有空格或者有空行,那header函数就没用了(其实可以通过设置:output_buffer来解决,anyway),为什么这样,可以看 看HTTP协议,很简单。

 

 代码如下 复制代码
<?php
//200 正常状态
header('HTTP/1.1 200 OK');
 
// 301 永久重定向,记得在后面要加重定向地址 Location:$url
header('HTTP/1.1 301 Moved Permanently');
 
// 重定向,其实就是302 暂时重定向
header('Location: http://www.111cn.net/');
 
// 设置页面304 没有修改
header('HTTP/1.1 304 Not Modified');
 
// 显示登录框,
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="登录信息"');
echo '显示的信息!';
 
// 403 禁止访问
header('HTTP/1.1 403 Forbidden');
 
// 404 错误
header('HTTP/1.1 404 Not Found');
 
// 500 服务器错误
header('HTTP/1.1 500 Internal Server Error');
 
// 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.111cn.net/ /> 相同)
header('Refresh: 3; url=http://www.111cn.net/');
echo '10后跳转到http://www.111cn.net';
 
// 重写 X-Powered-By 值
header('X-Powered-By: PHP/5.3.0');
header('X-Powered-By: Brain/0.6b');
 
//设置上下文语言
header('Content-language: en');
 
// 设置页面最后修改时间(多用于防缓存)
$time = time() - 60; //建议使用filetime函数来设置页面缓存时间
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');
 
// 设置内容长度
header('Content-Length: 39344');
 
// 设置头文件类型,可以用于流文件或者文件下载
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"');
header('Content-Transfer-Encoding: binary');
readfile('example.zip');//读取文件到客户端
 
//禁用页面缓存
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Pragma: no-cache');
 
//设置页面头信息
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain');
header('Content-Type: image/jpeg');
header('Content-Type: application/zip');
header('Content-Type: application/pdf');
header('Content-Type: audio/mpeg');
header('Content-Type: application/x-shockwave-flash');
//.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富
?>

例,文件下载

 代码如下 复制代码

header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=".$title .".xls ");
header("Content-Transfer-Encoding: binary ");

下在看一个利用fopen,file_get_contents读取本地服务器中.php文件的代码并显示的一些方法总结

如我有两个文件a.php,b.php。

a.php文件中的语句是:

 代码如下 复制代码

<?php
echo “i am a.php”;
?>

现在,我需要在b.php文件显示文件a.php中的源代码,是源代码,如下:

 代码如下 复制代码

<?php
$a_code = file_get_contents(‘a.php’);
echo htmlspecialchars($a_code);//www.111cn.net
?>

重点即在此htmlspecialchars()函数,htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。


再看一实例fopen()函数

 代码如下 复制代码

$file = fopen("a.php","r");

效果与上面也是一样的,当然如果只是要在a.php中显示b.php 我们直接使用inlucde()调用即可

 

 代码如下 复制代码
inlucde('a.php');

即可

如果是想读取远程服务器的.php文件,那么返回的是html内容了,这个不要问为什么否则大家都不写程序了。

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • Vue select 绑定动态变量的实例讲解

    这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
  • 深入理解PHP变量的值类型和引用类型

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • python 实现循环定义、赋值多个变量的操作

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Nest.js环境变量配置与序列化详解

    这篇文章主要给大家介绍了关于Nest.js环境变量配置与序列化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
  • C++变量,常量,数组和字符串详解

    这篇文章主要介绍了C++变量,常量,数组和字符串,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...2021-10-21
  • 在JS中如何使用css变量详解

    这篇文章主要给大家介绍了关于如何在JS中如何使用css变量以及export之javascript关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-09-02
  • 轻松理解Javascript变量的相关问题

    这篇文章主要给大家介绍了关于Javascript变量的相关问题,文中给出了详细的介绍和示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。...2017-01-23
  • C#设置与获取环境变量的方法详解

    这篇文章主要给大家介绍了关于C#设置与获取环境变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-25
  • node.js 全局变量的具体使用

    这篇文章主要介绍了node.js 全局变量的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-15
  • 基于条件变量的消息队列 说明介绍

    本篇文章小编为大家介绍,基于条件变量的消息队列 说明介绍。需要的朋友参考一下...2020-04-25
  • Perl中的特殊内置变量详细介绍

    这篇文章主要介绍了Perl中的特殊内置变量详细介绍,需要的朋友可以参考下...2020-06-29
  • C#静态变量与实例变量实例分析

    这篇文章主要介绍了C#静态变量与实例变量,是深入掌握PHP程序设计所必须掌握的重要概念,需要的朋友可以参考下...2020-06-25
  • Lua判断变量是否为数字、字符串是否可以转换为数字等

    这篇文章主要介绍了Lua判断变量是否为数字、字符串是否可以转换为数字等,本文讲解了Lua 判断是字符还是数字的方法、Lua判断数字的方法、判断可否转换为数字的方法、判断并且准备一个初值的方法,需要的朋友可以参考下...2020-06-30