Пытаюсь разобраться с областью видимости статических переменных, объявленных внутри методов класса. Чтобы наглядно продемонстрировать ситуацию изобразим для примера три таких класса:
abstract class ParentAbstract
{
public function __construct()
{
static $contructing_counter = 0; // Локальный счётчик конструктора
$this->printValue('$contructing_counter', ++$contructing_counter);
}
public function someMethod()
{
static $method_counter = 0; // Локальный счётчик метода
$this->printValue('$method_counter', ++$method_counter);
}
protected function printValue($variable, $value)
{
echo get_class($this) . ' ' . $variable . ' = ' . $value . '<br />';
}
}
class ChildA extends ParentAbstract
{
}
class ChildB extends ParentAbstract
{
}
Кажется, что поведение локальных статических переменных конструктора и метода должно быть одинаковым, а вот нет — статическая переменная в конструкторе остаётся видимой (сохраняет своё значение) для всех классов потомков, а вот переменная метода у каждого класса оказывается своей.
В этом можно убедиться, выполнив простой пример:
$object_a1 = new ChildA();
$object_a2 = new ChildA();
$object_b1 = new ChildB();
$object_b2 = new ChildB();
$object_a1->someMethod();
$object_a2->someMethod();
$object_b1->someMethod();
$object_b2->someMethod();
Результатом выполнения примера мы получим:
ChildA $contructing_counter = 1
ChildA $contructing_counter = 2
ChildB $contructing_counter = 3
ChildB $contructing_counter = 4
ChildA $method_counter = 1
ChildA $method_counter = 2
ChildB $method_counter = 1
ChildB $method_counter = 2
Хочется понять — почему так?
Update: Среда запуска: PHP 5.2.17 (Windows)