7
respostas

erro ao exibir/bloquear atributos/metodos

Na aula quando o professor pede para bloquear os atributos "titular" e "saldo" o atributo agência também é bloqueado.

contacorrente.php

<?php
class contacorrente
{
    private $titular;
    private $agencia;
    private $numero;
    private $saldo;

    public function __construct($titular, $agencia, $numero, $saldo)
    {
        $this->titular = $titular;
        $this->agencia = $agencia;
        $this->numero = $numero;
        $this->saldo = $saldo;
    }

    //metodo para sacar
    public function sacar($valor){
        $this->saldo = $this->saldo - $valor;
        return $this;
    }
    //metodo para depositar
    public function depositar($valor){
        $this->saldo = $this->saldo + $valor;
        return $this;
    }
    /*

    // formas de liberar para visualizar e alterar individualmente cada atributo
        //liberando para consultar titular
            public function gettitular(){
                return $this->titular;
            }
        //liberando para consultar saldo
            public function getsaldo(){
                return $this->saldo;
            }

            //liberando para alterar o titular
            public function settitular($titular){
            return $this->titular = $titular;
            }
            //liberando para alterar o saldo
            public function setsaldo($saldo){
            return $this->saldo = $saldo;
            }
        */

    private function protegeatributo ($atributo){
        if ($atributo == "titular" || $atributo == "saldo") {
            return false;
        }
       }
    public function __get($atributo)
    {
        $this->protegeatributo($atributo);
        //$this->$atributo;
    }

    public function __set($atributo, $valor){
        $this->protegeatributo($atributo);
        //$this->$atributo = $valor;
    }
        //funçao para formatar o saldo

        public function formatasaldo (){
     return number_format ($this->saldo, 2, ",", ".");
}
}

index.php

<?php
require "contacorrente.php";

$contajoao = new contacorrente("joao","0783", "21867-3","500");
$contamaria = new contacorrente("maria","4831", "71321-3", "1000");

var_dump($contajoao);
var_dump($contamaria);
//echo $contajoao->saldo;

//$contajoao->sacar("400") ->depositar(770);
//$contamaria->depositar("1000") ->sacar(25);

var_dump($contajoao);
var_dump($contamaria);
echo "antiga agencia maria:  {$contamaria->agencia} , saldo antigo da maria: {$contamaria->formatasaldo()}";

$contamaria->agencia = "2734";
$contamaria->saldo = "50000";
echo PHP_EOL . " nova agencia da Maria: $contamaria->agencia , novo saldo a maria: {$contamaria->formatasaldo()}";

Onde pode estar o erro?

7 respostas

exibição no browser


object(contacorrente)#1 (4) {
  ["titular":"contacorrente":private]=>
  string(4) "joao"
  ["agencia":"contacorrente":private]=>
  string(4) "0783"
  ["numero":"contacorrente":private]=>
  string(7) "21867-3"
  ["saldo":"contacorrente":private]=>
  string(3) "500"
}
object(contacorrente)#2 (4) {
  ["titular":"contacorrente":private]=>
  string(5) "maria"
  ["agencia":"contacorrente":private]=>
  string(4) "4831"
  ["numero":"contacorrente":private]=>
  string(7) "71321-3"
  ["saldo":"contacorrente":private]=>
  string(4) "1000"
}
object(contacorrente)#1 (4) {
  ["titular":"contacorrente":private]=>
  string(4) "joao"
  ["agencia":"contacorrente":private]=>
  string(4) "0783"
  ["numero":"contacorrente":private]=>
  string(7) "21867-3"
  ["saldo":"contacorrente":private]=>
  string(3) "500"
}
object(contacorrente)#2 (4) {
  ["titular":"contacorrente":private]=>
  string(5) "maria"
  ["agencia":"contacorrente":private]=>
  string(4) "4831"
  ["numero":"contacorrente":private]=>
  string(7) "71321-3"
  ["saldo":"contacorrente":private]=>
  string(4) "1000"
}
antiga agencia maria:   , saldo antigo da maria: 1.000,00
 nova agencia da Maria:  , novo saldo a maria: 1.000,00

