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

Erro no Produto-formulario.php

Boa tarde pessoal, tudo bem?

Meu projeto está alterando produtos normalmente com os magic methods, porém não consigo adicionar produtos, por dar o seguinte erro:

Fatal error: Call to a member function getNome() on null in /Applications/XAMPP/xamppfiles/htdocs/loja/produto-formulario.php on line 14

Lá vai meu código do produto-formulario.php

<?php require_once("cabecalho.php"); 
require_once("banco-categoria.php");
require_once("logica-usuario.php");
require_once("class/produto.php");
require_once("class/categoria.php");


verificaUsuario();

$categoria = new Categoria;
$categoria->setid(1);
$usado = "";

$produto = new Produto($produto->getNome(), $produto->getPreco(),$produto->getDescricao(), $produto->setCategoria($categoria), $produto->setUsado($usado));
$categorias = listaCategorias($conexao);
?>            
    <h1>Formulário de produto</h1>
    <form action="adiciona-produto.php" method="post">
        <table class="table">

            <?php include("produto-formulario-base.php"); ?>

            <tr>
                <td>
                    <button class="btn btn-primary" type="submit">Cadastrar</button>
                </td>
            </tr>
        </table>
    </form>
<?php include("rodape.php"); ?>

Meu código do produto.php

<?php
class Produto {

    private $id;
    private $nome;
    private $preco;
    private $descricao;
    private $categoria;
    private $usado;

    function __construct($nome,$preco,$descricao,Categoria $categoria,$usado) {
        $this->setNome($nome);
        $this->setPreco($preco);
        $this->setDescricao($descricao);
        $this->setCategoria($categoria);
        $this->setUsado($usado);

    }

    public function setId ($id) {
        $this->id = $id;
    }

    public function getId () {
        return $this->id;
    }

    public function setNome ($nome) {
        $this->nome = $nome;
    }

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

    public function setDescricao ($descricao) {
        $this->descricao = $descricao;
    }

    public function getDescricao () {
        return $this->descricao;
    }

    public function setUsado ($usado) {
        $this->usado = $usado;
    }

    public function getUsado () {
       return $this->usado;
    }

    public function setCategoria ($categoria) {
        $this->categoria = $categoria;
    }

    public function getCategoria () {
        return $this->categoria;
    }

    public function valorDesconto ($valor) {
        if ($valor <= 0.5 && $valor > 0) {
        $this->preco -= $this->preco * $valor;
        }
        return $this->preco;  
    }

    public function setPreco ($preco) {
        if($preco > 0) {
            $this->preco = $preco;
        }
    }

    public function getPreco () {
        return $this->preco;
    }

}

E meu código do produto-formulario-base.php

<tr>
    <td>Nome</td>
    <td> <input class="form-control" type="text" name="nome" value="<?=$produto->getnome()?>"></td>
</tr>
<tr>
    <td>Preço</td>
    <td><input  class="form-control" type="number" name="preco" 
        value="<?=$produto->getpreco()?>"></td>
</tr>
<tr>
    <td>Descrição</td>
    <td><textarea class="form-control" name="descricao"><?=$produto->getdescricao()?></textarea></td>
</tr>

<tr>
    <td></td>
    <td><input type="checkbox" name="usado" <?=$usado?> value="true"> Usado
</tr>
<tr>
    <td>Categoria</td>
    <td>
        <select name="categoria_id" class="form-control">
        <?php foreach($categorias as $categoria) : 
            $essaEhACategoria = $produto->getcategoria()->getid() == $categoria->getid();
            $selecao = $essaEhACategoria ? "selected='selected'" : "";
            ?>
            <option value="<?=$categoria->getid()?>" <?=$selecao?>>
                    <?=$categoria->getnome()?>
            </option>
        <?php endforeach ?>
        </select>
    </td>
</tr>
4 respostas

Olá Caio,

esse produto(objeto) do qual você faz $produto->getNome() já existe ?

Att,

solução!

Oi Caio, tudo bom?

No formulário de adição você tem o seguinte código:

$produto = new Produto($produto->getNome(), $produto->getPreco(),$produto->getDescricao(), $produto->setCategoria($categoria), $produto->setUsado($usado));

Você está usando a variável $produto para pegar o valor do nome dele mas o objeto não foi criado ainda. Este jeito é só quando você já possui um produto criado.

Para funcionar, você deve inicializar esse produto com os valores vazios:

$produto = new Produto("", "", "", $categoria, "");

Abraço!

Funcionou Joviane!

Porém não entendi como meu código conseguiu acessar se na minha classe todos estão como Private? Como ele conseguiu adicionar informação no objeto sem utilizar dos métodos SETTERS?

Abraço!

Oi Caio,

É pra isso mesmo que existem os construtores. Você consegue passar os valores que precisa para o objeto direto na criação. Não precisa passar depois com os setters.

O construtor da classe Produto já seta tudo para você, você nem chega a acessar diretamente os atributos:

function __construct($nome,$preco,$descricao,Categoria $categoria,$usado) {
        $this->setNome($nome);
        $this->setPreco($preco);
        $this->setDescricao($descricao);
        $this->setCategoria($categoria);
        $this->setUsado($usado);
    }

Abraço!