Implicit Conversion Functions
Following up with Magic Functions - Implicit Component Getters / Setters , there's one more gem. Again, this has been around since Lucee 2. We're going to make a new, yet similar example. This time, we're going to create an address object:
address.cfc
<cfcomponent output="false">
<cffunction name="init" access="public" returntype="address" output="false">
<cfreturn this>
</cffunction>
<cffunction name="setStreet1" access="public" returntype="void" output="false">
<cfargument name="street" required="true" type="string" default="">
<cfif len(arguments.street)>
<cfset variables.street1 = arguments.street>
<cfelse>
<cfthrow message="Street 1 is required.">
</cfif>
</cffunction>
<cffunction name="setCity" access="public" returntype="void" output="false">
<cfargument name="city" required="true" type="string" default="">
<cfif len(arguments.city)>
<cfset variables.city = arguments.city>
<cfelse>
<cfthrow message="City is required.">
</cfif>
</cffunction>
<cffunction name="setState" access="public" returntype="void" output="false">
<cfargument name="state" required="true" type="string" default="">
<cfif len(arguments.state) EQ 2>
<cfset variables.state = arguments.state>
<cfelse>
<cfthrow message="State is required and must be a 2 character length.">
</cfif>
</cffunction>
<cffunction name="setPostalCode" access="public" returntype="void" output="false">
<cfargument name="postalcode" required="true" type="string" default="">
<cfif len(arguments.postalcode)>
<cfset variables.postalcode = arguments.postalcode>
<cfelse>
<cfthrow message="Postal Code is required.">
</cfif>
</cffunction>
<cffunction name="getStreet1" access="public" returntype="string" output="false">
<cfreturn variables.street1>
</cffunction>
<cffunction name="getCity" access="public" returntype="string" output="false">
<cfreturn variables.city>
</cffunction>
<cffunction name="getState" access="public" returntype="string" output="false">
<cfreturn variables.state>
</cffunction>
<cffunction name="getPostalCode" access="public" returntype="string" output="false">
<cfreturn variables.postalcode>
</cffunction>
<cffunction name="_toString" access="public" returntype="string" output="false">
<cfset var address = "">
<cfsavecontent variable="address"><cfoutput>#getStreet1()#<br>#getCity()#, #getState()# #getPostalCode()#</cfoutput></cfsavecontent>
<cfreturn address>
</cffunction>
</cfcomponent>
index.cfm
<cfset address = createObject('component','address').init()>
<cfset address.street1 = "Some Street">
<cfset address.city = "Some City">
<cfset address.state = "CA">
<cfset address.postalcode = "12345">
<cfoutput>#address#</cfoutput>
Now, in the address.cfc, note that we have a new function named _toString
- This is a special conversion/function method name.
There are other simple types available:
- _toBoolean()
- _toDate()
- _toNumeric()
- _toString()
- _toJSON()
Now, let's look at the output of my address object:
Some Street
Some City, CA 12345
As you can see, the address object was converted to a string via the _toString
function.