Me he encontrado con un comportamiento inesperado con variables estáticas definidas dentro de los métodos de objetos que se comparten entre instancias. Este es probablemente un comportamiento conocido, pero cuando navego por la documentación de PHP no puedo encontrar instancias de variables estáticamente definidas dentro de los métodos de objetos.Estático dentro del método no estático se comparte entre las instancias
Aquí es una reducción del comportamiento que he encontrado:
<?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
Ahora, lo que habría esperado $i
ser estática por ejemplo, pero en realidad $i
es compartida entre las instancias. Para mi propia edificación, ¿podría alguien explicar por qué este es el caso y dónde está documentado en php.net?
Esa documentación es para propiedades y métodos de clases estáticas, no variables estáticas dentro de un método. –
Adam: En PHP5 son uno y lo mismo. Static es estático. – hobodave
En mi opinión, '$ f-> dofoo()' no es el mismo método que '$ g-> dofoo()'. Obviamente, los desarrolladores de PHP no son de la misma opinión. :) –