PHP中的静态变量

mik*_*ike 30 php variables static

我在PHP中找到了有关静态变量的不同信息,但实际上没有解释它是什么以及它是如何工作的.

我已经读过,当在一个类中使用时,静态属性不能被该类实例化的任何对象使用,并且静态方法可以被类实例化的对象使用?

但是,我一直在尝试研究静态变量在一个不在类中的函数中的作用.另外,函数中的静态变量是否有点像javascript中的闭包,或者我完全偏离这个假设?

Nul*_*ion 39

我已经读过,当在一个类中使用时,该类实例化的任何对象都不能使用静态属性

这取决于你的意思.例如:

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
Run Code Online (Sandbox Code Playgroud)

并且一个静态方法可以被类实例化的对象使用???

是的,属于该类的实例化对象可以访问静态方法.

static类的上下文中的关键字在某种程度上与其他语言中的静态类变量一样.声明的成员(方法或变量)static与类关联,而不是与该类的实例关联.因此,您可以在没有类的实例的情况下访问它(例如:在上面的示例中,我可以使用Foo::$my_var)


但是,我一直在尝试研究静态变量在一个不在类中的函数中的作用.

另外,函数中的静态变量是否有点像javascript中的闭包,或者我完全偏离了这个假设.

在类之外(即:在函数中),static变量是在函数退出时不会丢失其值的变量.所以从某种意义上说,它们就像JavaScript中的闭包一样工作.

但与JS闭包不同,在同一函数的不同调用中维护的变量只有一个值.从PHP手册的例子:

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

test();  // prints 0
test();  // prints 1
test();  // prints 2
Run Code Online (Sandbox Code Playgroud)

参考:static关键字(在类中),(在函数中)

  • 我不明白这一部分:`但是与JS闭包不同,在同一函数的不同调用中维护的变量只有一个值.在这个意义上,它不完全像*JS闭包吗?这如何算作差异?例如.`var a = 0; function test(){alert(a ++); } test(); 测试(); test();`与你的例子做同样的事情. (4认同)
  • @AsadSaeeduddin 抱歉。`var a=0; 函数测试() { a=0; 警报(a++);} 测试(); 测试(); test();` 重点是,与 JS 不同,PHP 中的内部赋值(第一次之后)没有效果。 (2认同)

con*_*nec 25

static 在PHP中有两个用途:

首先,最常见的是,它可用于定义"类"变量/函数(与实例变量/函数相对),可以在不实例化类的情况下访问它们:

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
Run Code Online (Sandbox Code Playgroud)

其次,它可以用于维护函数调用之间的状态:

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)
//...
Run Code Online (Sandbox Code Playgroud)

请注意,无论函数是否在类中定义,在函数内声明变量static都是一样的,重要的是声明变量的位置(类成员或函数).


Gna*_*r S 11

首先我将解释如果不使用静态变量会发生什么

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

如果运行上面的代码,您得到的输出将是 1 1 1 。因为每次调用该函数变量都会赋值为 1,然后打印它。


现在让我们看看如果使用静态变量会怎样

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

现在,如果运行此代码片段,输出将为 1 2 3。

注意: 静态会在每次调用函数时保留其值并保留。当函数被调用时它不会失去它的值。


小智 7

函数中的静态变量仅在其运行脚本中该函数的第一次调用中初始化.