class Conta
{
protected $saldo;
protected $estado;
public function __construct($saldo)
{
$this->saldo = $saldo;
$this->estado = $saldo < 0 ? new Negativo($this) : new Positivo($this);
}
public function sacar($valor)
{
$this->estado->sacar($valor);
}
public function depositar($valor)
{
$this->estado->depositar($valor);
}
public function getSaldo()
{
return $this->saldo;
}
}
abstract class Estado
{
protected $conta;
public function __construct (Conta $conta)
{
$this->conta = $conta;
}
public abstract function sacar($valor);
public abstract function depositar($valor);
}
class Positivo extends Estado
{
public function sacar($valor)
{
$this->conta->saldo = $this->conta->saldo - $valor;
if ($this->conta->saldo < 0)
$this->conta->estado = new Negativo($this->conta);
}
public function depositar($valor)
{
$this->conta->saldo = $this->conta->saldo + $valor * 0.98;
}
}
class Negativo extends Estado
{
public function sacar($valor)
{
throw new Exception('Esta conta está com saldo negativo');
}
public function depositar($valor)
{
$this->conta->saldo = $this->conta->saldo + $valor * 0.95;
if ($this->conta->saldo >= 0)
$this->conta->estado = new Positivo($this->conta);
}
}
ini_set('display_errors', true);
require 'Conta.php';
require 'Estado.php';
require 'Negativo.php';
require 'Positivo.php';
$conta = new Conta(500);
echo $conta->getSaldo(), '<br />';
$conta->depositar(10);
echo $conta->getSaldo(), '<br />';
$conta->sacar(700);
No exercício está escrito que não preciso dos método getters e setters, mas eu recebo o seguinte erro:
Fatal error: Cannot access protected property Conta::$saldo in /var/www/html/sitenovo/teste/State/Positivo.php on line 13