Статичный в нестатическом методе совместно используется экземплярами

Я столкнулся с некоторым неожиданным поведением со статическими переменными, определенными в методах объекта, совместно используемых через экземпляры. Это - вероятно, известное поведение, но поскольку я просматриваю документацию 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?

5
задан Annika Backstrom 23 February 2010 в 20:19
поделиться

3 ответа

Это само определение статики.

Если вы хотите, чтобы члены были специфичными для экземпляра объекта, используйте свойства класса

например.

<?php

class Foo
{
    protected $_count = 0;
    public function doFoo()
    {
        echo $this->_count++, '<br>';
    }
}

Изменить: Хорошо, я связал документацию со статическими свойствами ООП. Однако концепция та же. Если вы прочитаете документы области видимости , вы увидите:

Примечание : статические объявления разрешаются во время компиляции.

Таким образом, когда ваш скрипт компилируется (до его выполнения), статика - это «установка» (не уверен, какой термин использовать). Независимо от того, сколько объектов вы создаете, когда эта функция «построена», статическая переменная ссылается на ту же копию, что и все остальные.

6
ответ дан 13 December 2019 в 22:06
поделиться

Вот что такое static, это одна и та же переменная для всех экземпляров класса.

Вы хотите написать это так, чтобы переменная была закрытым членом экземпляра класса.

class Foo {
  private $i = 0;
  public function dofoo() {
    echo $this->i++ . '<br>';
  }
}
1
ответ дан 13 December 2019 в 22:06
поделиться

Ключевое слово static может использоваться с переменными или с методами и свойствами класса. Статические переменные были введены в PHP 4 (я думаю, это могло быть и раньше). Статические члены/методы класса были введены в PHP 5.

Итак, согласно руководству, статическая переменная

Другой важной особенностью диапазона переменных является статическая переменная. переменная. Статическая переменная существует только в локальной но она не теряет своего значения, когда выполнение программы покидает эту область.

Это согласуется с описанным вами поведением. Если вам нужна переменная для экземпляра, используйте обычный член класса.

1
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

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