Мне кажется, я понимаю, что здесь происходит. Поведение, которое вы видите, происходит из области поиска при доступе к переменным для их установки. Когда вы устанавливаете переменную, не ограничивая ее, ColdFusion будет искать области видимости, чтобы определить, существует ли эта переменная где-либо сначала, и если это произойдет, она установит ее там.
В вашем первом примере:
<cfset qryChain = queryNew("id,next")>
<!--- add some data so the cfloop kicks in --->
<cfloop query="qryChain">
<cfset Next = StructNew()>
<cfset Next.id = qryChain.next>
</cfloop>
Когда вы создаете свою переменную «Next», она фактически помещает эту переменную в область действия VARIABLES, вы можете доказать это, если вы сбросите область действия переменной в любой момент в процессе зацикливания. Вы увидите «Следующая переменная» с пустой структурой.
Проблема в следующей строке. Когда вы пытаетесь получить доступ к переменной Next, чтобы установить в ней новый ключ, ColdFusion сначала находит переменную Next, которая существует в результате запроса, потому что во время зацикливания запроса область запросов (на самом деле не является областью, но работает как этот случай) имеет более высокий приоритет, чем область действия переменных. Эта переменная не содержит структуру, поэтому вы получите ошибку о том, как вы на нее ссылаетесь.
Поиск в области происходит, но это не во время настройки, а во время доступа для установки.
Вот рабочий пример, чтобы продемонстрировать это.
<cfset qryChain = queryNew("id,next")>
<cfset queryAddRow(qryChain, 3) />
<cfdump var="#qryChain#">
<!--- add some data so the cfloop kicks in --->
<cfloop query="qryChain">
<cfset Next = StructNew()>
<cfdump var="#variables#">
<cfset Next.id = qryChain.next>
<cfdump var="#qryChain#">
</cfloop>
в этом примере я показываю, что после того, как вы создадите следующую переменную, она существует в области видимости переменных, но когда вы сразу попытаетесь ввести ключ в нее, не ограничивая доступ, вы получите вместо этого переменную NEXT из текущей записи в запросе. Это происходит только потому, что в запросе есть запись с именем столбца, которое совпадает с переменной, которую вы пытаетесь использовать.
Так почему же ColdFusion не пытается установить StructNew () в область запросов (псевдо-область)? Запросом нельзя манипулировать с помощью точечной нотации. Опять же, это не совсем сфера. Так что в этом смысле он доступен только для чтения и пропускается через
Чтобы манипулировать набором результатов запроса в CF, вы должны использовать область действия функций VARIABLES. Поскольку переменные с незаданной областью всегда помещаются в область VARIABLES. Однако в строке, где вы пытаетесь установить идентификатор, в фоновом режиме происходит еще одна фаза, где сначала необходимо получить доступ к переменной с возможностью чтения, а затем попытаться выполнить набор. В этом случае он НАХОДИТСЯ переменную NEXT в запросе, потому что сначала будет произведен поиск области, чтобы определить, существует ли в NEXT значение для установки этого ключа, а затем, когда вы попытаетесь что-то установить для него, произойдет ошибка.
Что касается вашего второго набора примеров, это ожидаемое поведение и его легко объяснить.
В первом примере вы изменяете свою переменную (которая помещает ее в локальную область видимости). Затем вы устанавливаете значение этой переменной. Когда вы устанавливаете значение в переменную (не ограничивая его), ColdFusion проверяет, существует ли эта переменная где-либо еще (таким образом, она выполняет поиск по области, опять-таки, к этому моменту выполняется доступ, а не устанавливается), она находит его в локальной области. и затем установите значение там. После этого вы снова устанавливаете значение, на этот раз правильно определяете его, поэтому поиск не производится.
Во втором примере вы не изменяете переменную, когда она изначально установлена, она нигде не существует, и поэтому она установлена в область видимости переменных. Если бы он уже существовал в локальной области видимости, то ColdFusion нашел бы его и установил там (как в первом примере), но, поскольку он не существовал, и он не был изменен, он был установлен в область видимости переменных.
Наконец, в последнем примере вы явно задаете область видимости своей переменной, и она будет установлена в локальной области видимости. Вы тогда устанавливаете это снова, не ограничивая это. ColdFusion найдет его в локальной области и перезапишет.
Мораль этой истории заключается в том, чтобы охватить ваши переменные.Мне важно получить ожидаемое поведение.Поиск области никогда не был хорошей идеей, но, к сожалению, он здесь, чтобы остаться.Я не вижу здесь ничего такого, что я бы назвал ошибкой или даже непредсказуемым поведением, если вы понимаете, как работает поиск по области.