quinta-feira, 7 de março de 2013

Introdução a Orientação a Objetos no PHP - parte 3

Ola! Nesta vídeo aula, vou explicar os motivos para não utilizar atributos públicos e mostrar a forma mais segura para trabalhar com objetos. Primeiro vamos alterar a visibilidade do atributo idade para protected.
class Cliente {
    //Atributos
    public $nome;
    protected $idade;
Agora vamos comentar os métodos e fazer a atribuição dos atributos de forma direta, o código deve ficar igual abaixo:
<?php
	if(!empty($_GET))
	{
		$nome = $_GET['nome'];
		$idade = $_GET['idade'];
        $cliente = new Cliente();
//                    $cliente->setNome($nome);
//                    $cliente->setIdade($idade);
//                    echo $cliente->getNome() . ", salvo com sucesso.<>";
//                    echo $cliente->getIdade() . " anos de idade.";
		$cliente->nome = $nome;
		$cliente->idade = $idade;
		echo $cliente->nome . ", salvo com sucesso<>";
		echo $cliente->idade . " anos é a idade do cliente!";
	}
?>
Salvando as alterações e acessando a página, nos é retornado um erro fatal como este:
Fatal error: Cannot access protected property Cliente::$idade in /opt/lampp/htdocs/php_oo/Cliente.php on line 58
Este erro diz que não podemos acessar a propriedade protegida do atributo idade do objeto Cliente, ou seja, não podemos acessar de forma direta o atributo, devemos utilizar os métodos para isso. Vamos realizar algumas alterações em nosso método setIdade, nosso método deve ficar como abaixo:
public function setIdade($idade)
{
	if($idade > 130)
	{
//            exit();
		throw new Exception("Idade inválida!");
	}
	else
	{
		$this->idade = $idade;
	}
}

Vamos alterar também o script PHP que trata o retorno do formulário, deve ficar assim:
<?php
	if(!empty($_GET))
	{
		$nome = $_GET['nome'];
		$idade = $_GET['idade'];
		$cliente = new Cliente();
		$cliente->setNome($nome);
		$cliente->setIdade($idade);
		echo $cliente->getNome() . ", salvo com sucesso.";
		echo $cliente->getIdade() . " anos de idade.";
	}
?>
Agora estamos utilizando um novo recurso em nosso código, o comando throw, ele dispara um erro fatal da classe Exception com a mensagem "Idade inválida!"
Fatal error: Uncaught exception 'Exception' with message 'Idade inválida!' in /opt/lampp/htdocs/php_oo/Cliente.php:22 Stack trace: #0 /opt/lampp/htdocs/php_oo/Cliente.php(54): Cliente->setIdade('132') #1 {main} thrown in /opt/lampp/htdocs/php_oo/Cliente.php on line 22
A mensagem acima informa que o erro foi pego (Uncaugth) e além da mensagem ele exibe qual o método ocasionou o erro Cliente->setIdade('132') e o número da linha que gerou o erro, no caso a linha 22. Para que o sistema não encerre com o erro fatal precisamos tratar esta exceção alterando o script que recebe o formulário. Ele ficará conforme abaixo:
<?php
	if(!empty($_GET))
	{
		$nome = $_GET['nome'];
		$idade = $_GET['idade'];
		try
		{
			$cliente = new Cliente();
			$cliente->setNome($nome);
			$cliente->setIdade($idade);
			echo $cliente->getNome() . ", salvo com sucesso. ";
			echo $cliente->getIdade() . " anos de idade.";
		}
		catch(Exception $e)
		{
			echo $e->getMessage();
		}
	}
?>
O comando try tentará executar o bloco, se um erro ocorrer o script passa para o segundo bloco catch (pegar). Lembre-se que a Exception é uma classe! Capturada a exceção pelo bloco catch, ele instancia um objeto da classe Exception chamado $e e executa seu método getMessage() que exibe a mensagem passada anteriormente pelo comando throw.
Segue o código completo do script utilizado no exemplo:
<?php
/**
 * Classe Cliente
 *
 * @author Luiz Carlos
 */
class Cliente {
    //Atributos
    public $nome;
    protected $idade;
    //Métodos
    public function setNome($nome)
    {
        $this->nome = $nome;
    }
    
    public function setIdade($idade)
    {
        if($idade > 130)
        {
            throw new Exception("Idade inválida!");
        }
        else
        {
            $this->idade = $idade;
        }
    }

    public function getNome()
    {
        return $this->nome;
    }
    
    public function getIdade()
    {
        return $this->idade;
    }
}
?>
<html>
    
        
        Classe Cliente
    
    <body>
<?php
	if(!empty($_GET))
	{
		$nome = $_GET['nome'];
		$idade = $_GET['idade'];
		try
		{
			$cliente = new Cliente();
			$cliente->setNome($nome);
			$cliente->setIdade($idade);
			echo $cliente->getNome() . ", salvo com sucesso.
";
			echo $cliente->getIdade() . " anos de idade.";
		}
		catch(Exception $e)
		{
			echo $e->getMessage();
		}
	}
?>
        
</body> </html>
Aproveito para convidar quem quiser se associar ao meu blog, será bem vindo!
Obrigado. Espero que esta aula ajude. Até a próxima!

Nenhum comentário:

Postar um comentário

Comentemm, vamos compartilhar experiências!