Hasta hoy, creía tener un buen conocimiento de cómo funcionaba el modificador estático. Sé que (en términos simples) una variable estática en una función no se "restablece" en llamadas a esa función, y sé que se puede acceder a las variables y funciones estáticas en una clase invocandolas a través de la clase (no una instanciación) de la clase).PHP y variables estáticas en las funciones de miembro de objeto
Mi problema es el siguiente: hoy he encontrado que si declara una variable estática dentro de una función no estático en una clase, todas las instancias de esa clase comparten esa variable estática en llamadas separadas a la función miembro .
Por ejemplo:
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();
en cuenta que la función GetValue no es ni declara como estática o utilizar de una manera estática (como en, pidió a la clase misma).
Ahora, siempre asumí que esto seria: 121234
En su lugar, me parece que seria: 123456
Como digo, me entiende esto si el valor de $ variable estática estaba dentro de una función estática. Sin embargo, al estar dentro de una función no estática, asumí que solo estaría 'atada' a la función 'dentro' de cada instanciación individual.
Supongo que mi pregunta es doble, entonces ... 1) ¿Es esto un error o un comportamiento esperado? 2) ¿otros idiomas tratan estas variables "estáticas dentro de no estáticas" de la misma manera, o esto es exclusivo de PHP?
He visto varias preguntas sobre SO sobre el comportamiento de 'static' en PHP. Parecería que este es un área que carece de documentación, ya sea en cantidad o calidad. –
* (referencia) * [variables estáticas] (http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static) – Gordon
eso es chupe. Pensé que "estático" en este caso significa que la variable no se restablecerá para este "objeto", pero no para la "clase". Nuevamente comportamiento anti-intuitivo. Y si en otros idiomas el comportamiento es el mismo, todos son idiotas estúpidos. Este método no es estático, por lo que el método pertenece a la instancia del objeto. La variable pertenece al método, por lo que la variable debe pertenecer solo al objeto, no a la clase. Ahh ... –