PHP动态方法里面的静态变量

时间:2014-04-24 16:54:09

标签: php dynamic methods static

为什么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();

在方法调用之间存储值(缓存它)的最佳方法是什么?

2 个答案:

答案 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值。

存储价值的最佳方式是什么?这取决于你使用它的目的:

  1. 如果您需要将值设置为方法B的私有值,并且您不介意为$C的每个实例都使用相同的A值,那么这就是去。
  2. 如果您需要该值对A的每个实例都是唯一的,那么将其设为(私有)成员变量(尽管在这种情况下,它可以从A的每个方法访问)