ローカル(関数ローカル、UDF および CFC のみ)
各変数には、どのように設定されるか(コードで設定されるのか ColdFusion で設定されるのか)、コード内のどの部分で使用できるか、どの期間保持されるかという条件が定められており、この条件に基づいて変数を分類できます。これらの条件は、一般に変数のスコープと呼ばれています。よく使用されるスコープとしては、作成する変数のデフォルトスコープである Variables スコープや、HTTP リクエストの存続期間でのみ使用できる Request スコープなどがあります。
ユーザー定義関数もスコープに属しています。詳しくは、UDF の効果的な使用方法の「関数のスコープの指定」を参照してください。
スコープタイプ
ColdFusion スコープの説明を次の表に示します。
スコープ | 説明 |
---|---|
Application | サーバー上に存在する単一の名前付きアプリケーションに関連付けられている変数が含まれます。アプリケーションの名前は、cfapplication タグの name 属性か、Application.cfc の This.name 変数設定で指定されます。詳しくは、永続データとロックの使用を参照してください。 |
Arguments | ユーザー定義関数や ColdFusion コンポーネントメソッドの呼び出しで渡される変数。詳しくは、関数での引数および変数の操作の「Arguments スコープについて」を参照してください。 |
Attributes | カスタムタグページおよびスレッドでのみ使用できます。呼び出したページまたは cfthread タグによってタグの属性に渡された値が含まれます。詳しくは、カスタム CFML タグの作成と使用および ColdFusion スレッドの使用を参照してください。 |
Caller | カスタムタグページでのみ使用できます。カスタムタグの Caller スコープは、呼び出したページの Variables スコープへの参照です。カスタムタグページで Caller スコープを使用して作成または変更したすべての変数は、呼び出したページの Variables スコープでアクセスできます。詳しくは、カスタム CFML タグの作成と使用を参照してください。 |
CGI | ページがリクエストされたコンテキストを識別する環境変数が含まれます。使用可能な変数は、ブラウザーやサーバーソフトウェアによって異なります。よく使用される CGI 変数のリストについては、『CFML リファレンス』の予約語と変数を参照してください。 |
Client | 特定のクライアントに関連付けられている変数が含まれます。Client 変数を使用すれば、ユーザーがアプリケーションで別のページに移動してもそのステートを維持できます。Client 変数は、複数のブラウザーセッションにまたがって使用できます。デフォルトでは、Client 変数はシステムレジストリに保管されますが、Cookie またはデータベースに保管することもできます。Client 変数は複合データ型にすることはできませんが、名前にピリオドを含めることは可能です。詳しくは、永続データとロックの使用を参照してください。 |
Cookie | Cookie としてユーザーのブラウザーに保持されている変数が含まれます。通常、Cookie はブラウザーでファイルに保管されるので、複数のブラウザーセッションおよびアプリケーションにまたがって使用できます。メモリ内のみの Cookie 変数も作成できますが、これはブラウザーを閉じると使用できなくなります。Cookie スコープの変数名にはピリオドを含めることができます。 |
Flash | SWF ムービーと ColdFusion の間で送受信される変数。詳しくは、Flash Remoting サービスの使用を参照してください。 |
Form | フォームの送信によってフォームページからアクションページに渡された変数が含まれます。HTML の form タグを使用する場合は、method="post" を使用する必要があります。詳しくは、データの取得および形式設定の概要を参照してください。 |
Local(関数ローカル) | ユーザー定義関数または ColdFusion コンポーネントメソッドの中で宣言され、該当する関数が実行されている間のみ存在する変数が含まれます。詳細については、ユーザー定義関数の作成と呼び出しを参照してください。 |
Request | 単一の HTTP リクエストの存続期間に利用可能なデータを保持します。Request スコープは、カスタムタグおよびネストカスタムタグを含む、リクエストに応じて処理されるすべてのページで使用可能です。このスコープは、ネストされた(子/親)タグで役立ちます。変数をロックしなくても済むように、Application スコープの代わりに使用することもできます。Request スコープの使用方法については複数の章で説明しています。 |
Server | 現在の ColdFusion サーバーに関連付けられている変数が含まれます。このスコープを使用すれば、複数のアプリケーションにまたがってすべての ColdFusion ページで使用可能な変数を定義できます。詳しくは、「永続データとロックの使用」を参照してください。 |
Session | 特定のクライアントに関連付けられ、クライアントの特定のセッションでのみ維持される変数が含まれます。この変数はサーバーのメモリに保管され、アクティブでない状態が一定時間続いたらタイムアウトするように設定できます。詳しくは、「永続データとロックの使用」を参照してください。 |
This | ColdFusion コンポーネント内、または ColdFusion 構造体などの上位オブジェクトに属する cffunction タグ内でのみ存在します。コンポーネントインスタンスまたは上位オブジェクトが存続している間のみ存在します。This スコープのデータにコンポーネントまたはコンテナの外からアクセスするには、インスタンス名またはオブジェクト名を接頭辞として使用します。 |
ThisTag | カスタムタグページでのみ使用できます。ThisTag スコープはタグの現在の呼び出しに対してアクティブになります。カスタムタグの中にタグがネストされている場合、ネストされたタグを呼び出す前に設定した ThisTag スコープ値は、ネストされたタグから呼び出したタグに戻ったときにすべて保持されます。ThisTag スコープには、タグの実行モードを識別する変数、タグによって生成された内容を含んだ変数、終了タグがあるかどうかを示す変数の 3 つのビルトイン変数が用意されています。ネストされたカスタムタグでは、cfassociate タグを使用することで、呼び出したタグの ThisTag スコープに値を返すことができます。詳しくは、「カスタムタグの実行」の「タグインスタンスデータへのアクセス」を参照してください。 |
Thread |
特定の ColdFusion スレッドで作成および変更される変数が含まれます。ただし、この変数の読み取りは、そのスレッドを作成したページ内のすべてのコードで行えます。各スレッドの Thread スコープは、cfthread スコープのサブスコープです。詳しくは、「ColdFusion スレッドの使用」を参照してください。 |
スレッドローカル | 特定の ColdFusion スレッドでのみ使用可能な変数。詳しくは、「ColdFusion スレッドの使用」を参照してください。 |
URL | 現在のページを呼び出すために使用された URL の中で指定されているパラメーターが含まれます。パラメーターは、「?variablename = value&variablename=value...」という形式で URL に追加されます(例:www.MyCompany.com/inputpage.cfm?productCode=A12CD1510&quantity=3)。 |
同じ名前のパラメーターが URL に複数含まれている場合、ColdFusion URL スコープの変数には、それらすべてのパラメーターをコンマで区切った値が格納されます。例えば、http://localhost/urlparamtest.cfm?param=1¶m=2¶m=3 という URL の場合、ColdFusion ページの URL.param 変数値は 1,2,3 になります。|
変数 |
cfset タグや cfparam タグで作成された任意の型の変数のデフォルトスコープ。Variables スコープの変数は、その変数を作成したページ、またはそのページに含まれている任意のページでのみ使用できます(「Caller スコープ」も参照してください)。CFC で作成された Variables スコープの変数は、コンポーネントとその関数でのみ使用でき、コンポーネントのインスタンス化やコンポーネントの関数の呼び出しを行うページでは使用できません。 |
データの破損を防ぐために、Session、Application、または Server スコープ変数を使用するコードをロックしてください。詳しくは、永続データとロックの使用を参照してください。
スコープでの変数の作成および使用
次の表に、各種のスコープで変数を作成および参照する方法を示します。スコープで変数を作成するメカニズムについて詳しくは、変数の作成を参照してください。
スコープ接頭辞(タイプ) | 参照に接頭辞が必要 | 使用可能な場所 | 作成方法 |
---|---|---|---|
Application | 必要 | 1 つのアプリケーション内の複数のクライアントで、複数のブラウザーセッションにまたがって使用できます。アプリケーション変数を使用するコードは cflock ブロックで囲んでください。 | 変数の作成時に接頭辞 Application を指定します。 |
Arguments | 不要 | ユーザー定義関数の本文内、または ColdFusion コンポーネントメソッド内で使用できます。 | 関数呼び出しで引数を渡す呼び出しページによって作成されます。 |
Attributes | 必要 | カスタムタグページまたはスレッド内で使用できます。 | カスタムタグの場合、カスタムタグの属性でカスタムタグページに値を渡す呼び出しページによって作成されます。スレッドの場合、属性の値を指定する cfthread タグによって作成されます。 |
Caller | カスタムタグページでは必要。呼び出しページでは不要。Variables 接頭辞はオプションです。 | カスタムタグページでは、Caller スコープ接頭辞を付けます。カスタムタグを呼び出すページではローカル変数(Variables スコープ)として使用できます。 | カスタムタグページでは、変数の作成時に接頭辞 Caller を指定します。呼び出し元ページでは、変数の作成時に接頭辞 Variables を指定するかどうかはオプションです。 |
Cffile | 必要 | cffile の呼び出しの後で 使用できます 。 | cffile タグで作成されます。 |
CGI | 不要 | すべてのページで使用できます。値は最新のブラウザーリクエストによって変化します。 | Web サーバーによって作成されます。ブラウザーリクエストから生成されるサーバー環境変数が含まれます。 |
Client | 不要 | 1 つのアプリケーションの 1 つのクライアントで、複数のブラウザーセッションにまたがって使用できます。 | 変数の作成時に接頭辞 Client を指定します。 |
Cookie | 不要 | アプリケーションおよびページの 1 つのクライアントで、複数のブラウザーセッションにまたがって使用できます。 | cfcookie タグで作成されます。変数の作成時に接頭辞 Cookie を指定して、メモリ内のみの Cookie を設定することもできます。 |
Flash | 必要 | Flash クライアントから呼び出される ColdFusion ページまたは ColdFusion コンポーネントで使用できます。 | ColdFusion クライアントアクセスによって作成されます。Flash に値を割り当てます。Flash.result および Flash.pagesize 変数に値を割り当てることができます。 |
Form | 不要 | フォームのアクションページ、およびそのアクションページで呼び出されるカスタムタグで使用できます。アクションページではないフォームページでは使用できません。 | form または cfform タグで作成されます。フォーム送信時に使用される、フォーム本文内のフォームフィールドタグの値(input など)が含まれます。変数名はフォームフィールドの名前です。 |
Local | 不要 | ユーザー定義関数または ColdFusion コンポーネントメソッドの本文内で、関数が実行されている間のみ使用できます。 | 次のいずれかの方法で作成されます。
|
Request | 必要 | 作成したページ、および変数の作成後に現在の HTTP リクエストの間に実行されている任意のページ(カスタムタグやネストされたカスタムタグを含む)で使用できます。 | 変数の作成時に接頭辞 Request を指定します。 |
Server | 必要 | ColdFusion サーバーの任意のページで使用できます。サーバー変数を使用するコードはすべて cflock ブロックで囲んでください。 | 変数の作成時に接頭辞 Server を指定します。 |
Session | 必要 | 1 つのアプリケーションの 1 つのクライアントで、1 つのブラウザーセッションでのみ使用できます。Session スコープ変数を使用するコードは cflock ブロックで囲んでください。 | 変数の作成時に接頭辞 Session を指定します。 |
This | 必要 | ColdFusion コンポーネント内、または cffunction タグを使用して作成され、オブジェクト、構造体またはスコープ内に配置されたユーザー定義関数の本体内で使用できます。その変数を含むページ内では、コンポーネントインスタンスまたはその変数を含むオブジェクトを介して使用できます。 | コンポーネント内または関数内では、変数の作成時に接頭辞 This を指定します。その変数を含むページ内では、変数の作成時にコンポーネントインスタンスまたはその関数を含むオブジェクトを接頭辞として指定します。 |
ThisTag | 必要 | カスタムタグページで使用できます。 | タグで変数を作成するときに接頭辞 ThisTag を指定するか、ネストされたカスタムタグで cfassociate タグを使用して作成します。 |
Thread | スレッド名。変数を作成するスレッド内では、キーワード thread も使用できます。 | リクエスト内の任意のコードで使用できます。 | 変数の作成時に、キーワード thread またはスレッド名を接頭辞として使用します。Thread 変数はスレッド内でのみ作成できます。 |
スレッドローカル(接頭辞なし) | なし | cfthread タグによって作成されたスレッド内で 使用 できます。 | 変数の作成時に接頭辞を使用しないで作成します。変数名の前にキーワード var を使用することもできます。 |
URL | 不要 | URL のターゲットページで使用できます。 | システムによって作成されます。ページにアクセスするときに使用した URL クエリ文字列で渡されたパラメーターが含まれます。 |
Variables(Local) | いいえ |
現在のページで使用できます。フォームページがアクションページでないかぎり、フォームのアクションページからはアクセスできません。カスタムタグを呼び出しているページで使用されているこのスコープの変数は、Caller スコープを使用することでカスタムタグ内からアクセスできます。ただし、ネストされたカスタムタグからはアクセスできません。 | 変数の作成時に接頭辞 Variables を指定するかどうかはオプションです。ColdFusion スレッド内で Variables スコープ変数を作成する場合は、Variables 接頭辞を使用する必要があります。 |
スコープの使用
次のセクションでは、様々なスコープで変数を作成および使用する方法について詳しく説明します。
スコープが指定されていない変数の評価
スコープ接頭辞のない変数名が使用されている場合は、次の順で各スコープが検索されて、所属するスコープが確認されます。
-
-
Arguments
-
スレッドローカル(スレッド内の場合のみ)
-
クエリ(実際にはスコープではありません。クエリループ内の変数)
-
Thread
-
Variables
-
CGI
-
Cffile
-
URL
-
Form
-
Cookie
-
Client
スコープを指定しないと ColdFusion が変数を検索する必要があるので、すべての変数にスコープを指定するとパフォーマンスが向上します。
これら以外のスコープの変数にアクセスするには、変数名にスコープ識別子の接頭辞を付ける必要があります。
スコープと CFX タグ
ColdFusion のスコープは、C++ や Java などのプログラミング言語で記述されたカスタムタグである CFX(ColdFusion Extension)タグには適用されません。CFX タグを呼び出す ColdFusion ページでは、タグ属性を使用してデータを CFX タグに渡す必要があります。CFX タグでは、Java のリクエストおよびレスポンスインターフェイスや C++ のリクエストクラスを使用して、データのやり取りを行う必要があります。
Java の setVariable レスポンスインターフェイスメソッドや、C++ の CCFX::SetVariable メソッドは、呼び出したページの Variables スコープにデータを返します。これは、ColdFusion カスタムタグで Caller スコープ変数を設定するのと同じです。
構造体としてのスコープの使用
ColdFusion では、すべての名前付きスコープを構造体として使用できます。CFScript を使用して定義した UDF(ユーザー定義関数)の関数ローカルスコープは、構造体として使用できません。
名前付きスコープの変数は、構造体の要素として参照できます。この方法を使用するには、構造体名としてスコープ名を指定し、キー名として変数名を指定します。例えば、Request スコープに MyVar という変数がある場合は、次のいずれの方法でも参照できます。
Request["MyVar"] |
同様に、CFML の構造体関数を使用してスコープの内容を操作できます。構造体の使用方法の詳細については、配列および構造体の使用を参照してください。
セッション変数をクリアするときは StructClear(Session) を呼び出さないでください。これを呼び出すと、SessionID、CFID、および CFtoken ビルイトイン変数も削除されるので、セッションが終了してしまいます。StructClear を使用してアプリケーション変数を削除したい場合は、Session スコープの構造体に変数を格納してから、その構造体をクリアします。例えば、すべてのアプリケーション変数を Session.MyVars に格納してから、StructClear(Session.MyVars) を呼び出してそれらの変数をクリアします。