P粉7864325792023-07-24 11:19:34
関数のスコープ内で定義された変数は外部からアクセスできませんが、関数の完了後にその値が使用できなくなるわけではありません。 PHP にはよく知られた static キーワードがあり、オブジェクト指向 PHP で静的メソッドとプロパティを定義するために広く使用されていますが、static キーワードは関数内で静的変数を定義するためにも使用できることを覚えておく必要があります。
静的変数は、関数のスコープ内で定義された通常の変数とは異なり、プログラムの実行がスコープの外に出ても値が失われません。静的変数を使用した次の例を考えてみましょう:
リーリー ###結果:### リーリー$counter 変数の定義に static キーワードを使用しない場合、毎回出力される値は関数に渡される $num パラメーターと同じになります。 static キーワードを使用すると、追加のソリューションを必要とせずに、この単純なカウンターを構築できます。
静的変数は、スカラーまたはスカラー式としてのみ定義できます (PHP 5.6 以降)。他の値を代入すると、少なくともこの記事の執筆時点では必ずエラーが発生します。ただし、次のコード行でこれを行うことができます:
リーリー ###結果:### リーリー静的関数は、同じクラスのオブジェクト メソッド間の「共有」メカニズムです。次の例を見ると簡単に理解できます:
リーリーこれは、同じクラスのオブジェクトに対してのみ機能します。オブジェクトが異なるクラスに属している場合 (たとえ相互に拡張していたとしても)、静的変数は期待どおりに動作します。
静的変数は関数呼び出し間で値を維持する唯一の方法ですか?P粉5746952152023-07-24 09:30:10
変数の「スコープ」、つまり「アクセスできる場所」は限られています。アプリケーションのどこかで $foo = 'bar'; と書いたからといって、アプリケーションの他の場所で $foo を参照できるわけではありません。変数 $foo は特定のスコープ内で有効であり、同じスコープ内のコードによってのみアクセスできます。
非常に簡単: PHP には関数スコープがあります。これは、PHP に存在する唯一のスコープ区切り文字です。関数内の変数は、その関数内でのみ使用できます。関数の外側の変数は関数の外側のどこでも使用できますが、関数の内部では使用できません。これは、PHP にはグローバル スコープという特別なスコープがあることを意味します。関数の外で宣言された変数はグローバル スコープ内にあります。
###例えば:### リーリー $foo は global
スコープ内にあり、$baz は myFunc
内の local スコープ内にあります。 myFunc
内のコードのみが $baz
にアクセスできます。コード outside
myFunc のみが $foo
にアクセスできます。どちらも他方にアクセスできません:
リーリー
スコープと含まれるファイル
リーリー
b.phpリーリー インクルードされたコードに適用されるルールは、他のコードに適用されるルールと同じです。スコープを分離できるのは関数のみです。スコープの観点からは、インクルード ファイルはコードのコピー アンド ペーストと考えることができます。
c.phpリーリー 上記の例では、a.php は myFunc 内に含まれており、a.php 内の変数はローカル関数スコープのみを持ちます。 a.php でグローバルにスコープ設定されているように見えるからといって、実際にスコープが設定されているとは限りません。実際には、そのコードが含まれる/実行されるコンテキストによって異なります。
関数と関数内のクラスに関して、別の状況に対処するにはどうすればよいですか?
(匿名) 関数。
リーリー ###親切### リーリー正しい方法: 変数の受け渡しと変数の受け渡し
リーリー
変数 $bar は、関数パラメーターとしてスコープに明示的に渡されます。この関数を見るだけで、使用する値がどこから来たのかは明らかです。次に、明示的に値を返します。呼び出し元は、関数がどの変数を使用するのか、戻り値がどこから来たのかを確認できます。 リーリー変数のスコープを無名関数に拡張する
リーリーグローバル
前に述べたように、グローバル スコープは特別であり、関数はグローバル スコープから変数を明示的にインポートできます。 リーリー
この関数は、グローバル変数 $foo を使用および変更します。こんなことしないで! (自分が何をしているのか本当に本当に理解している場合を除き、たとえそうであったとしても、それはやめてください!)この関数を呼び出す呼び出し元には、これのみが表示されます:
リーリー
この関数には副作用があるという兆候はありませんが、実際には副作用があります。一部の関数が常に変更され、グローバルな状態に依存している場合、これは簡単に厄介な状況になる可能性があります。関数をステートレスにして、呼び出し回数に関係なく、入力のみで動作し、定義された出力を返すようにします。可能であれば、どのような状況でもグローバル スコープの使用を避けてください。特に、変数をグローバル スコープからローカル スコープに「抽出」しないでください。