search
Homephp教程php手册PHP static 静态变量和属性方法使用说明

变量与其它变量明确区别的,下面我来给各位介绍 static 静态变量和属性方法及静态变量的引用与静态函数的用法,各位有需要了解的同学可参考.

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

例子 7-4.演示需要静态变量的例子,代码如下:

<?php
function Test() {
    $a = 0;
    echo $a;
    $a++;
}
?>

本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 "0",将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了,要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的.

例子 7-5. 使用静态变量的例子,代码如下:

<?php
function Test() {
    static $a = 0;
    echo $a;
    $a++;
}
?>

现在,每次调用 Test() 函数都会输出 $a 的值并加一.

静态变量也提供了一种处理递归函数的方法,递归函数是一种调用自己的函数,写递归函数时要小心,因为可能会无穷递归下去,必须确保有充分的方法来中止递归,一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止.

例子 7-6,静态变量与递归函数,代码如下:

<?php
function Test() {
    static $count = 0;
    $count++;
    echo $count;
    if ($count < 10) {
        Test();
    }
    $count--;
}
?>

注:静态变量可以按照上面的例子声明,如果在声明中用表达式的结果对其赋值会导致解析错误.

例子 7-7.声明静态变量,代码如下:

<?php
function foo() {
    static $int = 0; // correct
    static $int = 1 + 2; // wrong  (as it is an expression)
    static $int = sqrt(121); // wrong  (as it is an expression too)
    $int++;
    echo $int;
}
?>

全局和静态变量的引用

在 Zend 引擎 1 代,驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的,例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用,这有可能导致预料之外的行为,如以下例子所演示的,代码如下:

<?php
function test_global_ref() {
    global $obj;
    $obj = & new stdclass;
}
function test_global_noref() {
    global $obj;
    $obj = new stdclass;
}
test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>

执行以上例子会导致如下输出,代码如下:

NULL 
object(stdClass)(0) { 
}

类似的行为也适用于 static 语句,引用并不是静态地存储的,代码如下:

<?php
function &get_instance_ref() {
    static $obj;
    echo "Static object: ";
    var_dump($obj);
    if (!isset($obj)) {
        // 将一个引用赋值给静态变量
        $obj = & new stdclass;
    }
    $obj->property++;
    return $obj;
}
function &get_instance_noref() {
    static $obj;
    echo "Static object: ";
    var_dump($obj);
    if (!isset($obj)) {
        // 将一个对象赋值给静态变量
        $obj = new stdclass;
    }
    $obj->property++;
    return $obj;
}
$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>

执行以上例子会导致如下输出:

Static object: NULL 
Static object: NULL 
 
Static object: NULL 
Static object: object(stdClass)(1) { 
  ["property"]=> 
  int(1) 
}

上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住.

注:

1.函数外部声明静态变量意义不大,函数内部声明静态变量受限于作用域,函数外部不能修改函数内部静态变量.

2.引用变量,也是变量,只不过它的值是变量的内存地址.

php保留字 global和static,代码如下:

<?php
$i = $j = 8;
function global_var() {
    global $j, $b;
    $c = $j = $b = $i = 4;
}
global_var();
echo "i:$i, j:$j b:$b c:$c n"; //i:8, j:4 b:4 c:
?>

函数外和内都有变量$i,但是他们二个是完全不同的变量,函数外的$i是全局变量,该内存空间直到脚本运行结束后才会被释放,函数内的$i是局部变量,程序流经过函数的时候,初始化,退出函数的时候,内存被系统回收,再次调用函数,则再次分配内存空间和回收内存空间,二次分配的内存空间有可能是同一内存地址,也有可能不能同一内存地址.

与$i不同的是$j,通过关键字global将局部变量"转为"全局变量,当调用函数global_var()的时候,并不会重新给$j分配内存空间,同样的,可以在函数外打印$b,却不能打印$c是因为$b是全局变量,不会被销毁,而$c则不能打印,$c已经不存在了,在退出函数就给销毁了,代码如下:

<?php
$a = 2;
static $b = 2;
static $c = 3;
function global_var() {
    static $i, $c;
    global $j, $a;
    $c = $a = $b = $i = $j = 4;
}
global_var();
echo "a:$a b:$b c:$c i:$i j:$j"; //a:4 b:2 c:3 i: j:4
?>

首先,我们看函数外的$b和$c,即是全局变量又是static变量,这里static修饰没有太大的意义,因为他们都存放在数据段(data-segment),直到脚本运行完了之后才会被回收,然后,我们再看函数里面的$i和$c,函数调用后,$i和$c其实都没有被回收,但是$i输出是NULL和$c输出是3,这是因为他们的作用域是函数内部,不是函数外部,也就是说$i和$c在函数外是不可见的,函数内static变量的意义就在于此,仅函数内部可见且不会被销毁,也就是说,保证函退出函数,变量也不会被回收,但又不会被其它函数修改.(注:函数外和函数内的$c是二个不同的变量)

代码如下:

<?php
function global_var() {
    static $i;
    ++$j;
    ++$i;
    echo "j:$j i:$i n";
}
global_var(); //j:1 i:1
global_var(); //j:1 i:2
global_var(); //j:1 i:3
?>

上例中,变量$j一直都是1,而$i每调用一次就累加1,这是因为,局部变量存放在堆段,每次退出函数时都会被回收,而$i存放在存放在数据段(data-segment),直到程序执行完毕才会被回收,我们平常说的static变量,如果没有特别指明,都说的是函数内部的static变量.

