Sto tentando di utilizzare accessors sintetizzati su un componente su Lucee (anche se questo problema sembra essere lo stesso anche in ColdFusion).Comportamento imprevisto con accessors = true su un componente
codiceRepro:
// Person.cfc
component accessors=true {
property firstName;
property lastName;
function init(firstName, lastName){
variables.firstName = arguments.firstName;
variables.lastName = arguments.lastName;
}
}
E il codice chiamante:
// person.cfm
person = new Person("Abigail", "Bowen");
writeDump(person);
Avviso come sto non utilizzando le funzioni di accesso sintetizzati qui, sto semplicemente impostando i valori degli argomenti in all'omonimo variabili con scope variabili.
Tuttavia quando si esegue questo codice, vedo questo:
Nota come le proprietà sono state popolate. Non c'è alcun problema con questo, ma chiaramente non capisco come dovrebbe funzionare il flag accessors
. Pensavo che fosse semplicemente inteso a sintetizzare alcuni metodi di accesso per me (che ha), ma questo è tutto.
noti inoltre che se modifico la definizione CFC per non di accesso impostata su true, quindi il dump mostra questo:
Quindi niente di accesso sintetizzati (come previsto), ma anche ora il le proprietà non vengono nemmeno visualizzate (con i valori delle variabili-ambito o no).
Non capisco davvero questa combinazione di "proprietà" e impostazione degli accessor? Sicuramente l'impostazione degli accessor dovrebbe avere un impatto solo sulla creazione di quei metodi di accesso?
Se stavo vedendo solo questo su una delle piattaforme, probabilmente lo metterei in una situazione inimmaginabile di come writeDump()
interpreta le definizioni di proprietà. Ma il comportamento è lo stesso su ColdFusion 11, quindi sembra davvero che ci siano delle differenze nel comportamento che non sto ottenendo.
Qualcuno può spiegarlo? Ci sono documenti che lo spiegano? Se no ... ehm ... perché no?
La mia preoccupazione di fondo qui è che i valori delle proprietà non vengono memorizzati "correttamente" e potrebbero causare problemi una volta che implemento più del codice.
UPDATE: Almeno su ColdFusion, sembra essere solo un cambiamento nel comportamento writeDump()
s', perché se ci sono getter per le proprietà (o meno il flag accessors
è impostato) allora i valori delle proprietà cominciano mostrando nella discarica. Questo non è il caso di Lucee, quindi c'è ancora un punto interrogativo lì.
Per motivi di completa divulgazione, questa domanda è un riepilogo di una domanda che ho anche chiesto sul mio blog ("CFML: trying to understand accessors"). La duplicazione è intenzionale in quanto il mio blog riceve un pubblico diverso da quello di questo sito.
Sì, questo è ciò che sembra (vedere il mio aggiornamento). Il comportamento di Lucee è leggermente in disaccordo con quello di ColdFusion. Immagino che Lucee cerchi l'impostazione * e * i metodi; CF cerca solo i metodi. E la differenza è interamente nel comportamento di scarico, non in qualsiasi altra cosa. –
Si tratta solo di un comportamento del costruttore CF9? In CF9, init() è diventato un vero costruttore in quanto, se ne hai uno, viene chiamato automaticamente quando usi la nuova parola chiave, la stessa di Java. La stessa cosa dovrebbe accadere se si rinomina init() in Person(). Se voi ragazzi foste corretti, accadrebbe anche se avete usato qualche altro nome di funzione - che non è così. Succede solo quando CF è in esecuzione come costruttore. – ialexander