O que exatamente são as ligações estáticas tardias no PHP?
fonte
O que exatamente são as ligações estáticas tardias no PHP?
Você definitivamente precisa ler Ligações estáticas tardias no manual do PHP. No entanto, tentarei fornecer um resumo rápido.
Basicamente, tudo se resume ao fato de a self
palavra - chave não seguir as mesmas regras de herança. self
sempre resolve para a classe em que é usado. Isso significa que, se você criar um método em uma classe pai e chamá-lo de uma classe filho, self
não fará referência ao filho como seria de esperar.
A ligação estática tardia introduz um novo uso para a static
palavra - chave, que trata dessa lacuna específica. Quando você usa static
, representa a classe em que você a usa pela primeira vez, ou seja. 'liga' à classe de tempo de execução.
Esses são os dois conceitos básicos por trás disso. A maneira self
, parent
e static
funciona quando static
está em jogo podem ser sutis, então ao invés de ir para mais detalhes, eu recomendo fortemente que você estudar os exemplos de página manual. Depois de entender o básico de cada palavra-chave, os exemplos são bastante necessários para ver que tipo de resultados você obterá.
self
palavra - chave não segue as regras de herança.self
sempre é resolvida para a classe em que é usada." - O que não significa que você não pode chamar o método estático de um pai a partir de um objeto filhoself
, assim como nos métodos não estáticos. Você talvez queira dizer a coisa certa, mas deve reformular isso. Tudo realmente importa apenas quando as crianças nomearem membros de forma idêntica, pois você poderá decidir a quem se referir usandostatic::
.Do PHP: Ligações estáticas tardias - Manual :
Vamos ver um exemplo:
fonte
Não há comportamento muito óbvio:
O código a seguir produz 'alphabeta'.
No entanto, se removermos a declaração da função classname da classe beta, obteremos 'alphaalpha' como resultado.
fonte
Estou citando o livro: "O PHP Master escreve código de ponta".
Sinta-se à vontade para dar uma olhada na documentação oficial do php também: http://php.net/manual/en/language.oop5.late-static-bindings.php
A maneira mais clara de explicar a ligação estática tardia é com um exemplo simples. Dê uma olhada nas duas definições de classe abaixo e continue a ler.
Vemos uma classe pai (veículo) e uma classe criança (carro). A Classe Pai possui 2 métodos públicos:
invokeDriveByStatic
invokeStopBySelf
A classe pai também possui 2 métodos particulares:
drive
stop
A classe Child substitui 2 métodos:
drive
stop
Agora vamos invocar os métodos públicos:
invokeDriveByStatic
invokeStopBySelf
Pergunte a si mesmo: qual classe chama
invokeDriveByStatic
/invokeStopBySelf
? A classe Pai ou Filho?Dê uma olhada abaixo:
A
static
palavra-chave é usada em um padrão de design Singleton. Veja o link: https://refactoring.guru/design-patterns/singleton/php/examplefonte
O exemplo mais simples para mostrar a diferença.
Observe, self :: $ c
Ligação estática tardia, note static :: $ c
fonte
Por exemplo:
fonte
Olhando para isso de um "por que eu usaria isso?" perspectiva, é basicamente uma maneira de mudar o contexto no qual o método estático está sendo interpretado / executado.
Com
self
, o contexto é aquele em que você definiu o método originalmente. Comstatic
, é de quem você está ligando.fonte
Além disso, observe se você atualiza variáveis estáticas em classes filho. Encontrei este (um pouco) resultado inesperado em que o filho B atualiza o filho C:
Você pode corrigi-lo declarando a mesma variável em cada classe filho, por exemplo:
fonte