OF
A palavra "data" é palavra reservada do TRecord e cria conflito
A palavra "data" é palavra reservada do TRecord e cria conflito com nome de coluna de tabela de bd SQLite
Otto Fuchshuber
Estou recebendo as seguintes mensagens num estudo que estou fazendo para portar um aplicativo para o framework Adianti:
(trechos dos programas e o layout de uma tabela do SQLite reproduzidos abaixo)
Reserved property name (data) in class LancImoveis
Warning: Illegal string offset 'codigoimovel' in C:xampphtdocsadiantiframeworkCap3libadiantidatabaseTRecord.php on line 179
O nome reservado 'data' não é do PHP e sim do TRecord do Adianti.
Alterei uma outra tabela mudando o nome da coluna data para datta e os erros e avisos desapareceram.
Mas não é muito atrativo fazer estas alterações em todas tabelas que tem uma coluna data.
Não sei bem como funciona o namespace no PHP mas como há herança de TRecord (que tem o namespace AdiantiDatabase) creio que de pouco adiantaria (se eu já soubesse como se faz)
Existe alguma maneira prática de sair desse impasse?
Otto Fuchshuber
Estou recebendo as seguintes mensagens num estudo que estou fazendo para portar um aplicativo para o framework Adianti:
(trechos dos programas e o layout de uma tabela do SQLite reproduzidos abaixo)
Reserved property name (data) in class LancImoveis
Warning: Illegal string offset 'codigoimovel' in C:xampphtdocsadiantiframeworkCap3libadiantidatabaseTRecord.php on line 179
O nome reservado 'data' não é do PHP e sim do TRecord do Adianti.
Alterei uma outra tabela mudando o nome da coluna data para datta e os erros e avisos desapareceram.
Mas não é muito atrativo fazer estas alterações em todas tabelas que tem uma coluna data.
Não sei bem como funciona o namespace no PHP mas como há herança de TRecord (que tem o namespace AdiantiDatabase) creio que de pouco adiantaria (se eu já soubesse como se faz)
Existe alguma maneira prática de sair desse impasse?
- <?php
- class LancImoveis extends TRecord
- {
- const TABLENAME = 'lancimoveis';
- const PRIMARYKEY = 'chave';
- const IDPOLICY = 'max'; // {max, serial}
- const CACHECONTROL = 'TAPCache';
- public function __construct($chave = NULL)
- {
- parent::__construct($chave);
- parent::addAttribute('data');
- parent::addAttribute('codigoimovel');
- parent::addAttribute('nomeimovel');
- parent::addAttribute('codredatributo');
- parent::addAttribute('codigoatributo');
- parent::addAttribute('nomeatributo');
- parent::addAttribute('codhistorico');
- parent::addAttribute('textohistorico');
- parent::addAttribute('complemento');
- parent::addAttribute('grupo');
- parent::addAttribute('bloco');
- }
- (...)
- <?php
- class LancImoveisObjectLoad extends TPage
- {
- public function __construct()
- {
- parent::__construct();
- try
- {
- TTransaction::open('IMOVEISLOCACOES');
- parent::__construct();
- try
- {
- TTransaction::open('IMOVEISLOCACOES');
- $lancimovel= new LancImoveis(1);
- echo 'chave : ' . $lancimovel->chave . "<br>\n";
- echo 'data : ' . $lancimovel->data . "<br>\n";
- (...)
- CREATE TABLE [lancimoveis] (
- [chave] INTEGER PRIMARY KEY NOT NULL,
- [data] VARCHAR(8) NOT NULL,
- [codigoimovel] INTEGER NOT NULL,
- [nomeimovel] VARCHAR(70) NULL,
- [codredatributo] INTEGER NOT NULL,
- [codigoatributo] VARCHAR(15) NOT NULL,
- [nomeatributo] VARCHAR(70) NULL,
- [codhistorico] INTEGER NULL,
- [textohistorico] VARCHAR(70) NULL,
- [complemento] VARCHAR(100) NULL,
- [grupo] INTEGER DEFAULT '0' NOT NULL,
- [bloco] INTEGER DEFAULT '0' NULL
- )
infelizmente não, vai ter que mudar o nome da coluna mesmo, caso contrario não podera usar essa coluna no Framework
Obrigado, William pela (triste) informação. Talvez numa versão futura 'data' possa ser substituído por algo como _data ou coisa parecida.
Em varias linguagens de programação a palavra data é reservada, no Adianti o conselho é usar data_nascimento por exemplo.
Eu fiz uma pesquisa rápida quanto a keywords e reserved words no Google.
'data' (sem as aspas) não é palavra exclusiva nas seguintes linguagens:
C#, C++, Java, Ruby on Rails, PHP, Javascript (ECMAscript).
'data' (sem as aspas) é palavra exclusiva em Cobol (IBM) e Fortran, que são juntas com o LISP as mais antigas linguagens ainda em uso ativo.
Não é mencionado como palava exclusiva em
https://adianti.com.br/index.doc.php?doc=php/reserved.html
que só lista palavas exclusivas do PHP
List of Reserved Words
Table of Contents
List of Keywords
Predefined Classes
Predefined Constants
Aparece em vários lucares em TRecord.php do Adianti Framework como por exemplo:
if ($property == 'data')
{
throw new Exception(AdiantiCoreTranslator::translate('Reserved property name (^1) in class ^2', $property, get_class($this)));
}
Mas que não consta do código do TRecord.class.php no livro do Pablo Dall'Oglio , pápina 266, PHP Programando com Orientação a Objetos, segunda edição, Novatec, Setembro 2007.
Mas vou por ora retornar à minha linha principal de estudo e mudar nas tabelas que tenham a coluna data para datta.
Obrigado, Felipe, pelo esclarecimento.