До сегодняшнего дня я думал, что у меня довольно хорошее понимание того, как работает статический модификатор. Я знаю, что (в терминах laymans) статическая переменная в функции не "reset" через вызовы этой функции, и я знаю, что статические переменные и функции в классе доступны, вызывая их через сам класс (не экземпляр класса).
Моя проблема заключается в следующем: сегодня я обнаружил, что если я объявляю статическую переменную внутри нестатической функции в классе, все экземпляры этого класса разделяют эту статическую переменную в отдельных вызовах функции-члена.
Например:
class A {
public function GetValue() {
static $value = 0;
$value++;
return $value;
}
}
$instance_1 = new A();
$instance_2 = new A();
echo $instance_1->GetValue();
echo $instance_1->GetValue();
echo $instance_2->GetValue();
echo $instance_2->GetValue();
echo $instance_1->GetValue();
echo $instance_1->GetValue();
Обратите внимание, что функция GetValue не объявляется как статическая или не используется статическим образом (как, например, в самом классе).
Теперь я всегда предполагал, что это будет выводить: 121234
Вместо этого я обнаружил, что он выведет: 123456
Как я уже сказал, я бы это понял, если статическая переменная $value находилась внутри статической функции. Однако, когда он находится внутри нестатической функции, я просто предположил, что он будет "привязан" к функции "внутри" каждой индивидуальной инстанции.
Я думаю, мой вопрос двоякий, затем... 1) это ошибка или ожидаемое поведение? 2) используют ли другие языки эти "статические внутри нестатические" переменные одинаково или это уникально для PHP?