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

PHP static 静态变量和属性方法使用说明

May 25, 2016 pm 04:44 PM
static pembolehubah statik

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

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

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

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

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

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

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

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

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

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

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

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

例子 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;
}
?>
Salin selepas log masuk

全局和静态变量的引用

在 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);
?>
Salin selepas log masuk

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

NULL 
object(stdClass)(0) { 
}
Salin selepas log masuk

类似的行为也适用于 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();
?>
Salin selepas log masuk

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

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

上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &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:
?>
Salin selepas log masuk

函数外和内都有变量$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
?>
Salin selepas log masuk

首先,我们看函数外的$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
?>
Salin selepas log masuk

上例中,变量$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;
}
?>
Salin selepas log masuk

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

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


教程链接:

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah mekanisme pembolehubah statik bagi fungsi PHP? Apakah mekanisme pembolehubah statik bagi fungsi PHP? Apr 10, 2024 pm 09:09 PM

Mekanisme pembolehubah statik fungsi PHP membolehkan pembolehubah mengekalkan nilainya di antara panggilan fungsi, dengan itu mencapai fungsi berikut: Mengekalkan keadaan antara panggilan fungsi. Elakkan membuat pembolehubah pendua. Permudahkan kod.

Apakah fungsi dan penggunaan statik dalam bahasa C Apakah fungsi dan penggunaan statik dalam bahasa C Jan 31, 2024 pm 01:59 PM

Peranan dan penggunaan statik dalam bahasa C: 1. Skop pembolehubah; 3. Fungsi dalaman 4. Ubah suai fungsi; Jika terdapat kata kunci statik di hadapan pembolehubah, maka skop pembolehubah adalah terhad kepada fail di mana ia diisytiharkan Dalam erti kata lain, pembolehubah adalah "skop peringkat fail", yang sangat berguna untuk mencegah masalah "definisi pendua" pembolehubah; 2. Kitaran hayat, pembolehubah statik dimulakan sekali apabila program mula dilaksanakan, dan dimusnahkan apabila program tamat, dsb.

Cara menggunakan statik, ini, super, dan akhir di Jawa Cara menggunakan statik, ini, super, dan akhir di Jawa Apr 18, 2023 pm 03:40 PM

1. statik Sila lihat program berikut dahulu: publicclassHello{publicstaticvoidmain(String[]args){//(1)System.out.println("Hello, world!");//(2)}} Pernah melihat ini Program segmen biasa kepada kebanyakan orang yang telah mempelajari Java. Walaupun anda belum mempelajari Java tetapi telah mempelajari bahasa peringkat tinggi yang lain, seperti C, anda seharusnya dapat memahami maksud kod ini. Ia hanya mengeluarkan "Hello, dunia" dan tidak mempunyai kegunaan lain Walau bagaimanapun, ia menunjukkan tujuan utama kata kunci statik.

Senario aplikasi praktikal dan kemahiran penggunaan kata kunci statik dalam bahasa C Senario aplikasi praktikal dan kemahiran penggunaan kata kunci statik dalam bahasa C Feb 21, 2024 pm 07:21 PM

Senario aplikasi praktikal dan kemahiran penggunaan kata kunci statik dalam bahasa C 1. Gambaran keseluruhan statik ialah kata kunci dalam bahasa C, digunakan untuk mengubah suai pembolehubah dan fungsi. Fungsinya adalah untuk mengubah kitaran hayat dan keterlihatannya semasa program berjalan, menjadikan pembolehubah dan fungsi statik. Artikel ini akan memperkenalkan senario aplikasi praktikal dan teknik penggunaan kata kunci statik, dan menggambarkannya melalui contoh kod tertentu. 2. Pembolehubah statik memanjangkan kitaran hayat pembolehubah Menggunakan kata kunci statik untuk mengubah suai pembolehubah tempatan boleh memanjangkan kitaran hayatnya.

Peranan statik Peranan statik Jan 24, 2024 pm 04:08 PM

Fungsi statik: 1. Pembolehubah; 3. Kegunaan lain 5. Pengoptimuman prestasi; Pengoptimuman Reka Letak Memori; 11. Elakkan pemulaan berulang; Pengenalan terperinci: 1. Pembolehubah, pembolehubah statik Apabila pembolehubah diisytiharkan sebagai statik, ia tergolong dalam peringkat kelas, bukan peringkat contoh, yang bermaksud bahawa tidak kira berapa banyak objek yang dicipta, hanya satu pembolehubah statik wujud, dan semua objek. kongsi pembolehubah Statik ini dan sebagainya.

Apakah kaedah statik php Apakah kaedah statik php Oct 31, 2022 am 09:40 AM

"statik" dalam kaedah statik statik php bermakna sifat dan kaedah ini boleh dipanggil terus tanpa membuat instantiating kelas adalah kata kunci yang digunakan untuk mengubah suai sifat dan kaedah kelas, dan sintaks penggunaannya adalah seperti "kelas Foo {; public static $my_static = 'hello';}".

Cara menggunakan pengubah suai Java abstrak, statik dan muktamad Cara menggunakan pengubah suai Java abstrak, statik dan muktamad Apr 26, 2023 am 09:46 AM

Abstrak pengubah suai (abstrak) 1. Abstrak boleh mengubah suai kelas (1) Kelas yang diubah suai oleh abstrak dipanggil kelas abstrak (2) Sintaks: nama kelas abstractclass {} (3) Ciri: Kelas abstrak tidak boleh mencipta objek secara berasingan, tetapi mereka boleh diisytiharkan Rujukan nama rujukan kelas abstrak; (4) Kelas abstrak boleh mentakrifkan pembolehubah ahli dan kaedah ahli (5) Kelas abstrak mempunyai pembina Apabila digunakan untuk mencipta objek subkelas, jvm mencipta objek kelas induk secara lalai apply Digunakan apabila jvm mencipta objek kelas induk. 2. Abstrak boleh mengubah suai kaedah (1) Kaedah yang diubah suai oleh asbtract dipanggil kaedah abstrak (2) Sintaks: pengubah akses nilai pulangan abstrak

Cara Springboot membaca fail pro tersuai dan menyuntik pembolehubah statik Cara Springboot membaca fail pro tersuai dan menyuntik pembolehubah statik May 30, 2023 am 09:07 AM

Springboot membaca fail pro dan menyuntik pembolehubah statik statik mailConfig.properties#Server mail.host=smtp.qq.com#Port number mail.port=587#Email account mail.userName=hzy_daybreak_lc@foxmail.com#Emel kod kebenaran mel. passWord =vxbkycyjkceocbdc#Masa kelewatan mail.timeout=25000#Pengirim mail.emailForm=hzy_daybreak_lc@foxmail.com#Pengirim mai

See all articles