5
respostas

Method 'getX' not found in...

Olá, terminando as aulas me deparei com um erro, os getters no arquivo "produto-lista.php" me avisam que o metodo getNome() por exemplo nao existe.

<?php
require_once("cabecalho.php");
require_once("logica-usuario.php");

verificaUsuario();

?>

<table class="table table-striped table-bordered">
    <?php
    $produtoDao = new ProdutoDao($connection);
    $produtos = $produtoDao->listaProdutos();
    foreach($produtos as $produto) :
    ?>
    <tr>
        <td><?= $produto->getNome() ?></td>
        <td><?= $produto->getPreco() ?></td>
        <td><?= $produto->calculaImposto()?></td>
        <td><?= substr($produto->getDescricao(), 0, 70) ?></td>
        <td><?= $produto->getCategoria()->getNome()?></td>
        <td><?php
                if($produto->isLivro()){
                    echo "ISBN: ".$produto->getIsbn();
                }
            ?>
        </td>
        <td><a class="btn btn-primary" href="produto-altera-formulario.php?id=<?=$produto->getId()?>">Alterar</a></td>
        <td>
            <form action="remove-produto.php" method="post">
                <input type="hidden" name="id" value="<?=$produto->getId()?>" />
                <button class="btn btn-danger">Remover</button>
            </form>
        </td>
    </tr>
<?php endforeach
?>

</table>

<?php include("rodape.php"); ?>

Avisa também que os metodos no arquivo ProdutoDAO.php referente a getIsbn(), getWaterMark() e getTaxaImposto() não existem em Produto

$isbn = "";
        if($produto->isLivro()) {
            $isbn = $produto->getIsbn();
        }

        $waterMark = "";
        if($produto->isWaterMark()) {
            $waterMark = $produto->getWaterMark();
        }

        $taxaImpressao = "";
        if($produto->isTaxaImpressao()) {
            $taxaImpressao = $produto->getTaxaImpressao();
        }

Produto.php

abstract class Produto {

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

    public function isLivro(){
        return $this instanceof Livro;
    }
    public function isTaxaImpressao(){
        return $this instanceof LivroFisico;
    }
    public function isWaterMark(){
        return $this instanceof Ebook;
    }
    abstract function atualizaBaseadoEm($params);

Ebook.php

<?php

class Ebook extends Livro{

    private $waterMark;


    public function atualizaBaseadoEm($params) {
        $this->setIsbn($params["isbn"]);
        $this->setWaterMark($params["waterMark"]);
    }

    //GETTERS AND SETTERS
    public function getWaterMark(){
    return $this->waterMark;
    }

    public function setWaterMark($waterMark){
    $this->waterMark = $waterMark;
    }
}

Coloquei o Ebook.php porque no Produto-formulario-base.php ele diz que getWaterMark() nao existe in LivroFisico. Alguem sabe o que pode estar acontecendo?

5 respostas

Oi Gian, tudo bom?

Em relação a: Coloquei o Ebook.php porque no Produto-formulario-base.php ele diz que getWaterMark() nao existe in LivroFisico

Acredito que faça sentido mesmo, porque livro fisico não costuma ter marca d'agua. Esse é um método especifico da classe Ebook mesmo.

Quanto ao getNome. Aqui:

<td><?= $produto->getNome() ?></td>
        <td><?= $produto->getPreco() ?></td>
        <td><?= $produto->calculaImposto()?></td>
        <td><?= substr($produto->getDescricao(), 0, 70) ?></td>
        <td><?= $produto->getCategoria()->getNome()?></td>

Temos getNome sendo usado em Categoria e Produto. Em qual das duas rola esse erro?

Aqui, em Produto, realmente parece não ter o método getNome:

abstract class Produto {

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

    public function isLivro(){
        return $this instanceof Livro;
    }
    public function isTaxaImpressao(){
        return $this instanceof LivroFisico;
    }
    public function isWaterMark(){
        return $this instanceof Ebook;
    }
    abstract function atualizaBaseadoEm($params);

Se você quiser os getters e setters dessa classe, você encontra aqui:

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

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

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

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

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

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

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

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

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

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

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

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

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

Esse código está disponivel no capitulo 4 do primeiro curso de PHP e orientação a objetos

Abraço =)

Desculpa, eu esqueci de colocar todos o getters e setters aqui na pergunta, mas existe um getNome() em Produto, e eu uso ele para puxar o nome do Produto, porem no produto-lista.php não puxa ele reconhece $produto, mas todos os métodos que tento acessar ele diz que nao encontrou.

Na hora de instanciar um produto ele esta passando uma instancia de LivroFisico, eu tenho que passar um $tipoProduto?

produto-formulario.php

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

por isso ele não reconhece o getWaterMark();

O erro em ProdutoDAO ele não reconhece o comando getIsbn(); nem o getTaxaImpressa(); e tambem o getWaterMark();

 $isbn = "";
        if($produto->isLivro()) {
            $isbn = $produto->getIsbn();
        }

mesmo eu definindo

public function isLivro(){
        return $this instanceof Livro;
    }

ele diz em ProdutoDAO, getIsbn() no found in Produto

 insereProduto(Produto $produto);

Exemplo do erro ao fazer uma inserção

string(181) "INSERT INTO PRODUTOS (NOME, PRECO, DESCRICAO, CATEGORIA_ID, USADO, ISBN, TIPO_PRODUTO, TAXA_IMPRESSAO, WATERMARK) VALUES ('Livro PHP',50,'Ebook', 2,0, '12355', 'Ebook', '', '12345')"
O produto Livro PHP não foi adicionado

Estranho mesmo...

No seu produo formulário você está utilizando a classe para fabricar produtos? Algo como:


class ProdutoFactory {

    private $classes = array("Ebook", "LivroFisico");

    public function criaPor($tipoProduto, $params) {

        $nome = $params['nome'];
        $preco = $params['preco'];
        $descricao = $params['descricao'];
        $categoria = new Categoria();
        $usado = $params['usado'];

        if (in_array($tipoProduto, $this->classes)) {
            return new $tipoProduto($nome, $preco, $descricao, $categoria, $usado);
        }

        return new LivroFisico($nome, $preco, $descricao, $categoria, $usado);
    }
}

Verifica pra mim exatamente o que está sendo passado no método adiciona:

...
$produtoDao = new ProdutoDao($conexao);
// verificamos o que tem em produto
var_dump($produto);
// para a execução
die();
if($produtoDao->insereProduto($produto)) { ?>
    <p class="text-success">O produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> foi adicionado.</p>
<?php 
} else {
    $msg = mysqli_error($conexao);
?>
    <p class="text-danger">O produto <?= $produto->getNome() ?> não foi adicionado: <?= $msg?></p>
<?php
}
?>

<?php include("rodape.php"); ?>

Compartilha com a gente aqui o que rola, dizendo quais informações você selecionou no cadastro para o tipo do produto =)

Os campos da minha tabela estão todos com nomes MAIÚSCULO, no Produto Factory estava

$nome = $params['nome];

ao invés de

$nome = $params['NOME'];

Quando eu altero para letra maiúscula o produto-lista.php aparece todos os produtos listados, porém, o insert aparece vazio, sendo que antes em minusculo apareciam os dados do INSERT.Quando tento inserir um Ebook por exemplo ele passa os parametros getWaterMark(); e getIsbn(): porém os outros valores estao NULL

object(Ebook)#3 (8) { ["waterMark":"Ebook":private]=> string(5) "12345" ["isbn":"Livro":private]=> string(4) "1234" ["id":"Produto":private]=> NULL ["nome":"Produto":private]=> NULL ["preco":"Produto":private]=> NULL ["descricao":"Produto":private]=> NULL ["categoria":"Produto":private]=> object(Categoria)#2 (2) { ["id":"Categoria":private]=> string(1) "2" ["nome":"Categoria":private]=> NULL } ["usado":"Produto":private]=> int(0) }

Ao realizar o INSERT ele da um erro de que o PHPStorm nao está reconhecendo o SQLServer (que no caso estou usando) deve ter ocorrido algum problema com ele... mas o var_dump($produto) como eu disse so tem preenchido os campos do Ebook, o resto vem NULL. ao retornar com os nomes em minusculo o INSERT nao funciona talvez pelo problema no SQLServer porém o INSERT acontece igual antes

string(181) "INSERT INTO PRODUTOS (NOME, PRECO, DESCRICAO, CATEGORIA_ID, USADO, ISBN, TIPO_PRODUTO, TAXA_IMPRESSAO, WATERMARK) VALUES ('Livro PHP',50,'Ebook', 2,0, '12355', 'Ebook', '', '12345')"

Boa! Da uma olhada nessa conexão com o sql server para inserir. Se ele lista os produtos significa que a conexão está ocorrendo normalmente.

Quanto ao produto, se temos os dados especificos de ebook, é porque o método:

public function atualizaBaseadoEm($params) {
        $this->setIsbn($params["isbn"]);
        $this->setWaterMark($params["waterMark"]);
    }

Está funcionando. Se o resto esta nulo é porque na nossa factory:

public function criaPor($tipoProduto, $params) {

        $nome = $params['nome'];
        $preco = $params['preco'];
        $descricao = $params['descricao'];
        $categoria = new Categoria();
        $usado = $params['usado'];

        if (in_array($tipoProduto, $this->classes)) {
            return new $tipoProduto($nome, $preco, $descricao, $categoria, $usado);
        }

        return new LivroFisico($nome, $preco, $descricao, $categoria, $usado);
    }

os valores em $params estão vindo nulos. Da uma verificada com um var_dump nesse array $params pra garantir que ele vem preenchido e que estamos acessando as chaves certas dentro dele.

Compartilha aqui com a gente o dump =)

Abraço.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software