Я столкнулся с некоторым неожиданным поведением со статическими переменными, определенными в методах объекта, совместно используемых через экземпляры. Это - вероятно, известное поведение, но поскольку я просматриваю документацию PHP, я не могу найти экземпляры статически определенных переменных в методах объекта.
Вот сокращение поведения, с которым я столкнулся:
<?php
class Foo {
public function dofoo() {
static $i = 0;
echo $i++ . '<br>';
}
}
$f = new Foo;
$g = new Foo;
$f->dofoo(); // expected 0, got 0
$f->dofoo(); // expected 1, got 1
$f->dofoo(); // expected 2, got 2
$g->dofoo(); // expected 0, got 3
$g->dofoo(); // expected 1, got 4
$g->dofoo(); // expected 2, got 5
Теперь, я ожидал бы $i
быть статичным на экземпляр, но в действительности $i
совместно используется экземплярами. Для моего собственного наставления кто-то мог уточнить то, почему дело обстоит так, и где оно документируется на php.net?
Это само определение статики.
Если вы хотите, чтобы члены были специфичными для экземпляра объекта, используйте свойства класса
например.
<?php
class Foo
{
protected $_count = 0;
public function doFoo()
{
echo $this->_count++, '<br>';
}
}
Изменить: Хорошо, я связал документацию со статическими свойствами ООП. Однако концепция та же. Если вы прочитаете документы области видимости , вы увидите:
Примечание : статические объявления разрешаются во время компиляции.
Таким образом, когда ваш скрипт компилируется (до его выполнения), статика - это «установка» (не уверен, какой термин использовать). Независимо от того, сколько объектов вы создаете, когда эта функция «построена», статическая переменная ссылается на ту же копию, что и все остальные.
Вот что такое static, это одна и та же переменная для всех экземпляров класса.
Вы хотите написать это так, чтобы переменная была закрытым членом экземпляра класса.
class Foo {
private $i = 0;
public function dofoo() {
echo $this->i++ . '<br>';
}
}
Ключевое слово static может использоваться с переменными или с методами и свойствами класса. Статические переменные были введены в PHP 4 (я думаю, это могло быть и раньше). Статические члены/методы класса были введены в PHP 5.
Итак, согласно руководству, статическая переменная
Другой важной особенностью диапазона переменных является статическая переменная. переменная. Статическая переменная существует только в локальной но она не теряет своего значения, когда выполнение программы покидает эту область.
Это согласуется с описанным вами поведением. Если вам нужна переменная для экземпляра, используйте обычный член класса.