Por que não há facilidade para sobrecarregar propriedades estáticas no PHP?

13

Introdução

O PHP permite sobrecarregar chamadas de métodos e acessos de propriedades , declarando métodos mágicos nas classes. Isso permite códigos como:

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

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

Além de sobrecarregar as propriedades e métodos da instância, desde o PHP 5.3.0 também podemos sobrecarregar as staticchamadas de métodos, substituindo o método mágico __callStatic.

Algo faltando

O que está conspicuamente faltando na funcionalidade disponível é a capacidade de sobrecarregar propriedades estáticas , por exemplo:

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

Esta limitação está claramente documentada :

A sobrecarga de propriedade funciona apenas no contexto do objeto. Esses métodos mágicos não serão acionados em contexto estático. Portanto, esses métodos não devem ser declarados static. A partir do PHP 5.3.0, um aviso é emitido se um dos métodos mágicos de sobrecarga for declarado static.

Mas por que?

Minhas perguntas são:

  1. Existe um motivo técnico para que essa funcionalidade não seja suportada atualmente? Ou talvez uma razão política (estremecer)?
  2. Houve alguma tentativa abortada de adicionar essa funcionalidade no passado?

Mais importante ainda, a questão não é "como posso ter propriedades estáticas dinâmicas no PHP do usuário?". Dito isto, se você conhece uma implementação especialmente interessante com base na __callStaticqual deseja compartilhar, faça isso de qualquer maneira.

Jon
fonte

Respostas:

11

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

Sobrecarga de membro estático foi adicionada no PHP 5.3? Notei que a sobrecarga de método estático era (__callStatic). Os dois se complementariam e parece natural adicioná-los também. Eu notei que eles fazem parte da RFC de "classe estática" e de um relatório de bug, mas seria bom ver isso na versão 5.3. Com esta adição e LSB, as classes php podem fazer muito! Ex:

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

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

se o RFC para classes estáticas for aceito, os interceptores de propriedades estáticas farão parte da próxima versão principal do PHP (pode ser 5.4 ou 6). Portanto, não chegará à versão 5.3, mas esperamos isso no futuro.

Link para Classes estáticas RFC:

O status da RFC está "em obras", mas, como é de 2008, você pode perguntar na lista de discussão php.internals ou no # php.pecl no EFNet IRC para descobrir o que aconteceu com ela.

Gordon
fonte
Obrigado, Gordon, muito útil, como sempre. ;-) Embora o RFC de classes estáticas pareça propor suporte para __getStatic()e __setStatic()nas classes estáticas , ainda assim seria útil ter essa funcionalidade para classes instantâneas. Você está ciente de algum movimento nessa direção?
David Weinraub 28/05
@DavidWeinraub não, desculpe. Tbh, eu não me importo com coisas relacionadas a métodos estáticos. Quase nunca encontro um bom uso para eles e eles levam a um acoplamento ruim e a testes dolorosos.
28513 Gordon
Concordo absolutamente! ;-) Mas algumas estruturas que são lançadas sobre mim usam estática para sua camada de modelo. __getStatic()me permitiria secar muito do meu código existente. Obrigado!
David Weinraub 28/05