El ejemplo más típico que usaría para explicarlo (como si fuera un curso) es cuando tienes una clase "Cliente" y los atributos "id" y "ultimoId".
El primer atributo es de instancia, lo cual significa que cuando creas la instancia a partir de la clase este será su "entorno de trabajo" (no se me ocurrió otra mejor expresión).
Código PHP:
$unClienteBueno = new Cliente();
$unClienteMalo = new Cliente();
El atributo "id" es propio (único) para cada una de esas instancias, pero comparten el "diseño fundamental" por venir del mismo "modelo base" (la Clase). No se ven entre ellos, no se comparten entre objetos del mismo tipo.
Pero si tu creas un "ultimoId" estático, este atributo se compartirá con todas las instancias de la misma clase.
Nota: prefiero usar el termino
"atributo de clase" que es más claro que decir "estático".
Si le aplicas la siguiente lógica verás su utilidad:
Código PHP:
<?php
class Cliente{
static $ultimoId = 0;
private $id;
public function __construct(){
$this->id = ++self::$ultimoId;
}
public function __toString(){
return " ".$this->id;
}
}
$unClienteBueno = new Cliente();
$unClienteMalo = new Cliente();
echo $unClienteBueno, $unClienteMalo;
?>
Nota importante: hay que tener en cuenta que en PHP, como en todos los lenguajes de scripting web, una vez terminado de ejecutar, desaparecen todos los datos, objetos, etc, y si vuelves a iniciar la página todo inicia otra vez de cero.
La forma de mantenerlo es persistir de alguna manera la información, pero eso ya escapa a la pregunta original.
Referencias sobre la persistencia y el entorno "stateless" en este mismo foro: