Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia amigos, estou querendo aprender a passar por parâmetro apenas valores de uma determinada classe, porém fiz um teste abaixo e não funcionou.
<?php
class Usuario{
public $nome = 'Renato';
}
class Validar{
public function validaNomeUser(Usuario $nome){
echo 'O Nome '.$nome.' esta valido';
}
}
$user = new Usuario;
$validar = new Validar;
$validar->validaNomeUser($user->nome);
Alguém poderia me explicar melhor como isso funciona? Não entendiesse conceito ainda...
>
Para funcionar você deveria passar o objeto inteiro para a função:
$validar->validaNomeUser($user);
Isso ok, mas ao passar todo objeto a classe que recebe vai saber que eu quero exibir somente o nome ou nela terei que tratar dentro dela para receber o objeto todo? passa um objeto sempre não é lento?
Você trata o objeto que você passou para a função da mesma forma que você usaria o objeto fora da função. Se você quer exibir a propriedade 'nome', basta fazer tal como está abaixo:
public function validaNomeUser(Usuario $usuario){
echo 'O Nome '.$usuario->nome.' esta valido';
}
Quanto a lentidão, não há com o que se preocupar. Mas é recomendável usar este recurso (e qualquer outro recurso da linguagem) apenas se e quando for necessário. Assim seu seu código terá qualidade suficiente para que se torne viável mantê-lo ou reaproveitá-lo.
Bom, entendo que você está começando, mas é sempre bom começar no rumo certo.
Da forma como sugerido no post #4, há um alto acoplamento entre as classes.
Ahn? Acoplamento? Que bicho é esse?
Bom, tecnicamente, é isso:
Para a computação, acoplamento é o nível de inter-dependência entre os módulos de um software. O acoplamento está diretamente relacionado com a coesão, pois quanto maior for o acoplamento menor será o nível de coesão. Isto se deve ao fato de que, quando um módulo ou classe possui uma dependência muito forte por outro módulo ou classe, ele não é "forte" o suficiente para desepenhar suas tarefas de forma individual, dificultando, por exemplo, alterações no código da sua dependência (módulo ou classe de serviço).
Em outras palavras, trazendo para o contexto da programação orientada a objetos, o acoplamento é o grau de dependência de uma classe para com a outra. Existem vários tipos de acoplamento, mas vou me ater ao encontrado no exemplo do post #4.
public function validaNomeUser(Usuario $usuario){
echo 'O Nome '.$usuario->nome.' esta valido';
}
Qual o problema dessa abordagem??? Certamente há alguns, mas o que eu quero chamar atenção aqui é o fato de que a classe Validar precisa conhecer a classe Usuario.
Mas por que isso é um problema?
A questão é que caso você altere a classe Usuario e passe a chamar a propriedade nome de nomeCompleto, você será obrigado a propagar essa alteração também ao método validaNomeUser.
Ah, mas não tem problema... eu vou lá e altero.
Neste caso, é realmente simples de fazer esse remendo. Agora imagine quando você continuar adotando essa prática em sistemas maiores? Se para cada alteração que fizer, você precisar mexer também em outras 5 ou 6. Só que ao mexer nessas 5 ou 6 classes, cada uma delas afeta outras 5 ou 6, que afetam outras, que afetam outras... E assim o caos está instaurado.
Entendi... Mas como eu evito esse tipo de situação?
Mantenha sempre uma regra na cabeça: não forneça nenhuma informação a um objeto (ou classe) além das quais ela precisa para executar suas funções.
No caso, você está querendo validar um nome de usuário. Qual informação é necessária para fazê-lo? APENAS o nome de usuário, certo?
Dessa forma, sua ideia inicial estava correta, a questão é remover o type hinting do método, afinal, o que você espera não é um objeto do tipo Usuario, mas sim uma string.
public function validaNomeUser($nome){
echo 'O Nome '.$nome.' esta valido';
}#5
Obrigado pela explicação +1. Só uma correção: eu não sugeri nada ao autor do tópico, até porque só se pode fazer isso para um caso concreto. O exemplo que ele deu não é real (é apenas um "teste") e ele apenas queria saber porque não estava funcionando.
Eu então expliquei que se ele definir o tipo de parâmetro como uma instancia de uma classe, ele terá de passar o objeto inteiro para a função. E dei um exemplo disso.
Como eu disse: "(...) é recomendável usar este recurso (e qualquer outro recurso da linguagem) apenas se e quando for necessário". Assim, é o tipo de coisa que se decide nas etapas de planejamento/modelagem do projeto, se é necessário, se é a melhor solução, etc.
Obrigado a todos! com a explicação do Henrique Barcelos vou estudar de forma muito mais efetiva!
nesse artigo ensinando Métodos de Interface e Polimorfismo http://forum.imasters.com.br/topic/393052-141-metodos-de-interface-e-polimorfismo/ o autor utilizou da técnica abundantemente por isso achei que seria uma boa prática e evitaria falhas de segurança
O nome desse recurso é Type Hiting e foi adicionado ao PHP a partir da versão 5.
No código que você postou você definiu o tipo que deve ser passado para a função 'validaNomeUser' como sendo uma instancia de 'Usuario', no entanto, com '$user->nome' você está passando uma string(6) "Renato". Para funcionar você deveria passar o objeto inteiro para a função:
$validar->validaNomeUser($user);