Поведение статических переменных, объявленных внутри методов класса?

Пытаюсь разобраться с областью видимости статических переменных, объявленных внутри методов класса. Чтобы наглядно продемонстрировать ситуацию изобразим для примера три таких класса:
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)
  • Вопрос задан
  • 4548 просмотров
Пригласить эксперта
Ответы на вопрос 2
AGvin
@AGvin
Ранее тоже с таким сталкивался.
Цытирую:
Дело всё в том, что хоть экземпляра класса у нас два, но класс как код только один. Поэтому статическая переменная внутри конструктора тоже всего одна.

Подробно тут:
http://blog.sjinks.pro/php/547-static-variable-inside-class-method/
Ответ написан
EugeneOZ
@EugeneOZ
Глобальные и статические переменные это постоянный источник багов и утечек памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы