Ir para conteúdo
Fórum Script Brasil
  • 0

Métodos com instanciamento de objetos nos Parâmetros[Resolvido]


jefponte

Pergunta

Estou lendo um livro chamado PHP - Programando com Orientação a Objetos. E estou tentando implementar um projeto QUERY OBJECT que ele ensina a fazer.

No projeto, ele usa orientação a objetos para criar uma estrutura que faz com que você não precise digitar códigos em SQL para fazer uma consulta. Começa com a classe abstrata. TExpression, depois cria as classes filhas, TFilter, para retornar as expressões de Filtro (ex: idade > 10; outro exemplo, numero = 200) depois tem outra classe filha TCriteria, q junta os objetos do Tipo TFilter para criar uma string com várias expressões concatenadas e separadas pelo operador And ou OR, dependendo do parâmetro usado. Isso tudo usando dois, três ou vários objetos TFilter. Resultando numa string parecida com essa: "(idade > 10 OR idade < 90) AND (id > 30)".

Eu escrevi o código exatamente como o Livro ensina, mas estou tendo erros ao instanciar o Objeto do tipo TCriteria.

Aqui vai o download do livro em PDF: http://www.mediafire.com/view/?ax6jqg37nu7abye

O projeto começa a ser ensinado na página 170. Se alguém quiser dar uma olhada e me ajudar.

Também vou tentar escrever logo abaixo as partes em q o erro está apresentado.

Quero muito entender o que o livro ensina, pois vai ser importante na hora de passar a próxima etapa.

Projeto QueryObject

TCriteria.class.php

class TCriteria extends TExpression{

    private $expressions;
    private $operators;
    private $properties;
    
    
    
    public function add(TExpression $expression, $operator = self::AND_OPERATOR){

        if(empty($this->expressions))
        {
            unset($operator);
        }
        
        $this->expressions[] = $expression;
        $this->operators[] = $operator;
        
    }
    
    public function dump()
    {
        if(is_array($this->expressions))
        {
            foreach ($this->expressions as $i => $expression)
            {
                $operator = $this->operators[$i];
                $result = null;
                $result .=$operator.' '. $expression->dump() . ' ';
                
            }
            $result = trim($result);
            return "({$result})";
            
        }
    }
    public function setProperty($property, $value)
    {
        $this->properties[$property] = $value;
    }
    
    public function getProperty($property)
    {
        return $this->properties[$property];
    }
    
}
?>
Repare bem nestas linhas:
public function add(TExpression $expression, $operator = self::AND_OPERATOR){

        if(empty($this->expressions))
        {
            unset($operator);
        }

O erro está aqui, no unset($operator);

Pois ele elimina a variável e depois atribui a mesma variável a uma variável de instancia. Não entendi porque ele fez isso, mas está no livro.

O Erro mostrado é Undefinid variable in line....

Depois tem outra coisa q não entendo muito bem. Como funciona esse instanciamento no parâmetro da função?

O que é q significa essa variável $expression dentro da função add? Porque tem o nome da outra classe TExpression antes? Significa q o $expression é uma variável de instancia do objeto tipo TExpression? Ou TExpression é o objeto e logo após variáveis de Instancia devem ser adicionadas, e estas não tem nada haver com o objeto TExpression?

O livro não explica bem essa parte e gostaria muito de uma ajuda.

Editado por jefponte
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Instanciando o objeto TCriteria

$criteria = new TCriteria;
$criteria->add(new TFilter('idade', '<', 16), TExpression::OR_OPERATOR);
$criteria->add(new TFilter('idade', '>', 60), TExpression::OR_OPERATOR);
echo $criteria->dump();
echo "<br>\n";

O Resultado deveria ser o retorno de um string assim:

(idade < 16 OR idade > 60 )

Entretanto ele mostra apenas:

Notice: Undefined variable: operator in D:\web\workspace\patern\app.ado\TCriteria.class.php on line 19

Call

(OR idade > 60)

Link para o comentário
Compartilhar em outros sites

  • 0

Uma dúvida eu já consegui resolver: Sobre o objeto inserido no parâmetro do método add().

Quando o método add foi declarado com o objeto TExpression, o nome $expression é a variável que vai armazenar o objeto. Esse objeto não é instanciado da classe TExpression e sim de qualquer de suas classes filhas. Então o $expression recebe um objeto que será inserido por parâmetro na hora de chamar o TCriteria. Exemplo:

$exemplo = new TCriteria;
$exemplo->add(TFilter('idade', '>', 10));
$exemplo->add(TFilter('idade', '<', 20));

Resultado esperado:

('idade' > 10 and 'idade' < 20)

Explica outra coisa agora. Ele não apresenta erro quando envio para o servidor externo que tenho na internet(lembrando que é a mesma versão do PHP q tenho no meu PC).

NO meu PC ele apresenta o erro:

Notice: Undefined variable: operator in D:\web\workspace\patern\app.ado\TCriteria.class.php on line 19

Call

Link para o comentário
Compartilhar em outros sites

  • 0
Por padrão, os servidores web desabilitam os erros no php, deixando apenas liberado os erros fatais. Você pode alterar isso diretamente no php.ini ou usando a função error_reporting();

Funcionou! Muito obrigado, Dedas.

Agora posso continuar meu estudo!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...