Я пытаюсь использовать синтезированные аксессоры на компоненте на Lucee (хотя эта проблема, похоже, одинакова и для ColdFusion).Неожиданное поведение с accessors = true для компонента
Репро код:
// Person.cfc
component accessors=true {
property firstName;
property lastName;
function init(firstName, lastName){
variables.firstName = arguments.firstName;
variables.lastName = arguments.lastName;
}
}
И вызывающий код:
// person.cfm
person = new Person("Abigail", "Bowen");
writeDump(person);
Обратите внимание, как я не используя синтезированные аксессор здесь, я просто устанавливая значение аргументов в одноименный переменные с переменными.
Однако, когда я запускаю этот код, я вижу это:
Обратите внимание, как свойства были заселены. Нет проблем с этим, но я явно не понимаю, как должен работать флаг accessors
. Я думал, что это просто предназначено для синтеза некоторых методов доступа для меня (что у него есть), но это все.
отметить также, что, если я изменить определение CFC для не набор аксессорах к истинным, то дамп показывает это:
Так что нет синтезированные аксессоров (как и ожидалось), но и сейчас свойства даже не отображаются (со значениями с переменными или нет).
Я действительно не понимаю это сочетание «свойств» и настроек аксессуаров? Разумеется, настройка аксессоров должна влиять только на то, создаются ли эти методы доступа?
Если бы я видел это только на одной из платформ, я бы, вероятно, поставил его под каприз, как writeDump()
интерпретирует определения свойств. Но поведение ColdFusion 11 одинаково, поэтому действительно кажется, что есть некоторая разница в поведении, которое я не совсем понимаю.
Может ли это объяснить это? Есть ли какие-либо документы, которые объясняют это? Если нет ... гм ... почему бы и нет?
Основная проблема заключается в том, что значения свойств не сохраняются «должным образом» и могут вызвать у меня проблемы, когда я реализую больше кода.
ОБНОВЛЕНИЕ: По крайней мере, на ColdFusion, по-видимому, чтобы быть просто изменением в поведении writeDump()
«ы, потому что если есть геттеры для свойств (или не установлен, то accessors
флага), то значение свойств начинает появляться в дампе. Однако это не относится к Lucee, поэтому там есть вопросительный знак.
Ради полного раскрытия, этот вопрос представляет собой резюме вопроса, который я также задал в своем блоге («CFML: trying to understand accessors»). Дублирование преднамеренно, так как мой блог получает другую аудиторию от того, что на этом сайте.
Да, это то, что кажется (см. Мое обновление). Однако поведение Люси немного расходится с ColdFusion. Думаю, Люси ищет настройки * и * методы; CF просто ищет методы. И разница полностью в поведении дампа, а не что-то еще. –
Это только случай поведения конструктора CF9? В CF9 init() стал истинным конструктором в том случае, если он у вас есть, он автоматически вызывается, когда вы используете новое ключевое слово, то же, что и в Java. То же самое произойдет, если вы переименуете init() в Person(). Если вы, ребята, были правы, это также произойдет, если вы использовали другое имя функции, а это не так. Это происходит только тогда, когда CF работает как конструктор. – ialexander