2
respostas

Dúvida a respeito do __destruct()

Boa tarde, pessoal. Tudo certo? Tô com um pouco de dúvida a respeito do método destruct (). Eu estou o utilizando para mandar uma mensagem com alguns dados do usuário como cpf, nome e até saldo, mas gostaria de saber se isso é perigoso? Porque não entendi muito bem do que se trata essa ideia da instância deixar de existir na memória. Bom, eu tô achando que os dados adicionados pelo usuário são apagados com o uso do destruct e dessa não forma não iriam parar no meu suposto database. Também pesquisei um pouco mais na net e vi que o destruct(), de acordo com w3school, é uma função que é chamada automaticamente no final do script, no entanto não vi nada sobre garbage collector e até mesmo sobre o momento que uma instância deixa de existir na memória. Agradeço desde já!

class Conta {

    //properties or attributes
    private $cpfTitular;
    private $name;
    private $cash;
    private static $numberAccount = 0;
    private static $codeBank = 77;

    //methods
    function __construct(string $cpfTitular, string $name) {
        $this->cpfTitular = $cpfTitular;
        $this->valid_name($name);
        $this->name = $name;
        $this->cash= 0;
        echo Conta::$codeBank;
        Conta::$numberAccount++ ; //Atributos estáticos eu acesso com o nome da classe dois pontos e defino o nome do atributo acompanhado do cifrão
        //posso usar self no lugar de conta para me referir a classe
    }



     function withdraw(float $cashOut) {
        if ($this->cash < $cashOut) {
            return "Esse valor de saque está indisponível para sua conta";
            exit(); //Com o return, eu saio da condição, logo significa que deu certo e eu posso tirar o else. Posso usar tanto o exit(), quanto o retun nesse caso
        }
           return 'Valor após o saque é de '.$this->cash-=$cashOut;      
    }

     function deposit(float $depositCash) {
        if ($depositCash < 0) {
            return 'Operação impossível, somente são aceitos valores positivos e não nulos';
        }
        else {
             return 'Valor após o depósito é de '.$this->cash = $this->cash + $depositCash;
        }
    }

     function transfAccount (float $transfCash, Conta $newAccount) {
        if ($transfCash > $this->cash) {
            return 'Essa opção não poderá ser realizada';
        }
        elseif ($transfCash <= 0){
            return 'O valor transferido deve ser maior do que zero';
        }
        else{
            $this->withdraw($transfCash);
            $newAccount->deposit($transfCash);
            return 'O saldo atual é de '.$newAccount->cash;
        }
    }
    public function getCpfTitular()
    {
        return $this->cpfTitular;
    }


    public function getName()
    {
        return $this->name;
    }


    public function getCash()
    {
        return $this->cash;
    }



    public static function get_numberAccount() {
        return Conta::$numberAccount;
    }

    private function valid_name($name) {
        if (strlen($name) < 5) {
            echo ' Esse nome não é válido, é necessário que ele tenha 5 ou mais caracteres ';
            exit();
        };
    }

    public function __destruct() {
        echo "O dono da conta é {$this->name}, seu CPF: {$this->cpfTitular} e o seu saldo atual é de {$this->cash}.";
    }

Esse é o código, peço desculpas pela bagunça e por alguns comentários desnecessários. Estou usando realmente para estudar e gosto de deixar algumas informações comentadas, porém sei que não é o ideal para visualização.

Segue a instância:

    $priaccount = new Conta('123.456.789-45', 'Leonardosvaldo');
    echo '<br>';
    echo $priaccount->getCash();
    echo$priaccount->getName();
    echo $priaccount->getCpfTitular();

    echo '<br>'.$priaccount->deposit(400).'<br>';
    echo $priaccount->withdraw(700). '<br>';

    echo Conta::get_numberAccount();

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Também vi que colocando um unset logo após instanciar a classe, o método destruct é o único executado, já que a instância não existe mais. O 77 é o código do banco e esse é implementado pelo meu construct.

 $priaccount = new Conta(' 123.456.789-45 ', ' Leonardosvaldo ');
    unset($priaccount);
    echo '<br>';
    echo $priaccount->getCash();
    echo$priaccount->getName();
    echo $priaccount->getCpfTitular();

    echo '<br>'.$priaccount->deposit(400).'<br>';
    echo $priaccount->withdraw(700). '<br>';

    echo Conta::get_numberAccount().'<br>';

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

O método Destruct() libera algumas referências ajudando na liberação de memória pelo GC. Ele deve ser confeccionado por você, visando quais referências devem ser liberadas.

Mas, eu utilizá-lo da forma que utilizei poderia me prejudicar de alguma forma se eu quero trabalhar com armazenamento de dados em uma database? Porque, ao meu ver, não faria diferença, visto que eu já teria armazenado os dados do meu cliente no meu banco de dados e após isso utilizado um destruct.