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

Erro ao passar o PHP OO para Magic Methodos

Boa noite; Ao refazer todos os códigos que precisou alterar e apos conferir o meu código com o do professor . Está dando erro no meu form produto-formulario.php e na produto-lista.php... ambos não aparece o botão de submit e a minha lista não aparece. E por consequência não pude testar os meus botões de alterar e excluir... No produto-formulario.php não aparece o botão e no produto-lista.php da o seguinte erro ao mostrar a lista:

Fatal error: Uncaught Error: Call to a member function getNome() on null in C:\xampp\htdocs\Loja - OObj\produto-lista.php:31 Stack trace: #0 {main} thrown in C:\xampp\htdocs\Loja - OObj\produto-lista.php on line 31

Pois no meu programa o form produto-formulario e produto-lista.php aparecem juntos e um a tag que mostra somente a lista de produto. Conferi o código meu com o do professor e não conseguir achar o problema. estou passando o meu endereço do Github

https://github.com/flavio-magela/PHP-O.Objeto

Poderia me ajudar. Desde já obrigado.

4 respostas

Olá, Flávio Magela Rosa dos Santos.

No arquivo produto-lista.php você está executando um foreach para produtos, com isso está chamando os métodos do objeto $produto, porém na linha 31 vorê declarou a variável $nome chamando o método ->getNome().

Altere a variável para $produto->getNome() para voltar a normalidade.

Espero ter lhe auxiliado.

Att,

Diego Brocanelli

Boa tarde Diego. Fiz essa correção, mas ainda meu código está com erro na linha 31. Na minha pagina do produto-formulario.php e no produto-lista.php o campo categoria não está puxando as categoria do meu BD. Dei uma revisada com o código do professor e não estou encontrei o erro.

foreach ($produtos as $produto) :
    ?>        
        <tr>            
            <td ><?= $produto->getProduto() ?></td>
            <td >R$ <?= $produto->getPreco() ?></td>
            <td >R$ <?= $produto->precoComDesconto(0.1) ?></td>
            <td ><?= substr($produto->getDescricao(), 0, 40)?></td>
            <td ><?= $produto->isUsado() ?></td>
             <td><?= $produto->getCategoria()->getNome() ?></td>
            <td>
                <form action="alterar-formulario-produto.php" method="POST"  >
                    <input  type="hidden" name="id" value="<?= $produto->getId() ?>">
                    <button tabindex="0" class=" fa fa-edit btn btn-link  ml-auto titulo2" aria-hidden="true" data-toggle="popover"  data-placement="right" data-trigger="focus" title="alterar" type="Submit" id="btn-alterar"></button>
                </form>

            </td>        
            <td>
                <form action="confirma-exclusao.php" method="POST"  >
                    <input  type="hidden" name="id" value="<?= $produto->getId() ?>">
                    <button tabindex="0" class=" fas fa-trash-alt text-danger btn btn-link  ml-auto titulo" data-toggle="popover"  data-placement="right" data-trigger="focus" title="Excluir" type="Submit" id="btn-excluir"></button>
                </form>

            </td>

        </tr>
    <?php    
    endforeach;

Dei uma olhada no minha class BD-categoria, BD-produto.php, Produto.php, Categoria.php não achei nada de errado...

Fatal error: Uncaught Error: Call to a member function getNome() on null in C:\xampp\htdocs\Loja - OObj\produto-lista.php:31 Stack trace: #0 {main} thrown in C:\xampp\htdocs\Loja - OObj\produto-lista.php on line 31

Na Class Categoria.php eu teria que fazer um methodo constructor() tb? Conferi novamente os produto-formulario.php e produto-formulario-base.php ... não achei nada também

Meu github coloquei as alterações: https://github.com/flavio-magela/PHP-O.Objeto Poderia me orientar novamente. :( Obrigado.

Olá, Flávio Magela Rosa dos Santos .

No arquivo Class/Produto.php não consta o método getNome() por isso quando você chama o mesmo ele da erro.

Inclua nesse arquivo o método:

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

Dica: Leia sobre as PSR-1 e PSR-2 para lhe ajudar sobre os padrões de codificação com PHP.

Espero ter lhe auxiliado.

Att,

Diego Brocanelli

solução!

Diego boa tarde; Encontrei o erro. Era na minha Class Produto.php, no methodo Construct(); Tinha colocado com apenas 1(um) andescore (_) _Construct() e na verdade são 2(dois)andercore () __Construnct(). Erro:

function _construct($nome, $preco, $descricao, Categoria $categoria, $usado) {
            $this->produto = $nome;
            $this->preco = $preco;
            $this->descricao = $descricao;
            $this->categoria = $categoria;
            $this->usado = $usado;

        }

Após corrigido, passado para 2 andescore a tela voltou a funcionar direito;

function __construct($nome, $preco, $descricao, Categoria $categoria, $usado) {
            $this->produto = $nome;
            $this->preco = $preco;
            $this->descricao = $descricao;
            $this->categoria = $categoria;
            $this->usado = $usado;

        }

Obrigado pela força.