PHP 中的静态变量
我在PHP中发现了有关静态变量的不同信息,但没有真正解释它是什么以及它是如何工作的。
我已经读到,当在类中使用时,静态属性不能由该类实例化的任何对象使用,并且静态方法可以由该类实例化的对象使用?
但是,我一直在尝试研究静态变量在不在类中的函数中的作用。另外,函数中的静态变量是否有点像javascript中的闭包,或者我在这个假设中完全偏离了?
我在PHP中发现了有关静态变量的不同信息,但没有真正解释它是什么以及它是如何工作的。
我已经读到,当在类中使用时,静态属性不能由该类实例化的任何对象使用,并且静态方法可以由该类实例化的对象使用?
但是,我一直在尝试研究静态变量在不在类中的函数中的作用。另外,函数中的静态变量是否有点像javascript中的闭包,或者我在这个假设中完全偏离了?
我已经读到,当在类中使用时,静态属性不能由该类实例化的任何对象使用
这取决于你的意思。例如:
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中的闭包,或者我完全偏离了这个假设。
在类之外(即:在函数中),变量是当函数退出时不会丢失其值的变量。所以从某种意义上说,是的,它们就像JavaScript中的闭包一样工作。static
但与 JS 闭包不同,该变量只有一个值,该值在同一函数的不同调用中维护。从 PHP 手册的例子中可以看出:
function test()
{
static $a = 0;
echo $a;
$a++;
}
test(); // prints 0
test(); // prints 1
test(); // prints 2
static
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
其次,它可用于维护函数调用之间的状态:
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)
//...
请注意,无论函数是否在类中定义,在函数中声明变量都是相同的,重要的是变量的声明位置(类成员或函数中)。