Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Atribuir um novo atributo fora da classe

É possível criar novos atributos fora da classe ?

Pergunto isso pois esqueci de declarar o atributo Preco dentro da classe Produto. Porém, quando utilizei o método $Produto->Preco = $Valor foi aceito normalmente.

Veja abaixo que não declarei o atributo Preco:

<?php 

    class Produto {
        public $Id;
        public $Nome;
        public $Descricao;
        public $Categoria;
        public $Usado;
    }

 ?>

Mesmo assim, quando atribui um valor no parametro Preco do objeto Produto, foi aceito e mostrado na tela como se ele existisse para minha classe:

function listaProdutos($conexao) {

    $produtos = array();
    $resultado = mysqli_query($conexao, "select p.*,c.nome as categoria_nome from 
            produtos as p join categorias as c on c.id=p.categoria_id");

    while($produto_array = mysqli_fetch_assoc($resultado)) {

        $Categoria = new Categoria();
        $Categoria->Nome     = $produto_array['categoria_nome'];

        $Produto   = new Produto();
        $Produto->Id                 = $produto_array['id'];
        $Produto->Nome                 = $produto_array['nome'];
        $Produto->Descricao            = $produto_array['descricao'];
        $Produto->Categoria         = $Categoria;
        $Produto->Preco             = $produto_array['preco'];
        $Produto->Usado             = $produto_array['usado'];

        array_push($produtos, $Produto);
    }

    return $produtos;
}

Como isso pode acontecer ?

3 respostas

É por conta da natureza dinâmica da linguagem.. vc criou um atributo para a instancia especifica da classe produto.. se vc instanciar um novo produto, ele vai vir de novo sem o atributo preco.

solução!

Leonardo,

Em PHP você consegue criar dinamicamente atributos em qualquer objeto. Porém isso não é muito legal. Você não vai ter controle nenhum sobre esse atributo, pois ele automaticamente vai ser um atributo público.

Caso em algum momento você esteja fazendo algo mais crítico e queira impedir este comportamento, você pode lançar uma exceção quando um usuário tentar atribuir algum valor a uma propriedade inexistente:

class Produto {
    private $atributos;

    public function __set($propriedade, $valor)
    {
        if (!property_exists($this, $propriedade)) {
            throw new \Exception("A propriedade $propriedade não existe.");
        }

        // Caso queira fazer algo quando a propriedade existir mas for privada, coloque aqui
    }
}

Espero ter ajudado.

Abraços!

Olá Carlos!! Foi exatamente isso que passou pela minha cabeça, a falta de segurança que isso poderia me ocorrer.

Agradeço por compartilhar a forma de evitar a utilização desses atributos não desejáveis/inexistentes.