¿Por qué no hay posibilidad de sobrecargar las propiedades estáticas en PHP?

13

Introducción

PHP le permite sobrecargar llamadas a métodos y accesos a propiedades declarando métodos mágicos en clases. Esto habilita códigos como:

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

Además de sobrecargar las propiedades y los métodos de la instancia, desde PHP 5.3.0 también podemos sobrecargar las staticllamadas a métodos anulando el método mágico __callStatic.

Algo falta

Lo que falta notablemente de la funcionalidad disponible es la capacidad de sobrecargar las propiedades estáticas , por ejemplo:

echo Foo::$missingProperty; // fatal error: access to undeclared static property

Esta limitación está claramente documentada :

La sobrecarga de propiedades solo funciona en el contexto del objeto. Estos métodos mágicos no se activarán en un contexto estático. Por lo tanto, estos métodos no deben declararse static. A partir de PHP 5.3.0, se emite una advertencia si se declara uno de los métodos de sobrecarga mágica static.

¿Pero por qué?

Mis preguntas son:

  1. ¿Existe alguna razón técnica por la cual esta funcionalidad no sea compatible actualmente? ¿O tal vez una razón política (estremecimiento)?
  2. ¿Ha habido intentos fallidos de agregar esta funcionalidad en el pasado?

Lo que es más importante, la pregunta no es "¿cómo puedo tener propiedades estáticas dinámicas en PHP y el usuario?". Dicho esto, si conoce una implementación especialmente linda basada en __callStaticeso que desea compartir, hágalo por todos los medios.

Jon
fuente

Respuestas:

11

Citando http://marc.info/?l=php-internals&m=121578194822276&w=2

¿Se agregó la sobrecarga de miembros estáticos en PHP 5.3? Noté que la sobrecarga del método estático era (__callStatic). Los dos se complementarían entre sí y parece natural agregarlos también. Me di cuenta de que están separados del RFC de "clase estática" y de un informe de error, pero sería bueno verlos en 5.3. Con esta adición y LSB, ¡las clases de php pueden hacer mucho! Ex:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

Seguimiento de citas http://marc.info/?l=php-internals&m=121578318524848&w=2

Si se acepta el RFC para las clases estáticas, los interceptores de propiedad estática serán parte de la próxima versión principal de PHP (podría ser 5.4 o 6). Por lo tanto, no llegará a 5.3, pero con suerte lo tendremos en el futuro.

Enlace a clases estáticas RFC:

El estado del RFC está "en proceso", pero dado que es de 2008, es posible que desee consultar en la lista de correo php.internals o en # php.pecl en EFNet IRC para averiguar qué ha sido de él.

Gordon
fuente
Gracias, Gordon, muy útil, como siempre. ;-) Si bien el RFC de clases estáticas parece proponer soporte para __getStatic()y __setStatic()sobre clases estáticas , aún sería útil tener esta funcionalidad para clases instanciables. ¿Eres consciente de algún movimiento en esta dirección?
David Weinraub
@DavidWeinraub no, lo siento. Tbh, no me importan las cosas relacionadas con los métodos estáticos. Casi nunca encuentro un buen uso para ellos y conducen a un mal acoplamiento y pruebas dolorosas.
Gordon
¡Totalmente de acuerdo! ;-) Pero algunos marcos que se me imponen usan estadísticas para su capa de modelo. __getStatic()me permitiría SECAR mucho de mi código existente. ¡Gracias!
David Weinraub