¿Por qué no hay facilidad para sobrecargar las propiedades estáticas en PHP?

13

Introducción

PHP le permite sobrecargar las llamadas de método y accesos de propiedad por declarando métodos mágicos en las clases. Esto habilita código 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 instancia, desde PHP 5.3.0 también podemos sobrecargar las llamadas a los métodos static invirtiendo el método mágico __callStatic .

Falta algo

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

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

Esta limitación está claramente documentado :

  

La sobrecarga de propiedades solo funciona en el contexto del objeto. Estos metodos magicos   no se activará en el contexto estático. Por lo tanto estos métodos   No debe ser declarado static . A partir de PHP 5.3.0, se emite una advertencia si   uno de los métodos de sobrecarga mágica se declara static .

Pero ¿por qué?

Mis preguntas son:

  1. ¿Hay alguna razón técnica por la que esta funcionalidad no es compatible actualmente? ¿O quizás una razón política (estremecedor)?
  2. ¿Ha habido intentos fallidos de agregar esta funcionalidad en el pasado?

Lo más importante es que la pregunta no es "¿cómo puedo tener propiedades estáticas dinámicas en PHP de la zona de usuario?". Dicho esto, si conoces una implementación especialmente linda basada en __callStatic que quieras compartir, hazlo por todos los medios.

    
pregunta Jon 20.03.2012 - 11:33

1 respuesta

11

Cotizando enlace

  

¿Se agregó una sobrecarga estática de miembros en PHP 5.3? Me di cuenta de que la estática   La sobrecarga del método fue (__callStatic). Los dos complementarían cada uno   otro y parece natural agregar estos también. Me di cuenta de que   están aparte de la RFC "clase estática" y un informe de error, pero sería   Será bueno ver esto en 5.3. Con esta adición y LSB, las clases de php pueden   hacer mucho! Ej:

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

Seguimiento de citas enlace

  

si se acepta el RFC para clases estáticas, propiedad estática   Los interceptores serán parte de la próxima versión principal de PHP (podría ser   5.4 o 6). Así que no llegará a 5.3, pero tendremos eso con suerte   en el futuro.

Enlace a clases estáticas RFC:

El estado del RFC está "en marcha", 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 pasado. .

    
respondido por el Gordon 20.03.2012 - 12:06

Lea otras preguntas en las etiquetas