queria que o outro post ficasse ativo pois nesse eu acabei separando o o post em dois.

Marcos, boa tarde!

Faltou retornar o atributo na função __get() pois você existem dois atributos que não devem ser acessados, titular e saldo, mas os outros precisam então você pode fazer uma verificação se não for nenhum dos dois, retorna o atributo pedido, para isso basta alterar:

 private function protegeatributo($atributo)
    {
        if ($atributo == "titular" || $atributo == "saldo") {
            return false;
        }
        return $this->$atributo;
    }

E na função __get

public function __get($atributo)
    {
        return $this->protegeatributo($atributo);
    }

Espero ter ajudado e bons estudos!

consegui resolver isso porém agora que na aula seguinte a função protegeatributo foi transferida para um outro arquivo e chamada de forma estática o $this deixa de funcionar e o problema retorna. Já até desisti de resolver essa questão.

Marcos, boa tarde!

$this deixa de funcionar em qual arquivo? Você colocar o código abaixo para que eu possa te ajudar?

no arquivo validacao.php

<?php

class validacao{
    public static function protegeatributo ($atributo){

if ($atributo == "titular" || $atributo == "saldo"){
echo "<br/> erro ao alterar o valor do saldo <br/> <br/>" . PHP_EOL . PHP_EOL;
        }
return $this;
    }

return false;

        }
return $this;
    }


}

?>

contacorrente.php

<?php
class contacorrente
{
    private $titular;
    private $agencia;
    private $numero;
    private $saldo;

    public function __construct($titular, $agencia, $numero, $saldo)
    {
        $this->titular = $titular;
        $this->agencia = $agencia;
        $this->numero = $numero;
        $this->saldo = $saldo;
    }

    //função para sacar
    public function sacar($valor){
        $this->saldo = $this->saldo - $valor;
        return $this;
    }
    //funcao para depositar
    public function depositar($valor){
        $this->saldo = $this->saldo + $valor;
        return $this;
    }
    //função para transferir
    public function transferir ($valor,contacorrente $contacorrente){
       if (!is_numeric($valor)) {
           echo "<h3>o valor passado:<b> $valor </b>não é um número, portanto a transferencia não foi concluída.</h3><br/>";
       return $this;
       }
        $this->sacar($valor);
        $contacorrente->depositar($valor);
        return $this;
    }
    /*

    // formas de liberar para visualizar e alterar individualmente cada atributo
        //liberando para consultar titular
            public function gettitular(){
                return $this->titular;
            }
        //liberando para consultar saldo
            public function getsaldo(){
                return $this->saldo;
            }

            //liberando para alterar o titular
            public function settitular($titular){
            return $this->titular = $titular;
            }
            //liberando para alterar o saldo
            public function setsaldo($saldo){
            return $this->saldo = $saldo;
            }
        */


    public function __get($atributo)
    {
       validacao::protegeatributo($atributo);
        //$this->$atributo;
    }

    public function __set($atributo, $valor){
        validacao::protegeatributo($atributo);
        $this->$atributo = $valor;
    }

    //funçao para formatar o saldo
        private function formatasaldo (){
     return number_format ($this->saldo, 2, ",", ".");

    }
    public function getsaldo(){
        return $this->formatasaldo();
    }
}

Marcos, boa tarde!

Dentro de um método estático como o protegeatributo o $this não existe e não pode ser referenciado. Para isso você deve usar o self::nomeDoMétodo, a única questão é, o método ou atributo deve ser estático também, pois se não você acaba perdendo a segurança da sua aplicação.

E sendo assim você também não pode retornar o self, nem $this dentro de um método estático.

Espero ter ajudado e bons estudos!