引用函数与static变量

既然static变量要直到脚本执行结束,才会被销毁,那么,有没有办法访问该变量的值呢?我们来看看下面的示例,代码如下:

<?php
get_local_static_var();
$ptr = & get_local_static_var();
get_local_static_var();
++$ptr;
get_local_static_var();
what_i($ptr);
get_local_static_var(); //??
what_p($ptr);
get_local_static_var(); //??
function &get_local_static_var() {
    static $i;
    ++$i;
    echo "i:$i n";
    return $i;
}
function what_i($ptr) {
    $i = & get_local_static_var();
    ++$i;
    ++$ptr;
}
function what_p(&$ptr) {
    $i = & get_local_static_var();
    ++$i;
    ++$ptr;
}
?>

二个凝问号处,分别输出是8和12,这就说明了只要变量没有被销毁,还是可以被访问,我们可以通过引用函数将static变量的地址返回其它函数,其它函数则可通过static变量的地址访问并且修改它的值.

上例第一处??,为什么是8,而不是9,这是因为what_i($ptr)函数,要求参数是按值传递,即此处的$ptr实参值是5,且参数$ptr和全局变量$ptr是二个不同的变量。第二处??的值是12,为什么不是11的道理亦是如此。what_p(&$ptr)函数,要求参数是按引用传递,即此处的$ptr是指向static变量$i的地址,需要注意的是参数$ptr和全局变量$ptr也是二个不同的变量,只不过他们都指向同一个地方.


教程链接:

随意转载~但请保留教程地址★

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PHP 函数的静态变量机制是什么?PHP 函数的静态变量机制是什么?Apr 10, 2024 pm 09:09 PM

PHP函数的静态变量机制允许变量在函数调用之间保留其值,从而实现以下功能:保留函数调用之间的状态。避免创建重复的变量。简化代码。

Java中的static、this、super、final怎么使用Java中的static、this、super、final怎么使用Apr 18, 2023 pm 03:40 PM

一、static  请先看下面这段程序:publicclassHello{publicstaticvoidmain(String[]args){//(1)System.out.println("Hello,world!");//(2)}}看过这段程序,对于大多数学过Java的从来说,都不陌生。即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主

c语言static的作用和用法是什么c语言static的作用和用法是什么Jan 31, 2024 pm 01:59 PM

c语言static的作用和用法:1、变量作用域;2、生命周期;3、函数内部;4、修饰全局变量;5、修饰函数;6、其他用途;详细介绍:1、变量作用域,当一个变量前有static关键字,那么这个变量的作用域被限制在声明它的文件内,也就是说,这个变量是“文件级作用域”,这对于防止变量的“重复定义”问题很有用;2、生命周期,静态变量在程序开始执行时初始化一次,并在程序结束时销毁等等。

static的作用static的作用Jan 24, 2024 pm 04:08 PM

static的作用:1、变量;2、方法;3、类;4、其他用途;5、多线程环境;6、性能优化;7、单例模式;8、常量;9、局部变量;10、内存布局优化;11、避免重复初始化;12、在函数中使用。详细介绍:1、变量,静态变量,当一个变量被声明为static时,它属于类级别,而不是实例级别,这意味着无论创建多少个对象,都只有一个静态变量存在,所有对象都共享这个静态变量等等。

C语言中static关键字的实际应用场景及使用技巧C语言中static关键字的实际应用场景及使用技巧Feb 21, 2024 pm 07:21 PM

C语言中static关键字的实际应用场景及使用技巧一、概述static是C语言中的一个关键字,用于修饰变量和函数。它的作用是改变其在程序运行过程中的生命周期和可见性,使得变量和函数具有静态的特性。本文将介绍static关键字的实际应用场景及使用技巧,并通过具体的代码示例进行说明。二、静态变量延长变量的生命周期使用static关键字修饰局部变量可以将其生命周期

php的static静态方法是什么php的static静态方法是什么Oct 31, 2022 am 09:40 AM

php static静态方法中的“静态”指的是无需对类进行实例化,就可以直接调用这些属性和方法;而static就是一个关键字,用来修饰类的属性及方法,其使用语法如“class Foo {public static $my_static = 'hello';}”。

Java修饰符abstract、static和final怎么用Java修饰符abstract、static和final怎么用Apr 26, 2023 am 09:46 AM

修饰符abstract(抽象的)一、abstract可以修饰类(1)被abstract修饰的类称为抽象类(2)语法:abstractclass类名{}(3)特点:抽象类不能单独创建对象,但是可以声明引用抽象类类名引用名;(4)抽象类可以定义成员变量和成员方法(5)抽象类有构造方法,用于创建子类对象时,jvm默认创建一个父类对象;抽象的构造方法应用在jvm创建父类对象时应用。二、abstract可以修饰方法(1)被asbtract修饰的方法被称为抽象方法(2)语法:访问修饰符abstract返回值

Springboot如何读取自定义pro文件注入static静态变量Springboot如何读取自定义pro文件注入static静态变量May 30, 2023 am 09:07 AM

Springboot读取pro文件注入static静态变量mailConfig.properties#服务器mail.host=smtp.qq.com#端口号mail.port=587#邮箱账号mail.userName=hzy_daybreak_lc@foxmail.com#邮箱授权码mail.passWord=vxbkycyjkceocbdc#时间延迟mail.timeout=25000#发送人mail.emailForm=hzy_daybreak_lc@foxmail.com#发件人mai

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software