4

次のような非常に単純なコントローラーがあるとします。

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset time = Now()>
    </cffunction>
</cfcomponent>

ストレートな ColdFusion / Railo では、これ内のすべての変数をローカルにスコープすることになります...しかし、私が目にするすべてのホイールの例はそうではありません。

これはおそらく今年の最もばかげた質問賞を受賞することになるでしょうが、これは私が考えていたことでした。

私なら次のように書きます。

<cfcomponent extends="Controller">
    <cffunction name="hello">
        <cfset local.time = Now()>
    </cffunction>
</cfcomponent>

Wheels がおそらくこれを改善するために何かを行うかどうかはわかりません。そのため、私がどこでも行っていることがわかります...それともプログラミングが悪いだけですか?

ありがとう!マイキー

4

2 に答える 2

8

はい、スコープを設定する必要があります

最初の例では、ほとんどの場合variables.time、関数ではなくコンポーネント インスタンスに対してローカルである を設定しています (つまり、スコープを設定していないためlocal.time)。 、およびそのコンポーネントが共有/永続化されている場合、これにより問題が発生する可能性があります (ただし、負荷が高い場合にのみ明らかになる可能性があります)。

変数を意図的に変数スコープに入れる場合は、スコープを明示的に (as としてvariables.time) 設定する必要があります。そうしないと、localmode 設定が有効になっている Railo サーバーで使用すると問題が発生する可能性があります。

cfWheels の設計上の決定(コメント内のリンクを参照) により、技術的には関数/ビューに対してローカルである場合でも、変数をビューに渡すには変数スコープに変数を配置する必要があります。(コントローラーインスタンスは単一のリクエストに対して存続し、これが通常伴う問題を回避します。) 前の段落で述べたように、localmode 設定 (以下で説明) は、すべてのサーバーを制御していない場合でも、明示的にスコープすることが推奨されることを意味します。コードがデプロイされます。

Railo の localmode 設定

Railo (v1 以降) には「localmode」という管理者設定があり、スコープ外の変数をコンポーネントの変数スコープではなく、ローカル スコープに割り当てるかどうかを定義します。明示的な var/local スコープは必要ありません (コードがその設定が有効になっている Railo サーバーでのみ実行されます)。

この設定はデフォルトでオフになっており、ColdFusion にはそのような設定がないため、クロスエンジン互換のコードでは、このような問題を回避するために、常にそのような変数割り当てのスコープを設定する必要があります。

于 2013-01-28T17:45:22.807 に答える
4

場合によります。変数をビューに表示する場合は、変数のスコープを設定します。変数をコントローラーのみに含める場合は、スコープをローカルに設定します。

于 2013-01-28T17:59:31.907 に答える