Minha dúvida conversa com o que foi exposto nesta aqui: https://cursos.alura.com.br/forum/topico-duvida-sobre-__get-e-__set-em-relacao-ao-principio-de-encapsulamento-281707
Já entendi que na programação orientada a objeto você cria objetos a partir de classes que terão propriedades e métodos cujo acesso pode ser controlado pelo princípio do encapsulamento.
Porém, nessa última aula eu me perdi com relação aos conceitos e ao sentido das coisas:
- O sentido de você criar uma propriedade e colocá-la como privada é restringir o acesso a ela apenas através dos métodos públicos disponíveis. Ok.
- Se você deixar uma propriedade como pública ela pode ser alterada à vontade sem precisar de métodos específicos. Ok.
- Mas se você tiver usado o método set() você pode alterar até mesmo as propriedades privadas e protegidas. Tá... Ok.
- Então em tese se uma pessoa define os atributos de uma classe como privados mas deixa o método set() como público e com um escopo capaz de alterar o valor de qualquer atributo, então teria o mesmo efeito de colocar os atributos como públicos?
- Mas espera aí, se mesmo com os atributos privados e o método set() irrestrito, eu colocar no topo da classe o comentário /** @property-read $atributo*/ eu não vou conseguir usar o método set() para alterar o $atributo, correto?
- Então isso teria o mesmo efeito de colocar os atributos como privados e sem método set()?
- Por que então não só deixar os métodos privados? Qual é o sentido de usar @property-read?
- E é porque ainda tem o redonly (na definição do atributo) que eu nem sei se está hierarquicamente acima ou abaixo de qualquer um desses recursos. Qual a diferença entre usar /** @property-read $atributo*/ e readonly $atributo?
- Se é pra deixar um atributo acessível e modificável por que não só colocá-lo como público ao invés de usar set()?
- A única vantagem do set() em relação a qualquer outro setter é não ter que chamar o método setter diretamente? Ex: $objeto->atributo = "valor"; VS $objeto-> alterarAtributo("valor"); é isso? A vantagem é a economia de caracteres usados?
Public vs Private vs Set() vs @property-read vs readonly
A meu ver parece que criam uma regra depois criam uma exceção depois a exceção da exceção e por aí vai.
- Alguém poderia por favor me explicar qual é o sentido de cada um desses recursos e sua hierarquia?
E sim, eu sei que isso depende da regra de negócio da aplicação, mas o que eu não entendo é o porquê de haver recursos que parecem fazer a mesma coisa.
- Qual é a vantagem de um em relação ao outro e quando usar cada um?