Pourquoi n'y a-t-il aucune possibilité de surcharger les propriétés statiques en PHP?

13

Intro

PHP vous permet de surcharger les appels de méthode et les accès aux propriétés en déclarant les méthodes magiques dans les classes. Cela permet un code tel que:

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

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

Outre la surcharge des propriétés et des méthodes d'instance, depuis PHP 5.3.0, nous pouvons également surcharger staticles appels de méthodes en remplaçant la méthode magique __callStatic.

Quelque chose manque

Ce qui manque manifestement dans les fonctionnalités disponibles, c'est la possibilité de surcharger les propriétés statiques , par exemple:

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

Cette limitation est clairement documentée :

La surcharge de propriété ne fonctionne que dans le contexte de l'objet. Ces méthodes magiques ne seront pas déclenchées dans un contexte statique. Par conséquent, ces méthodes ne doivent pas être déclarées static. Depuis PHP 5.3.0, un avertissement est émis si l'une des méthodes de surcharge magique est déclarée static.

Mais pourquoi?

Mes questions sont:

  1. Y a-t-il une raison technique pour laquelle cette fonctionnalité n'est pas actuellement prise en charge? Ou peut-être une raison politique (frémissante)?
  2. Y a-t-il eu des tentatives avortées d'ajouter cette fonctionnalité dans le passé?

Plus important encore, la question n'est pas "comment puis-je avoir des propriétés statiques dynamiques dans PHP userland?". Cela dit, si vous connaissez une implémentation particulièrement mignonne basée sur ce __callStaticque vous souhaitez partager, faites-le par tous les moyens.

Jon
la source

Réponses:

11

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

La surcharge des membres statiques a-t-elle été ajoutée en PHP 5.3? J'ai remarqué que la surcharge de méthode statique était (__callStatic). Les deux se compléteraient et il semble tout simplement naturel de les ajouter également. J'ai remarqué qu'ils sont en dehors du RFC "de classe statique" et d'un rapport de bogue, mais ce serait bien de les voir en 5.3. Avec cet ajout et LSB, les classes php peuvent faire tellement! Ex:

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

Suivi des citations http://marc.info/?l=php-internals&m=121578318524848&w=2

si le RFC pour les classes statiques sera accepté, les intercepteurs de propriétés statiques feront partie de la prochaine version majeure de PHP (peut-être 5.4 ou 6). Donc, cela ne sera pas inclus dans 5.3, mais nous l'espérerons à l'avenir.

Lien vers les classes statiques RFC:

Le statut de la RFC est "en préparation" mais étant donné que c'est à partir de 2008, vous voudrez peut-être demander sur la liste de diffusion php.internals ou sur # php.pecl sur EFNet IRC pour savoir ce qu'il en est advenu.

Gordon
la source
Merci, Gordon, très utile, comme d'habitude. ;-) Bien que le RFC sur les classes statiques semble proposer le support pour __getStatic()et __setStatic()sur les classes statiques , il serait toujours utile d'avoir cette fonctionnalité pour les classes instanciables. Êtes-vous au courant de mouvements dans cette direction?
David Weinraub
@DavidWeinraub non, désolé. Tbh, je me fiche des choses liées aux méthodes statiques. Je ne leur trouve presque jamais une bonne utilisation et cela conduit à un mauvais couplage et à des tests douloureux.
Gordon
Tout à fait d'accord! ;-) Mais certains frameworks qui me sont imposés utilisent la statique pour leur couche modèle. __getStatic()me permettrait de sécher beaucoup de mon code existant. Merci!
David Weinraub