Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Não foi possível chamar o método construtor da classe Olá, Pablo e pessoal da comunidade. Primeiro quero dizer que esse framework é muito bom. Eu já vinha usando alguns componentes que foram desenvolvidos no livro PHP Programando com Orientações a Objetos e agora com o framework tudo parece estar melhor. Eu vinha lendo o livro Adianti Framework para PHP e fazendo os exemplos no framework, cuja a versão é a 1.0.3. Eu tive um problema ao...
JA
Não foi possível chamar o método construtor da classe  
Fechado
Olá, Pablo e pessoal da comunidade.

Primeiro quero dizer que esse framework é muito bom. Eu já vinha usando alguns componentes que foram desenvolvidos no livro PHP Programando com Orientações a Objetos e agora com o framework tudo parece estar melhor.

Eu vinha lendo o livro Adianti Framework para PHP e fazendo os exemplos no framework, cuja a versão é a 1.0.3.
Eu tive um problema ao executar o exemplo da página 48 mais especificamente o arquivo CollectionUpdate.class.php.

  1. <?php
  2. class CollectionLoad extends TPage
  3. {
  4.     public function __construct()
  5.     {
  6.         parent::__construct();
  7.         try
  8.         {
  9.             TTransaction::open('samples'); // abre uma transação
  10.             $criteria = new TCriteria;
  11.             $criteria->add(new TFilter('gender''=''F'));
  12.             
  13.             $repository = new TRepository('Customer');
  14.             $customers $repository->load($criteria);
  15.             
  16.             foreach ($customers as $customer)
  17.             {
  18.                 echo $customer->id ' - ' $customer->name '<br>';
  19.             }
  20.             TTransaction::close(); // fecha a transação.
  21.         }
  22.         catch (Exception $e)
  23.         {
  24.             new TMessage('error'$e->getMessage());
  25.         }
  26.     }
  27. }
  28. ?>


Ao executar o arquivo eu recebo uma mensagem de erro (TMessage) 'Não é possível chamar o construtor da classe'.
Acredito que os objetos Customer's não estão sendo carregados e, consequentemente, o TRepository não está conseguindo chamar o método construtor dos objetos Customer's.

A fim de verificar o comando SQL gerado eu utilizei a classe TLoogerTXT e verifiquei que o comando SQL está correto e retornando as linhas da tabela corretamente.

Então, não sei o que está ocasionando o problema.
Vocês podem me ajudar a descobrir esse problema?
Agradeço desde já qualquer ajuda.
:)


Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (5)


JA

P.S. Gostaria de mudar o título do post pra algo mais sugestivo (Não foi possível chamar o método construtor da classe - Livro: Adianti Framework para PHP pag 48)
FC

O nome da classe que vc criou esta diferente vc percebeu ?

CollectionLoad

Digita assim como está na url, ou mude para CollectionUpdate como no exemplo.

Sds
Felipe Cortez
PD

Jairo,

Em primeiro lugar, obrigado!

Para facilitar o debug, experimente substituir:
  1. <?php
  2. new TMessage('error'$e->getMessage());
  3. ?>

por:
  1. <?php
  2. new TExceptionView($e);
  3. ?>


Vai dar um debug mais completo.

Atenciosamente,
Pablo
JA

Desculpe a demora pra responder. Eu estava muito ocupado recentemente, mas logo retornarei ao estudo do Adianti Framework.

Eu descobri o problema.

O problema aconteceu depois que eu havia criado o método interceptador do atributo
birthdate
(set_birthdate)
da classe
Customer
no exemplo anterior do livro. Acontece que eu já havia inserido alguns (2) registros de Clientes (Customer) que não seguia o padrão de data do método ('2014-11-07').
Quando o objeto TRepository tentava instanciar o objeto Customer ele não conseguia porque no método construtor da classe TRecord não conseguia atribuir a data no novo padrão para o atributo birthdate, logo, o erro 'Não é possível chamar o construtor da classe'.

Espero que tenham entendido. Foi um pouco difícil saber qual era o erro. Cheguei a pensar que era um problema no método load() da classe TRepository.

No meu post coloquei o nome da classe errada CollectionUpdate.class.php mas se referia a CollectionLoad.class.php.


  1. <?php
  2.     /**
  3.      * Encapsulate the birthdate property
  4.      * Sample: $customer->birthdate = 'March, 8';
  5.      */
  6.     public function set_birthdate($value)
  7.     {
  8.         $parts explode('-'$value);
  9.         if (checkdate($parts[1], $parts[2], $parts[0]))
  10.         {
  11.             $this->data['birthdate'] = $value;
  12.         }
  13.         else
  14.         {
  15.             throw new Exception("Cannot set '{$value}' in birthdate");
  16.         }
  17.     }
  18. ?>


Usarei o 'new TException($e)' para ver se consigo informações mais detalhadas do bug, Pablo.
Obrigado pela ajuda, pessoal.
EC

Me ajudou bastante, também estava com esse mesmo problema e conseguir solucionar e entender graça a seu post.