Consider the following:
class Super
{
static protected $class_var = 0;
public function __construct()
{
static $function_var = 0;
static::$class_var++;
$function_var++;
echo sprintf("class_name : %s, class_var : %s, function_var : %s\n", static::class, static::$class_var, $function_var);
}
public static function test()
{
static $function_var = 0;
static::$class_var++;
$function_var++;
echo sprintf("class_name : %s, class_var : %s, function_var : %s\n", static::class, static::$class_var, $function_var);
}
}
class A extends Super {}
class B extends Super {}
echo "Object calls\n";
new A();
new A();
new B();
echo "Class calls\n";
A::test();
A::test();
B::test();
PHP 7.2.7 ouputs:
Object calls
class_name : A, class_var : 1, function_var : 1
class_name : A, class_var : 2, function_var : 2
class_name : B, class_var : 3, function_var : 3
Class calls
class_name : A, class_var : 4, function_var : 1
class_name : A, class_var : 5, function_var : 2
class_name : B, class_var : 6, function_var : 1
Why do A and B have their own static function var when called on the class. Whereas A and B share the static function var when called on instances. Or more general, how do they exactly work internally?