为什么PHP中的动态方法中存在静态变量?我应该使用静态来在方法调用之间存储值,但发现静态变量就像类的静态字段(成员)一样。
class A {
public function B() {
static $C;
if (!isset($C) {
$C = rand();
}
echo $C."\n";
}
}
$i1 = new A;
$i1->B();
$i2 = new A;
$i2->B();
在方法调用之间存储值(缓存它)的最佳方法是什么?
答案 0 :(得分:3)
static
变量类似于静态成员。一个小的区别是它的范围是你声明的功能。
请记住,静态成员还有另一个属性:它们在类的所有实例上共享。示例代码:
class A {
function foo () {
static $a = 0;
$a += 1;
var_dump($a);
}
function bar() {
self::$a; // Fatal error: Access to undeclared static property: A::$a
}
}
$a = new A();
$a->foo(); // 1
$a->foo(); // 2
$a2 = new A();
$a2->foo(); // 3!
这是有问题的。我的建议是:不要使用静态变量。只有一个私人非静态成员:
class A {
private $a = 0;
function foo () {
$this->a += 1;
var_dump($this->a);
}
}
$a = new A();
$a->foo(); // 1
$a->foo(); // 2
$a2 = new A();
$a2->foo(); // 1
如果你需要缓存一个值,那就是它自己的实体:
$cache = new ValueProvider();
$a = new A($cache);
$a2 = new A($cache);
现在A
不需要知道ValueProvider
获取值的方式,甚至不知道它是如何缓存的。 $a
和$a2
分享了他们的ValueProvider
,但他们不知道这一点,这很好。
答案 1 :(得分:0)
在您给出的代码中,变量$C
在函数B()
的连续调用之间保持它的值。它也是函数B()的私有。但请注意,它确实是static
- A
的每个实例在其$C
方法中都具有相同的B
值。
存储价值的最佳方式是什么?这取决于你使用它的目的:
B
的私有值,并且您不介意为$C
的每个实例都使用相同的A
值,那么这就是去。A
的每个实例都是唯一的,那么将其设为(私有)成员变量(尽管在这种情况下,它可以从A
的每个方法访问)