オブジェクトのタイプ
データ型
ColdFusion では、ユーザーが変数に型を割り当てたり、ColdFusion が変数名に型を関連付けたりすることはないので、タイプレスな環境であるように見えます。しかし実際は、変数が表すデータには型があります。データ型は、式の評価や関数の引数の評価に影響を与えます。ColdFusion では、式を評価するときに多くのデータ型を他のデータ型に自動的に変換できます。数値や文字列などの単純データの場合は、変数が式の中や関数の引数として使用されるまでデータ型は問題になりません。
ColdFusion 変数のデータ型は、次のいずれかのカテゴリに属しています。
- 単純 1 つの値。ColdFusion の式で直接使用できます。数値、文字列、ブール値、日付時刻値などがあります。
- バイナリ GIF ファイルや実行可能プログラムファイルの内容などの生データ。
- 複合 ** データのコンテナ。通常、複数の値を表します。ColdFusion のビルトイン複合データ型には、配列、構造体、クエリ、XML ドキュメントオブジェクトなどがあります。配列などの複合変数は ColdFusion 式で直接使用できませんが、複合変数の単純データ型要素は式で使用できます。例えば、myArray という数値の 1 次元配列がある場合、式 myArray * 5 は使用できませんが、配列の 3 番目の要素に 5 を乗算する式 myArray3 * 5 は使用できます。
- オブジェクト 複合構造。データと関数演算の両方がカプセル化されているのが一般的です。次の表に、ColdFusion で使用可能なオブジェクトのタイプと、使用方法の参照先を示します。
|
参照先 |
---|---|
COM(Component Object Model) |
|
CORBA(Common Object Request Broker Architecture) |
|
Java |
|
ColdFusion コンポーネント |
|
Web サービス |
データ型に関する注意
ColdFusion 変数には型が割り当てられませんが、変数に格納されているデータの型という意味で、便宜上 "変数の型" という表現を使用します。
ColdFusion では、フォームフィールドおよびクエリパラメーターに含まれているデータの型を検証できます。詳しくは、変数の存在の確認の「変数の存在のテスト」および cfqueryparam によるセキュリティの強化の「cfqueryparam の使用」を参照してください。cfdump タグは、変数(ColdFusion の複合データ構造体も含む)の内容をすべて表示します。このタグは、複合データおよびそのデータを処理するコードのデバッグに便利です。ColdFusion には、変数のデータ型を識別するための次の関数が用意されています。
- IsArray
- IsBinary
- IsBoolean
- IsImage
- IsNumericDate
- IsObject
- IsPDFObject
- IsQuery
- IsSimpleValue
- IsStruct
- IsXmlDoc
また、ColdFusion には文字列を他のデータ型で表したり変換したりできるかどうかを判断する次の関数も用意されています。 - IsDate
- IsNumeric
- IsXML
ColdFusion(2016 リリース)以前:
ColdFusion では、null データ型は使用されません。ただし、データベースや Java オブジェクトなどの外部ソースから null 値を受け取った場合は、単純値として使用されるまで null 値が維持され、その時点で、ColdFusion は null を空の文字列( "" )に変換します。また、Java オブジェクトを呼び出す際に JavaCast 関数を使用して、ColdFusion の空の文字列を Java の null に変換することができます。
NULL 変数サポート
ColdFusion 2016 リリース以前のバージョンでは、CFML は NULL 値をサポートしていませんでした。ColdFusion は null 値を空の文字列に変換します。SerializeJSON などの CFquery などの演算子では、Null 値は空の文字列(null ではない値)へ自動変換されます。
以下のコードは期待どおり動作します。
<cfscript> myvar=""; // empty string writeOutput(isNULL(myvar)); // returns NO </cfscript>
以下のコードは例外を返します。
<cfscript> myvar=NULL; // value is NULL writeOutput(isNULL(myvar)); // returns Variable NULL is undefined </cfscript>
ただし、JavaCast 関数を通じていつでも NULL を変数に割り当てることができます。次に例を示します。
<cfscript> myvar=JavaCast("null",0); writeOutput(isNULL(myvar)); // returns TRUE </cfscript>
ColdFusion の 2018 リリースは Null 値をサポートします。デフォルトでは、Null サポートはオフになっています。Null サポートを有効にするには、次の手順に従います。
-
すべてのグローバル CF アプリケーション用に ColdFusion Administrator で NULL サポートを有効にします。「サーバー設定/設定」で、チェックボックス「null 値サポートの有効化」を選択します。
変更後、以下のコードは期待どおり機能します。
<cfscript> myvar=NULL; writeOutput(isNull(myvar)); // returns TRUE </cfscript>
-
Memcached はアプリケーションレベルで Null サポートを有効化できます。新しい変数 enableNULLSupport を使用すると、プロジェクトに NULL サポートを追加できます。
例えば、以下のコードは Application.cfc で NULL サポートを追加します。
component{ this.enableNULLSupport=true; }
Null 文字列と null 値は異なります。writeDump または <cfdump> のいずれかを使用して null 値をダンプすると、null 値は [null] と表示されます。次に例を示します。
例えば、enableNULLSupport フラグを true に設定し、null 値と null 文字列を使用して次のようにクエリを作成します。
<cfscript> myquery=querynew("id,name","integer,varchar",[[null,"hello"],[1,"null"],[null,"null"]]); writedump(myquery); writedump(format="text",var=#myquery#); </cfscript>
値をダンプすると、その null 値は [null] と表示されます。
NULL は予約語です。例えば、null = "my new null value" は無効です。
null という名前の変数を作成することはできません。
NULL サポートがオンになっている場合:
- isNull 関数は、NULL 値の有効なインスタンスをチェックします。以前の動作では、未定義の変数を NULL と見なしていました。
- null 値を含む変数の isDefined 関数は、TRUE を 返す ようになりました。以前の動作では false が返されていました。
- <cfoutput> または writeOutput( ) を使用して null 値を出力することはできません。 これは、Web ページを表示するユーザーにとって値は重要ではないためです。
- 配列内の未定義の要素は自動的に NULL に設定されるようになりました。以前のバージョンでは、これらは [未定義の配列要素] として表示されていました。
データ型の保持
ColdFusion はタイプレスで、コード生成時に型情報を評価することや保持することはありません。ColdFusion はランタイムでデータ型の推測を試みます。これによって予期せぬ動作が発生する場合があります。例えば、数値が二重引用符で指定されている場合、ColdFusion では、JSON シリアル化時に文字列を数値に変換しようとします。この試みが成功した場合、指定されたデータ型は、文字列として扱う必要があるかどうかに関係なく、数値として扱われます。
例えば、以前のバージョンの ColdFusion では、列のデータ型が定義されていない場合、CF はすべてを文字列としてシリアル化していました。一方、データ型の保持機能では、データ型が定義されていない場合でもデータをシリアル化しながらデータを推測します。以下のスニペットの場合:
<cfscript> myQuery = queryNew("id,name,ctype","", [ {id=1,name="1",ctype=true}, {id=2,name="Two",ctype=false}, {id=3,name="3",ctype="true"}, {id="4",name="4",ctype="false"} ]); writeOutput ( SerializeJSON(myQuery) ); </cfscript>
新しい出力:
{"COLUMNS":["ID","NAME","CTYPE"],"DATA":[[1,"1",true],[2,"Two",false],[3,"3","true"],["4","4","false"]]}
古い出力:
{"COLUMNS":["ID","NAME","CTYPE"],"DATA":[["1","1","true"],["2","Two","false"],["3","3","true"],["4","4","false"]]}
ColdFusion(2018 リリース)は、コンパイルタイプで変数のデータ型を推測します。このリリースでは、デフォルトでこの機能が有効に設定されています。ただし、この機能と以前の動作のフォールバックを無効化するため、新しいフラグが導入されました。このフラグを jvm.config ファイルに追加できます。
-Dcoldfusion.literal.preservetype="false/true"
フラグを機能させるため、次の項目を確認してください。
- このフラグを有効化/無効化した後に ColdFusion を再起動する
- <cf_install_root>/<instance_name>/wwwroot/WEB-INF/cfclasses からすべてのクラスファイルを削除するか、CFM テンプレートを再コンパイルする
SharePoint、dotnet、Web サービスなどの外部システムとやり取りする際には、既知の問題がいくつかあります。詳細については、既知の問題のドキュメントを参照してください。
データ型の保持では、文字列 "yes" および "no" は、yes または no のままとなります(ブール値の true または false ではない)。
数値
ColdFusion では整数と実数がサポートされています。式には整数と実数を混在させることができます。例えば、1.2 + 3 は 4.2 になります。
整数
ColdFusion では、-2,147,483,648~2,147,483,647(32 ビット符号付き整数)の範囲の整数がサポートされています。この範囲外の値を変数に代入することもできますが、その場合は最初に文字列として保管されます。数式でその文字列を使用すると、その値を保持したまま浮動小数点数値に変換されますが、次の例のように精度が低くなります。
<cfset mybignumtimes10=(mybignum * 10)> <cfoutput>mybignum is: #mybignum#</cfoutput><br> <cfoutput>mybignumtimes10 is: #mybignumtimes10# </cfoutput><br>
この例では次の出力が生成されます。
mybignum is: 12345678901234567890
mybignumtimes10 is: 1.23456789012E+020
実数
実数は小数部がある数値であり、浮動小数点数とも呼ばれます。ColdFusion の実数の範囲は、約 -10300~10300 です。実数の有効数字は最大 12 桁です。整数と同様に、変数に 13 桁以上の値を代入することもできますが、その場合は文字列としてデータが保管されます。その文字列を数式で使用すると、文字列が実数に変換されるので、精度が低くなることがあります。
実数は指数表現で表すことができます。この形式は _x_E_y_ です。x は 1.0 以上 10 未満の正または負の実数で、y は整数です。指数表現の数値は、x の 10y 倍を表します。例えば、4.0E^2^ は 4.0 の 10^2^ 倍、つまり 400 になります。同様に、2.5E^-2^ は 2.5 の 10^-2^ 倍、つまり 0.025 になります。指数表現は、絶対値が非常に大きな数値や小さな数値を表現するときに役立ちます。
BigDecimal 数
ColdFusion には、任意の長さの 10 進数(1234567890987564.234678503059281 など)を表す特殊な BigDecimal データ型は用意されていません。このような数値は文字列として表現されます。ただし、BigDecimal 値を含む数式を受け取って計算し、結果の BigDecimal 値を文字列で返すことができる PrecisionEvaluate 関数があります。詳細については、『CFML リファレンス』の PrecisionEvaluate を参照してください。
文字列
ColdFusion では、テキスト値は文字列で保管されます。文字列を指定するには、文字列を単一引用符(')または二重引用符(")で囲みます。例えば、次の 2 つの文字列は同じです。
"This is a string"
'This is a string'
空の文字列を次の方法で記述できます。
- ""(間に何もない二重引用符のペア)
- ''(間に何もない単一引用符のペア)
文字列のサイズは、ColdFusion サーバーで利用可能なメモリの制限を受けるほかは自由です。ただし、長いテキストの取得(CLOB)に対するデフォルトのサイズ制限は 64K です。ColdFusion Administrator を使用してデータベース文字列転送のサイズ制限を引き上げることは可能ですが、それによってサーバーのパフォーマンスが低下するおそれがあります。この制限を変更するには、データソースの詳細設定ページにある長いテキストの取得を有効にするオプションをオンにします。
引用符と # 記号のエスケープ
単一引用符(')で囲まれている文字列に単一引用符を含めるには、2 つの単一引用符を使用します。これが単一引用符のエスケープです。次の例では、エスケープされた単一引用符を使用しています。
<cfoutput>#mystring#</cfoutput><br>
二重引用符(")で囲まれている文字列に二重引用符を含めるには、2 つの二重引用符を使用します。これが二重引用符のエスケープです。次の例では、エスケープされた二重引用符を使用しています。
<cfoutput>#mystring#</cfoutput><br>
文字列は二重引用符(")または単一引用符(')のどちらでも囲めるので、この 2 つの例では次に示す同じテキストが表示されます。
This is a single-quotation mark: ' This is a double-quotation mark: "
文字列に # 記号を挿入するには、次のように # 記号をエスケープする必要があります。
"This is a number sign ##"
リスト
ColdFusion にはリストを操作する関数はありますが、リストデータ型はありません。ColdFusion のリストは、複数のエントリを区切り文字で区切った文字列として表されます。
リストのデフォルトの区切り文字はカンマ(,)です。他の文字を使用してリスト要素を区切る場合は、リスト関数で区切り文字を指定する必要があります。複数の区切り文字を指定することもできます。例えば、次のように、カンマまたはセミコロンを区切り文字と解釈するように指定できます。
<cfoutput> List length using ; and , as delimiters: #listlen(Mylist, ";,")#<br> List length using only , as a delimiter: #listlen(Mylist)#<br> </cfoutput>
この例を実行すると、次の出力が表示されます。
List length using ; and , as delimiters:5
List length using only , as a delimiter:3
区切り文字は 1 文字であることが必要です。例えば、2 つの連続したハイフンを区切り文字に指定することはできません。
リスト内で 2 つの区切り文字が連続している場合、空の要素は無視されます。例えば、MyList が "1,2,,3,,4,,,5" であり、区切り文字がカンマである場合は、リストの要素数は 5 つと見なされ、リスト関数では "1,2,3,4,5" として処理されます。
ブール値
ブール値は、真または偽を表します。ColdFusion には、これらの値を表す 2 つの特殊な定数 True および False があります。例えば、ブール式 1 IS 1 は True と評価されます。式 "Monkey" CONTAINS "Money" は False と評価されます。
次の例のように、式の中でブール定数を直接使用できます。
<cfset UserHasBeenHere = True>
ブール式では、True、0 以外の数値、および文字列 "Yes"、"1"、"True" はすべて真を表し、False、0、および文字列 "No"、"0"、"False" はすべて偽を表します。
ブール値の評価では大文字と小文字は区別されません。例えば、True、TRUE、および true はすべて同じです。
日付時刻値
ColdFusion では日付時刻値の演算がおこなえます。日付時刻値では、西暦 100 年から 9999 年の日時を識別できます。日付または時刻のみを指定することもできますが、ColdFusion では日付時刻オブジェクトと呼ばれる単一のデータ型を使用して、日付、時刻、および日付時刻値が処理されます。
ColdFusion には、日付時刻値を作成および操作する関数や、値の全部または一部を様々な形式で返す関数が多数用意されています。
次のように定数を使用して、cfset タグで日付時刻値を直接入力できます。
<cfset myDate = "October 30, 2001">
この場合、情報は文字列として保管されます。日付時刻関数を使用した場合は、別の単純データ型である日付時刻オブジェクトとして値が保管されます。日時の指定には、できる限り CreateDate や CreateTime などの日付時刻関数を使用してください。日付時刻関数を使用すれば、無効な形式で日時を指定するおそれがなくなり、日付時刻オブジェクトを直接作成できます。
日時の形式
米国の標準の日付形式を使用して、日付、時刻、または日時を直接入力できます。年の値が 2 桁で指定されている場合、0~29 は 21 世紀の日付として処理されます。30~99 は 20 世紀の日付として処理されます。時刻値は、秒単位まで使用できます。次の表に、有効な日時の形式を示します。
指定データ |
使用形式 |
---|---|
日付 |
October 30, 2003Oct 30, 2003Oct.30, 200310/30/032003-10-3010-30-2003 |
時刻 |
02:34:122:34a2:34am02:34am2am |
日付と時刻 |
有効な日付形式と時刻形式の任意の組み合わせ。例えば、次のような形式が有効です。October 30, 2003 02:34:12Oct 30, 2003 2:34aOct.30, 2001 2:34am10/30/03 02:34am2003-10-30 2am10-30-2003 2am |
ロケール固有の日時
ColdFusion には、現在のロケールに固有の形式で日時(および数値や通貨値)を入出力できる関数が用意されています。ロケールとは、英語(米国)やフランス語(スイス)など、言語および地域を識別する情報のことです。米国標準形式以外の形式で日時を入出力するには、これらの関数を使用します。ロケールを指定するには SetLocale 関数を使用します。その例を次に示します。
<cfoutput>#LSDateFormat(Now(), "ddd, dd mmmm, yyyy")#</cfoutput>
この例では次のような行が出力されます。
mar., 03 juin, 2003
各国語対応関数の詳細については、グローバル化アプリケーションの開発および『CFML リファレンス』を参照してください。
ColdFusion での日時の保管方法
ColdFusion では、日時は日付時刻オブジェクトとして保管および操作されます。日付時刻オブジェクトでは、タイムラインデータが実数として保管されます。この保管方法は処理効率が高く、多くのデータベースシステムで採用されています。日付時刻オブジェクトでは、1 日は 2 つの連続した整数の差になります。日付時刻値の時刻の部分は、実数の小数部分に保管されます。値 0 は 12:00 AM 12/30/1899 を表します。
算術演算を使用して日付時刻値を直接操作することも可能ですが、コードが読みにくくなり、管理も難しくなる場合があります。代わりに、ColdFusion の日付時刻操作関数を使用してください。これらの関数の詳細については、『CFML リファレンス』を参照してください。
バイナリデータ型とバイナリエンコード
バイナリデータ(バイナリオブジェクトとも呼ばれます)は、GIF ファイルや実行可能プログラムファイルの内容などの生データです。通常、バイナリデータを直接使用することはありませんが、cffile タグを使用して変数にバイナリファイルを読み込んで、文字列バイナリエンコードに変換して電子メールでファイルを転送することができます。
文字列バイナリエンコードとは、Web 上で送信可能な文字列形式でバイナリ値を表したもののことです。ColdFusion では、次に示す 3 つのバイナリエンコード形式がサポートされています。
エンコード |
形式 |
---|---|
Base64 |
バイナリデータのすべてのバイトを 6 ビットずつに分割してエンコードします。これによって、バイナリデータおよび ANSI 以外の文字データを破損することなく電子メールで転送できるようになります。Base64 アルゴリズムは、IETF RFC 2045 で定義されています。詳細については、www.ietf.org/rfc/rfc2045.txt を参照してください。 |
Hex |
0~9 および A~F の文字を使用して、各バイトを 2 文字の 16 進数値(3A など)で表します。 |
UU |
NIX UUencode アルゴリズムを使用してデータを変換します。 |
ColdFusion には、文字列データ、バイナリデータ、文字列エンコードされたバイナリデータの間で変換をおこなうための次の関数が用意されています。
関数 |
説明 |
---|---|
エンコードされたバイナリデータを含む文字列をバイナリオブジェクトに変換します。 |
|
バイナリデータをエンコード文字列に変換します。 |
|
指定の文字エンコードを使用して、文字列をバイナリデータに変換します。 |
|
指定の文字エンコードを使用して、バイナリオブジェクトを文字列に変換します。 |
|
文字列およびバイナリデータを、Base64 でエンコードされたデータに変換します。 |
|
Base64 でエンコードされたデータをバイナリデータに変換します。BinaryDecode 関数には、ToBase64 の機能が含まれています。 |
|
ほとんどの単純データ型を文字列データに変換します。数値、日付時刻オブジェクト、およびブール値を変換できます。日付時刻オブジェクトは ODBC タイムスタンプ文字列に変換されます。バイナリデータを新しいアプリケーションの文字列に変換する には、 CharsetEncode 関数を使用することをお勧めします。 |
複合データ型
配列、構造体、およびクエリは、ColdFusion のビルトイン複合データ型です。構造体およびクエリはデータ値ではなくデータのコンテナなので、オブジェクトと呼ばれることがあります。
配列および構造体の使用方法の詳細については、配列および構造体の使用を参照してください。
配列
配列は複数の値を格納する方法の 1 つで、1 次元または 2 次元以上の表形式に似た構造を持ちます。配列を作成するには、関数または代入ステートメントを使用します。
ColdFusion の ArrayNew 関数を使用すると、配列が作成され、初期次元が指定されます。例えば次の行では、空の 2 次元配列が作成されます。
<cfset myarray=ArrayNew(2)>
直接代入を使用すると、配列が作成され、配列要素が挿入されます。例えば次の行では、2 次元配列が作成され、1 行目の 2 列目の値が現在の日付に設定されます。
<cfset myarray[1][2]=Now()>
前の例に示すように、要素を参照するには、次元ごとに 1 つずつ設定される数値インデックスを使用します。
最大 3 つまでの次元を含む配列を直接作成できます。配列のサイズや次元数に制限はありません。4 次元以上の配列を作成するには、配列の配列を作成します。
作成した配列の内容は、関数や直接参照を使用して操作できます。
新しい変数に既存の配列を代入すると、新しい配列が作成され、元の配列の内容が新しい配列にコピーされます。次の例では、元の配列のコピーが作成されます。
<cfset newArray=myArray>
配列の使用方法の詳細については、配列および構造体の使用を参照してください。
構造体
ColdFusion の構造体は、キーと値のペアで構成されます。キーはテキスト文字列で、値にはすべての ColdFusion データ型(構造体を含む)を使用できます。構造体によって、互いに関連する一連の変数を 1 つの名前でグループ化することができます。構造体を作成するには、ColdFusion の StructNew 関数を使用します。例えば次の行では、depts という新しい空の構造体が作成されます。
<cfset depts=StructNew()>
また、構造体のキーに値を代入する方法で新しい構造体を作成することもできます。例えば次の行では、MyStruct という新しい構造体が作成されます。この構造体は MyValue という 1 つのキーを持ち、その値は 2 になります。
<cfset MyStruct.MyValue=2>
ColdFusion 7 以前のバージョンでは、このコードを実行すると、"MyStruct.MyValue" という名前の Variables スコープ変数が作成され、値が 2 に設定されていました。 |
作成した構造体は、関数や直接参照を使用して、キーと値のペアの追加などの操作をおこなえます。
構造体に保存されている要素を参照するには、次のいずれかの方法を使用します。
- StructureName\.KeyName
- StructureName["KeyName"]
その例を次に示します。
depts["John"]="Sales"
新しい変数に既存の構造体を代入しても、新しい構造体は作成されません。この場合、新しい変数は、元の構造体変数と同じデータ(元の構造体変数が保存されているメモリ内の場所)を参照します。つまり、どちらの変数も同じオブジェクトを参照します。
例えば、次の行で新たに作成される myStructure2 という変数は、myStructure 変数と同じ構造体を参照します。
<cfset myStructure2=myStructure>
myStructure2 の内容を変更すると、myStructure の内容も変更されます。構造体の内容をコピーするには、構造体などの複合データ型の内容をコピーする ColdFusion の Duplicate 関数を使用します。
構造体のキー名には、構造体や配列などの複合データオブジェクトの名前を指定することができます。この方法を使用すれば、非常に複雑な構造体を作成できます。
構造体の使用方法の詳細については、配列および構造体の使用を参照してください。
クエリ
クエリオブジェクト(クエリ、クエリ結果、レコードセットとも呼ばれます)は ColdFusion の複合データ型で、名前を持つ列のセットとしてデータを表現します。これは、データベーステーブルの列のセットに似ています。データをクエリオブジェクトとして返すタグの例には、次のものがあります。
- cfquery
- cfdirectory
- cfhttp
- cfldap
- cfpop
- cfprocresult
これらのタグでは、name 属性でクエリオブジェクトの変数名を指定します。また、QueryNew 関数もクエリオブジェクトを作成します。
新しい変数にクエリを代入しても、クエリオブジェクトはコピーされません。この場合は、どちらの名前も同じレコードセットデータを参照します。例えば次の行では、myQuery 変数と同じレコードセットを参照する myQuery2 という変数が新たに作成されます。
<cfset myQuery2 = myQuery>
myQuery のデータを変更すると、myQuery2 にもその変更が反映されます。
クエリ列を参照するには、クエリ名、ピリオド、列名の形式で指定します。例えば、次のようになります。
myQuery.Dept_ID
<cfset myVar = myQuery.Employee[2]>
クエリ内の 1 つの行全体(すべての列)を配列表記法で参照することはできません。例えば、myQuery2 は myQuery クエリオブジェクトの 2 番目の行全体を意味しません。 |
構造体およびクエリの操作
構造体変数とクエリ変数はオブジェクトへの参照です。これらのデータ型には、次のセクションに示すルールが適用されます。
オブジェクトに対する複数の参照
複数の変数が 1 つの構造体またはクエリオブジェクトを参照している場合、オブジェクトへの参照が 1 つでもあれば、そのオブジェクトは存続します。その例を次に示します。
<cfscript> depts = structnew();</cfscript> <cfset newStructure=depts> <cfset depts.John="Sales"> <cfset depts=0> <cfoutput> #newStructure.John#<br> #depts# </cfoutput>
この例を実行すると、次の出力が表示されます。
Sales
0
<cfset depts=0> タグの実行後、depts 変数は構造体を参照しません。この変数は値 0 の単純変数です。ただし、変数 newStructure は引き続き元の構造体オブジェクトを参照します。
オブジェクトへのスコープの割り当て
他のスコープの新しい変数にクエリまたは構造体を代入すると、そのクエリまたは構造体に別のスコープが割り当てられます。例えば次の行では、myquery というローカル変数を使用して、Server.SScopeQuery というサーバー変数を作成します。
<cfset Server.SScopeQuery = myquery>
サーバースコープのクエリ変数をクリアするには、次のように再度クエリオブジェクトを代入します。
<cfset Server.SScopeQuery = 0>
この行を実行すると、元のオブジェクトへの参照はサーバースコープから削除されますが、その他の参照は削除されません。
オブジェクトのコピーと複製
Duplicate 関数を使用すると、構造体またはクエリオブジェクトのコピーを作成できます。コピーを変更しても、元の構造体またはクエリオブジェクトには影響しません。
クエリ列の使用
SELECT FirstName, LastName FROM Employee </cfquery>
クエリ列内の要素を参照するには、配列のインデックスに行番号を指定します。例えば、次のどちらの行でも "ben" という単語が表示されます。
<cfoutput> #myQuery.Firstname[1]# </cfoutput><br> <cfoutput> #myQuery["Firstname"][1]# </cfoutput><br>
配列インデックスを使用せずに、myQuery.Firstname や myQuery"Firstname" のようにクエリ列を参照した場合は、ColdFusion の動作はやや複雑になります。この 2 つの参照形式では、生成される結果が異なります。
myQuery.Firstname という参照は、その列の最初の行に自動変換されます。例えば次の行では、"ben" という単語が出力されます。
<cfoutput>#mycol#</cfoutput>
しかし、次の行ではエラーメッセージが表示されます。
<cfoutput>#mycol[1]#</cfoutput><br>
reference Query["Firstname"] を参照した場合、列の最初の行への自動変換はおこなわれません。例えば次の行では、複合型を単純値に変換できないことを示すエラーメッセージが表示されます。
<cfoutput> #myQuery['Firstname']# </cfoutput><br>
同様に次の行では、列の 2 行目の値である名前 "marjorie" が出力されます。
<cfoutput>#mycol[2]#</cfoutput><br>
ただし、単純値が要求される代入式では、クエリ列が最初の行の値に自動変換されます。例えば次の行では、名前 "ben" が 2 回表示されます。
<cfoutput> #myQuery.Firstname# </cfoutput><br> <cfset myVar= myQuery['Firstname']> <cfoutput> #myVar# </cfoutput><br>
ColdFusion 10 では FUNCTION は ColdFusion データ型
次に例を示します。
public FUNCTIOn FUNCTION a() { return variables.b; } public FUNCTION b() { return "Hal"; } writeoutput(a()); writedump(a().getMetadata()); writedump(a.getMetadata()); writedump(x.getMetadata()); </cfscript>