T.Colucci 33 Denunciar post Postado Janeiro 7, 2010 Salve galera louca do IMasters, beleza? Seguinte: tenho programado a algum tempo somente com POO, e as vezes me surgem duvidas em relação ao proprio conceito de poo mesmo, tipo isso: 1- Existem os chamados metodos get e set. Mas até agora, nao entendo muito bem O PORQUÊ de usa-los. Explico: class tipo{ private $teste; public function setTeste($valor){ $this->valor = $valor; } public function getTeste(){ return $this->valor; } } //---------- class tipoDois{ private $teste; public function __construct($valor){ $this->teste = $valor } public function __destruct(){ } } //---- usando $x = new tipo(); $x->setTeste = "Setei o valor"; echo $x->getTeste; // escreve "Setei o valor" $y = new tipoDois("Setei o segundo valor"); echo $y->valor; Qual a vantagem de se ter esses metodos se eu posso fazer isso, digamos, diretamente? Segurança? Velocidade? Alguém poderia me explicar? Acredito que seja algum conceito da POO que eu nao saiba, por isso, peço a ajuda dos mais entendidos do assunto. Grato! Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 7, 2010 Isso é útil para impedir acesso direto às propriedades de classe. Por exemplo, seu código usa uma propriedade (atributo, ou variável) do tipo public. O ideal seria deixá-la como private, para que somente a classe à qual ela pertence tenha acesso a ela. Suponha que seja um valor numérico, como idade ou salário de um funcionário. Esse valor deve possuir restrições. Com um método set, você pode fazer validação, por exemplo. Se permitir acesso direto, qualquer valor poderia ser inserido nela, inclusive valor de outro tipo, como string. Isso não é um problema para o PHP, que não é tipado, mas num C++ ou Java isso pode causar exeções e erros indesejados em tempo de execução Compartilhar este post Link para o post Compartilhar em outros sites
T.Colucci 33 Denunciar post Postado Janeiro 7, 2010 Entendi. Mas suponhamos que a atribuição do valor seja feito em um metodo privado ou protegido, ainda assim teria essa necessidade? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 7, 2010 Mas suponhamos que a atribuição do valor seja feito em um metodo privado ou protegido, ainda assim teria essa necessidade? O ideal é sempre ter um método específico para atribuição, evitando erros. É indiferente se o método é público, privado ou protegido. O importante é assegurar a consistência do dado armazenado. Compartilhar este post Link para o post Compartilhar em outros sites
T.Colucci 33 Denunciar post Postado Janeiro 7, 2010 Humm, saquei! Entao todas as variaveis da classe deverão ter seus metodos set e get, correto? Ou só as que são usadas por toda a classe? Exemplo: classe teste{ private $x; private function setX($valor){ $this->x = $valor; // essa variavel tem que ter o metodo SET e GET } private function banana(){ $banana = $this->x + 25; // essa variavel nao precisa de metodo set e get, correto? } } É isso? Agradeço a paciencia amigao! hehehhee Valew pela ajuda também! Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 7, 2010 os métodos set e get são utilizados apenas com as propriedades de classe. Variáveis internas a um método não precisam de métodos set e get, uma vez que apenas propriedades de classe estão normalmente ligadas com I/O, o que requer verificação de dados. Compartilhar este post Link para o post Compartilhar em outros sites
T.Colucci 33 Denunciar post Postado Janeiro 7, 2010 Certo! Obrigado pela ajuda beraldo, te pago uma heinecken la no boteco! Vlw pela ajuda! Tópico resolvido. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 7, 2010 Obrigado pela ajuda beraldo, te pago uma heinecken la no boteco! Maravilha!Já vou lá buscar! :D Compartilhar este post Link para o post Compartilhar em outros sites
T.Colucci 33 Denunciar post Postado Janeiro 8, 2010 Pessoal, me desculpe ressuscitar o tópico, mas me surgiu uma outra dúvida: Se faz necessário que sempre que eu tenha um metodo set eu deva ter também um método get? Por exemplo, posso setar um valor que me servirá como base para a execução de uma parte do código mas não necessariamente precisaria retornar esse valor, poderia usar o $this... Podem me ajudar? Grato! Compartilhar este post Link para o post Compartilhar em outros sites
_neto_ 0 Denunciar post Postado Janeiro 8, 2010 Tiago, isso depende da visibilidade que você quer da sua variável, por exemplo, se você quer que uma determinada propriedade seja read-only, você define apenas o método get público, se você quer que seja apenas write-only, você define apenas o método set público. Eu particularmente não vejo problema em acessar direto os valores de um atributo dentro da própria classe. Compartilhar este post Link para o post Compartilhar em outros sites
T.Colucci 33 Denunciar post Postado Janeiro 8, 2010 Entendi. Então nao é regra que se deva ter os dois para cada variavel de entrada... ok ok. Tipo, particularmente, tb nao vejo problema algum em acessar direto os valores... até pq um dos argumentos é o fato de outras linguagens isso ser obrigatorio, tipo c++ e java. Mas no meu caso, nao precisarei usar tais linguagens. Meu negocio é o php mesmo, entao... fico meio na duvida. Mas, como o objetivo é programar melhor, com mais elegancia e de forma mais "correta", então vou fazer o uso conforme me falaram. Bem, duvida respondida! Obrigado _neto_ Qualquer outra, volto a postar aqui. Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
_neto_ 0 Denunciar post Postado Janeiro 8, 2010 Tipo, particularmente, tb nao vejo problema algum em acessar direto os valores... É bom esclarecer o que eu disse: não vejo problema em acessar diretamente os atributos dentro da própria classe, fora da classe devem ser usados os métodos get/set. Compartilhar este post Link para o post Compartilhar em outros sites
T.Colucci 33 Denunciar post Postado Janeiro 8, 2010 Ahhh, ainda bem que você postou isso. Estava vindo aqui postar essa duvida, hahahahahaha! Beleza, muito bem comentado. Obrigado pela ajuda. :D Compartilhar este post Link para o post Compartilhar em outros sites