1
resposta

Usando o Destruct, com o fopen()

Olá galera, tudo bom? Gostaria de umas dicas de como utilizar um método de LOgs com esse destruct, idem ao que ele mostrou.

Cheguei a fazer um exemplo, só deu erro na hora de utilizar o fclose. Poderiam me dar uma forcinha.

<?php 

class Conta{
    private String $cpf;
    private String $nome;
    private float $saldo = 0.0;
    private static int $numeroContas = 0; //Isso é um Atributo da Class, São membros da classe em si, e não de cada instância (objeto).

    //Para Realizar o Log
    private static string $url = 'C:/xampp/htdocs/Alura/log/criacaoContas_log_';
    private static $fp;


    public function __construct(string $cpf, string $nome){
        $this->cpf = $cpf;
        $this->validaNomeTitular($nome);
        $this->nome = $nome;
        $this->saldo = 0;

        self::$numeroContas += 1; // Self> Sig. 'Está mesma class'.

        self::$fp = fopen(self::$url.'_'.self::$numeroContas.'.txt','w');
        fwrite(self::$fp, "Feito a criação de uma nova Conta: \n");

        fwrite(self::$fp, 'Nome: '.$this->nome.PHP_EOL);
        fwrite(self::$fp, 'Cpf: '.$this->cpf.PHP_EOL);
        fwrite(self::$fp, 'Data e Criação: '.date('d/m/Y').PHP_EOL );
        fwrite(self::$fp, '----------------------'.PHP_EOL);

    }

    public function __destruct(){

        self::$numeroContas--;

        fclose(self::$fp);

    }

    public function sacar(float $saldoASacar):void {
        $this->Log('ini','sacar', $saldoASacar);

        if($this->getSaldo() < $saldoASacar) {
            echo 'Não Ha Fundos suficiente';            
            return;
        }

        $this->saldo =  $this->getsaldo() - $saldoASacar ;

        $this->Log('fim');
    }

    public function depositar($saldoDeposito):void {
        $this->Log('ini','depositar', $saldoDeposito);

        if($saldoDeposito < 0){            
            echo 'Valor deve ser maior que zero';
            return;
        }

        $this->saldo = $this->getsaldo() + $saldoDeposito ;    

        $this->Log('fim');
    }


    public function statusConta(){   

        echo '<br><br>'.var_dump($this).'';
    }

    public function Log($sts, $nomeMetodo='', $param=''){
       echo '<br>';

        if($sts == 'ini'){
            $this->statusConta();
            echo '<br> Chamando a função '.$nomeMetodo."(".$param.")<br> <hr>";

        }else{
            $this->statusConta();
        }


    }

    //Esse método é utilizado somente nesta class, logo, não precisamos deixa-lo publico a todos
    private function validaNomeTitular(string $nome){
        if(strlen($nome) < 5){
            echo "O nome precisa ter pelo menos 5 caracteres!";        
            exit;
        }
    }

    // métodos getters e setters

    function getCpf(){
        return $this->cpf;
    }

    function getNome(){
        return $this->nome;
    }

    function getSaldo(){
        return $this->saldo;
    }

    public static function recuperaQtdContas():int{
        return self::$numeroContas;
    }
}

---- No Momento em que eu utilizo o __destruct()
me gera a seguinte mensagem

Warning: fclose(): supplied resource is not a valid stream resource in C:\xampp\htdocs\Alura\php_OO\src\Conta.php on line 36

Os Arquivos de logs são criados corretamente.

Obriado!!!

1 resposta

Washington, tive um pouco de dificuldade de entender seu problema, mas vamos por partes.

Primeiro, você reabre o arquivo a cada nova criação de conta no construtor. Se o arquivo é o mesmo para todas as contas, isso não é necessário.

Mas o mais importante: Você tem a representação de uma conta e a responsabilidade de realizar logs na mesma classe. Isso é ruim pois todo o código de realizar logs vai precisar ser repetido em várias partes do sistema. O ideal é você criar uma classe especializada em realizar logs, e nela você vai ter um controle melhor do recurso (arquivo) para poder abri-lo e fechá-lo no momento certo.