ホームページ php教程 php手册 PHP static 静态变量和属性方法使用说明

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

May 25, 2016 pm 04:44 PM
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也是二个不同的变量,只不过他们都指向同一个地方.


教程链接:

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP関数の静的変数メカニズムとは何ですか? PHP関数の静的変数メカニズムとは何ですか? Apr 10, 2024 pm 09:09 PM

PHP 関数の静的変数メカニズムにより、変数は関数呼び出し間で値を保持できるため、次の機能が実現されます: 関数呼び出し間の状態の保持。重複した変数の作成は避けてください。コードを簡素化します。

C言語におけるstaticの機能と使い方は何ですか? C言語におけるstaticの機能と使い方は何ですか? Jan 31, 2024 pm 01:59 PM

C 言語における static の役割と使用法: 1. 変数スコープ; 2. ライフサイクル; 3. 内部関数; 4. グローバル変数の変更; 5. 関数の変更; 6. その他の用途; 詳細な紹介: 1. 変数スコープの場合変数の前に static キーワードがある場合、変数のスコープは、変数が宣言されているファイルに制限されます。言い換えると、変数は「ファイル レベルのスコープ」であり、「」の発生を防ぐのに非常に役立ちます。変数の重複定義問題; 2. ライフサイクル、静的変数はプログラム実行開始時に一度初期化され、プログラム終了時に破棄されるなど。

Java で static、this、super、final を使用する方法 Java で static、this、super、final を使用する方法 Apr 18, 2023 pm 03:40 PM

1. static まず次のプログラムを見てください: publicclassHello{publicstaticvoidmain(String[]args){//(1)System.out.println("Hello, world!");//(2)}}セグメント プログラムは、Java を学習したことのあるほとんどの人には馴染みのあるものです。 Java を学習したことがなくても、C などの他の高級言語を学習したことがある場合でも、このコードの意味は理解できるはずです。これは単に「Hello, world」を出力するだけであり、他に用途はありませんが、静的キーワードの主な目的を示しています。

C言語のstaticキーワードの実践的な応用シナリオと使用スキル C言語のstaticキーワードの実践的な応用シナリオと使用スキル Feb 21, 2024 pm 07:21 PM

C 言語の static キーワードの実践的な応用シナリオと使用スキル 1. 概要 static は C 言語のキーワードであり、変数や関数を変更するために使用されます。その機能は、プログラムの実行中にライフサイクルと可視性を変更し、変数と関数を静的にすることです。この記事では、static キーワードの実際のアプリケーション シナリオと使用テクニックを紹介し、具体的なコード例を通じて説明します。 2. 静的変数により変数のライフ サイクルが延長される static キーワードを使用してローカル変数を変更すると、変数のライフ サイクルを延長できます。

静電気の役割 静電気の役割 Jan 24, 2024 pm 04:08 PM

static の機能: 1. 変数; 2. メソッド; 3. クラス; 4. その他の用途; 5. マルチスレッド環境; 6. パフォーマンスの最適化; 7. シングルトン モード; 8. 定数; 9. ローカル変数; 10.メモリ レイアウトの最適化; 11. 繰り返しの初期化を避ける; 12. 関数で使用する。詳細な紹介: 1. 変数、静的変数 変数が静的として宣言されると、その変数はインスタンス レベルではなくクラス レベルに属します。つまり、オブジェクトがいくつ作成されても、静的変数は 1 つだけ存在し、すべてのオブジェクトが存在します。この静的変数などを共有します。

Java 修飾子のabstract、static、finalの使用方法 Java 修飾子のabstract、static、finalの使用方法 Apr 26, 2023 am 09:46 AM

修飾子abstract (abstract) 1. 抽象はクラスを変更できる (1) 抽象によって変更されたクラスを抽象クラスと呼びます (2) 構文: abstractclass クラス名 {} (3) 特徴: 抽象クラスは個別にオブジェクトを作成できませんが、オブジェクトを作成することはできます。宣言される 抽象クラス名の参照名を参照する (4) 抽象クラスはメンバ変数とメンバ メソッドを定義できる (5) 抽象クラスにはコンストラクタがある サブクラス オブジェクトの作成に使用される場合、jvm はデフォルトで親クラス オブジェクトを作成する;抽象コンストラクタ メソッドが適用されるjvm が親クラス オブジェクトを作成するときに適用されます。 2. Abstract はメソッドを変更できる (1) asbtract によって変更されたメソッドを抽象メソッドと呼びます (2) 構文: アクセス修飾子の抽象戻り値

PHPの静的メソッドとは何ですか PHPの静的メソッドとは何ですか Oct 31, 2022 am 09:40 AM

php static static メソッドの「static」は、クラスをインスタンス化せずにこれらのプロパティとメソッドを直接呼び出すことができることを意味します。static は、クラスのプロパティとメソッドを変更するために使用されるキーワードであり、その使用構文は「class Foo { public static $my_static = 'hello';}"。

Springboot がカスタム pro ファイルを読み取り、静的変数を挿入する方法 Springboot がカスタム pro ファイルを読み取り、静的変数を挿入する方法 May 30, 2023 am 09:07 AM

Springboot は pro ファイルを読み取り、静的静的変数 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