This evening while adding some reporting to PotD (NSFW, OMM) to help nail down some performance issues that I think are Apache's fault, I noticed a strange issue with FB3lite. If you've used it, you know the core of the "framework" are the do() and include() UDFs. Both contain a CFINCLUDE tag, and a weird situation arises with scoping.
CFML has implicit scope traversal, so if you have an unscoped variable, it will automatically traverse across a bunch of scopes until it finds one with the right name. Further, you get an implicit local scope within UDFs, and you get a magic psuedo-scope within query-based CFOUTPUT and CFLOOP tags.
What I noticed was that looping over a query with a column named "template" always displayed the currently executing template, instead of the value from the query.  No worries, I thought, since prefixing it with the query name solved the issue. "template" isn't a common query name for me, so while it surprised me I'd never noticed or heard about this magic "template" variable before, I didn't think too much of it.
Then a while later I realized it was my own fault, because of the include() UDF in FB3lite. The argument to the UDF is named "template", and CFML places the implcit local scope at the top of the heap, including above the magic query-loop scope. That argument was shadowing my query variable.
I've fixed FB3lite to use a prefix on all it's UDF arguments, so this problem cannot manifest itself anymore. Well, I suppose it could, but you'd have to have a weird-ass variable name (e.g., "_fb3lite_template"). You can download the latest version, or pull it from Subversion.
Comments are closed.