Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

como impedir que um valor seja alterado

Segui os passos do instrutor para manter um valor (saldo), privado para que não fosse alterado, porém depois disso o saldo continuou podendo ser alterado, queria que caso o valor fosse bloqueado ao tentar alterá-lo ele além de não ser alterado ainda retornasse o valor atual, segue os códigos:

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;
            }
        */


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

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

    private function protegeatributo ($atributo){
        if ($atributo == "titular" || $atributo == "saldo") {
            //throw new Exception ("errado");
            //return false;
echo PHP_EOL . "erro ao alterar o valor do saldo" . PHP_EOL . PHP_EOL;
        }
    }
    //funçao para formatar o saldo
        private function formatasaldo (){
     return number_format ($this->saldo, 2, ",", ".");

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

index.php

<?php
require "contacorrente.php";

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

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

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

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

var_dump($contamaria);

forma que é exibida 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"
}
antiga agencia maria:  4831 , saldo antigo da maria: 1.000,00

erro ao alterar o valor do saldo


 nova agencia da Maria: 2734 , novo saldo a maria: 50.000,00
object(contacorrente)#2 (4) {
  ["titular":"contacorrente":private]=>
  string(5) "maria"
  ["agencia":"contacorrente":private]=>
  string(4) "2734"
  ["numero":"contacorrente":private]=>
  string(7) "71321-3"
  ["saldo":"contacorrente":private]=>
  string(5) "50000"
}

ou seja, o saldo foi alterado de 1000 para 50000. quando eu insiro na função protegeatributo>

throw new Exception ("errado");

ele retorna um erro porém não segue o código e queria que quando isso acontecesse além de informar que não conseguiu alterar o saldo também informe o valor atual.

1 resposta
solução!

aparentemente o erro estava no seguinte trecho do conntacorrente.php

private function protegeatributo ($atributo){
        if ($atributo == "titular" || $atributo == "saldo") {
            //throw new Exception ("errado");
            //return false;
echo PHP_EOL . "erro ao alterar o valor do saldo" . PHP_EOL . PHP_EOL;
        }

no momento em que eu publiquei a minha dúvida havia até colocado o trecho return false; como comentário para tentar identificar o erro.

mas depois que inverti e coloquei o return no final ele funcionou, ficando assim:

private function protegeatributo ($atributo){
        if ($atributo == "titular" || $atributo == "saldo") {
            echo PHP_EOL . "erro ao alterar o valor do saldo" . PHP_EOL . PHP_EOL;
            //throw new Exception ("errado");
           return $this;
            //exit
        }
    }

mexi muito no código e já não sei se foi só isso que alterei. Para dúvidas futuras, tudo ficou assim

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, $conta){
        $this->sacar($valor);
        $conta->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)
    {
        $this->protegeatributo($atributo);
        return $this->$atributo;
    }

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

    private function protegeatributo ($atributo){
        if ($atributo == "titular" || $atributo == "saldo") {
            echo PHP_EOL . "erro ao alterar o valor do saldo" . PHP_EOL . PHP_EOL;
            //throw new Exception ("errado");
           return $this;
            //exit
        }
    }
    //funçao para formatar o saldo
        private function formatasaldo (){
     return number_format ($this->saldo, 2, ",", ".");

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

inde.php

<?php
require "contacorrente.php";

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

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

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

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

$contajoao->transferir(750, $contamaria);
var_dump($contajoao);
var_dump($contamaria);