我在PHP中找到了有关静态变量的不同信息,但实际上没有解释它是什么以及它是如何工作的。
我已经读过,当在一个类中使用时,静态属性不能被该类实例化的任何对象使用,并且静态方法可以被类实例化的对象使用?
但是,我一直在尝试研究静态变量在一个不在类中的函数中的作用。另外,函数中的静态变量是否有点像javascript中的闭包,或者我完全偏离了这个假设?
答案 0 :(得分:35)
我已经读过,当在一个类中使用时,该类实例化的任何对象都不能使用静态属性
这取决于你的意思。例如:
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闭包不同,在同一函数的不同调用中维护的变量只有一个值。从PHP手册的例子:
function test()
{
static $a = 0;
echo $a;
$a++;
}
test(); // prints 0
test(); // prints 1
test(); // prints 2
static
关键字(in classes),(in functions) 答案 1 :(得分:23)
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)
//...
请注意,无论函数是否在类中定义,在函数内声明变量static都是一样的,重要的是声明变量的位置(类成员或在功能)。
答案 2 :(得分:7)
函数中的静态变量仅在其运行脚本中该函数的第一次调用中初始化。
答案 3 :(得分:0)
首先,我将解释如果不使用静态变量会发生什么
<?php
function somename() {
$var = 1;
echo $var . "<br />";
$var++;
}
somename();
somename();
somename();
?>
如果您运行上面的代码,您获得的输出将为1 1 1。因为每次调用该函数变量都会分配给1然后打印它。
现在让我们看一下如果使用静态变量
<?php
function somename() {
static $var = 1;
echo $var . "<br />";
$var++;
}
somename();
somename();
somename();
?>
现在,如果您运行此代码段,则输出将为1 2 3。
注意: 静态保留其值,并在每次调用函数时保持不变。调用该函数时,它不会丢失它的值。
答案 4 :(得分:0)
class Student {
static $total_student = 0;
static function add_student(){
return Student::$total_student++;
}
}
首先:对于add_student函数,最佳做法是使用static而不是public。 第二:在add_student函数中,我们使用Student :: $ total_student,而不是使用$ this-&gt; 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;`