0

変数をグローバルにすることで変数にアクセスできるようにするコードに直面し、それが他の言語のアプローチ/動作と異なるかどうかを考え始めました

<?php
   $a1 = "WILLIAM";
   $a2 = "henry";
   $a3 = "gatES";
   echo $a1 . " " . $a2 . " " . $a3 . "<br />";
   fix_names();
   echo $a1 . " " . $a2 . " " . $a3;
   function fix_names()
   {
      global $a1; $a1 = ucfirst(strtolower($a1));
      global $a2; $a2 = ucfirst(strtolower($a2));
      global $a3; $a3 = ucfirst(strtolower($a3)); 
   }
 ?>

このコードは、関数外で定義された変数にアクセスし、それらを関数内でグローバルにします。これは他の言語ではほとんどありません。たとえば、C のグローバル空間に変数を記述し、それらをグローバルにすると、関数内でそれらにアクセスできます。そのため、まずそれらをグローバルにしてから、どこからでもアクセスできるようにします。上記のコードでは、最初に関数内でそれらにアクセスし (また、引数として渡されない場合に関数内で $a1、$a2、$a3 にアクセスする方法がわかりませんでした)、それらをグローバルにします。これは、PHP プロセッサの動作が異なるためですか。

また、宣言から離れた場所で変数をグローバルにする方法もわかりませんでした。

申し訳ありませんが、これはコードがどこで壊れているのかを正確に尋ねる質問ではないかもしれませんが、なぜコードが特定の方法で記述され、なぜ特定の方法で動作するのかを理解することも重要であると考えています.

(できれば) 明確な言葉で表現する

私が知りたい:関数内で、外側のスコープに既に存在する変数と同じ名前のグローバル変数を作成すると、新しいグローバル変数を作成する代わりに、実際に外側のスコープで変数をグローバル化します(null値を使用) )。そうですか?はいの場合、それは他の言語とは異なりますか? では、そのような明確な行動の背後には何か理由があるのでしょうか?

4

4 に答える 4

1

PHP では、関数には独自のスコープがあるため、変数を関数の外の別の場所で宣言すると、関数内では表示されません。関数内でそれらを使用するには、グローバルに宣言する必要があります。通常、私はレジストリパターンを使用してグローバル スコープを汚染せず、後で使用するすべてのグローバル オブジェクトを保存します。

于 2012-11-25T08:26:50.180 に答える
0

セッションの使用を検討してください。次のように、ファイル file1.php で変数を定義できます。

session_start();    
$_SESSION['a'] = 'William';

次に、次のようにファイル file2.php 内の任意のセッション変数にアクセスできます。

echo $_SESSION['a'];

于 2012-11-25T08:23:00.827 に答える
0

マニュアルによると - http://php.net/manual/en/language.variables.scope.php

変数のスコープは、変数が定義されているコンテキストです。ほとんどの場合、すべての PHP 変数のスコープは 1 つだけです。この単一のスコープは、含まれているファイルと必要なファイルにもまたがっています。
...
ただし、ユーザー定義関数内では、ローカル関数スコープが導入されています。関数内で使用される変数は、デフォルトでローカル関数スコープに制限されます。
...
これは、C 言語のグローバル変数が、ローカル定義によって特にオーバーライドされない限り、関数で自動的に使用できるという点で、C 言語とは少し異なることに気付くかもしれません。これにより、ユーザーが誤ってグローバル変数を変更する可能性があるという問題が発生する可能性があります。PHP では、グローバル変数を関数内で使用する場合、グローバル変数を関数内で宣言する必要があります。

$varこれにより、値を再割り当てすることなく、関数内で同じ名前を使用できます。

$var = 'string';

function test(){
$var = 'new string';
return $var;
}
echo $var;  // echo's - string
test();     // echo's - new string
于 2012-11-25T08:23:55.740 に答える