1

Why there are static variables inside dynamic methods in PHP? I supposed to use static to store value between method calls, but discovered that static vars are just like static fields (members) of class.

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();

What is the best way to store value (cache it) between method's call?

1

2 Answers 2

3

A static variable is similar to a static member. One minor difference is that it's scoped to the function you've declared it in.

Keep in mind that static members have one other property: they are shared over all instances of a class. Sample code:

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!

This is problematic. My recommendation is: don't use static variables. Just have a private non-static member:

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

If you need to cache a value make that it's own entity:

$cache = new ValueProvider();
$a = new A($cache);
$a2 = new A($cache);

Now A doesn't need to know how ValueProvider get's the value, or even that it's cached. $a and $a2 share their ValueProvider, but they don't know about that, and that's good.

Sign up to request clarification or add additional context in comments.

Comments

0

In the code you've given, the variable $C maintains it's value between successive calls to function B(). It is also private to the function B(). Note, however, that it is truly static - every instance of A will have the same value of $C in it's method B.

The best way to store the value? That depends on what you're using it for:

  1. If you need the value to be private to method B and you don't mind having the same value of $C for every instance of A, then this is the way to go.
  2. If you need the value to be unique to every instance of A, then make it a (private) member variable (although in this case, it will be accessible from every method of A).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.