web-dev-qa-db-ja.com

PHPの静的変数

PHPで静的変数に関するさまざまな情報を見つけましたが、実際にそれが何であり、どのように機能するかを実際に説明するものはありません。

クラス内で使用された場合、そのクラスによってインスタンス化されたオブジェクトは静的プロパティを使用できず、クラスによってインスタンス化されたオブジェクトは静的メソッドを使用できることを読んだことがありますか?

しかし、私は静的変数がクラスにない関数内で何をするかを研究しようとしています。また、関数内の静的変数はjavascriptのクロージャーのように機能しますか、この仮定では完全にオフですか?

29
mike

クラス内で使用された場合、そのクラスによってインスタンス化されたオブジェクトは静的プロパティを使用できないことを読みました

それが何を意味するかによります。例えば:

class Foo {
    static $my_var = 'Foo';
}

$x = new Foo();

echo $x::$my_var;  // works fine
echo $x->my_var;   // doesn't work - Notice: Undefined property: Foo::$my_var

そして、クラスによってインスタンス化されたオブジェクトが静的メソッドを使用できること?

はい、クラスに属するインスタンス化されたオブジェクトは静的メソッドにアクセスできます。

クラスのコンテキストでのキーワードstaticは、他の言語の静的クラス変数のように動作します。 staticと宣言されたメンバー(メソッドまたは変数)は、そのクラスのインスタンスではなく、クラスに関連付けられています。したがって、クラスのインスタンスなしでアクセスできます(例:上記の例では、Foo::$my_var


ただし、クラスにない関数内で静的変数が何をするかを調査しようとしています。

また、関数内の静的変数はjavascriptのクロージャーのように機能しますか、この仮定では完全にオフです。

クラス外(関数内など)で、static変数は、関数が終了しても値を失わない変数です。つまり、JavaScriptのクロージャーのように機能します。

ただし、JSクロージャーとは異なり、同じ関数の異なる呼び出しで維持される変数の値は1つだけです。 PHPマニュアルの例から:

function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

test();  // prints 0
test();  // prints 1
test();  // prints 2

リファレンス:staticキーワード (クラス内)(関数内)

38

staticには、PHPで2つの用途があります。

まず、そして最も一般的には、クラスをインスタンス化せずにアクセスできる「インスタンス」変数/関数ではなく、「クラス」変数/関数を定義するために使用できます。

class A {
  public static $var = 'val'; // $var is static (in class context)
  public $other_var = 'other_val'; // non-static
}

echo A::$var; // val
echo A::$other_var // doesn't work (fatal error, undefined static variable)

$a = new A;
echo $a->var // won't work (strict standards)
echo $a->other_var // other_val

次に、関数呼び出し間で状態を維持するために使用できます。

function a() {
  static $i = 0;
  $j = 0;
  return array($i++, $j++);
}
print_r(a()); // array(0, 0)
print_r(a()); // array(1, 0)
print_r(a()); // array(2, 0)
//...

関数内で変数staticを宣言することは、関数がクラスで定義されているかどうかに関係なく同じように機能することに注意してください。重要なのはvariable宣言されています(クラスメンバーまたは関数内)。

24
connec

関数内の静的変数は、実行中のスクリプト内のその関数の最初の呼び出しでのみ初期化されます。

7
young

最初に、静的変数が使用されない場合に何が起こるかを説明します

<?php
function somename() {
    $var = 1;
    echo $var . "<br />";
    $var++;
}
somename();
somename();
somename();
?>

上記のコードを実行すると、出力は1 1 1になります。その関数を呼び出すたびに、変数は1に割り当てられてから印刷されます。


static variableが使用されている場合はどうなるか見てみましょう

<?php
function somename() {
    static $var = 1;
    echo $var . "<br />";
    $var++;
}
somename();
somename();
somename();
?>

このコードスニペットを実行すると、出力は1 2 3になります。

注:静的は、値が保持され、関数が呼び出されるたびに保持されます。関数が呼び出されても値は失われません。

1
Gnanasekar S
class Student {
static $total_student = 0;
static  function add_student(){
    return Student::$total_student++;
}
}

最初:add_student関数のベストプラクティスは、publicではなくstaticを使用することです。 2番目:add_student関数では、Student :: $ total_studentを使用していますが、$ this-> total_studentは使用していません。これは通常の変数とは大きく異なります。第三:静的変数は継承ツリー全体で共有されます。

以下のコードを使用して、結果を確認してください。

class One {
static $foo ;
}
class Two extends One{}
class Three extends One{}
One::$foo = 1;
Two::$foo = 2;
Three::$foo = 3;
echo One::$foo;
echo Two::$foo;
echo Three::$foo;`
0
li bing zhao