2

私のコード:

$myText = "";

function addText($textString){
   $myText .= $textString;
}

addText("Hello there...");

echo $myText;

期待される出力:

こんにちは...

$myText空でした。

なぜこれが起こるのですか?

4

9 に答える 9

5

グローバル変数 $myText を使用するように関数に指示する必要があります

function addText($textString){
   global $myText;
   $myText .= $textString;
}

ただし、関数内でグローバル変数を使用することは有害と見なされます。

于 2011-03-30T21:07:53.047 に答える
3

これを試して:

$myText = "";

function addText($textString){
   global $myText;
   $myText .= $textString;
}

addText("Hello there...");

echo $myText;

あなたがしなければならない理由は、bc$myTextが関数のスコープにないからです。
スコープに入れるには、使用するグローバル変数を関数に指示する必要があります

ここにデモがあります: http://codepad.org/DeH89No6

于 2011-03-30T21:07:11.167 に答える
3

現在の例を機能させる方法を説明するだけでなく、実際にお手伝いさせてください。基本的に、カスタム関数の外部で定義された変数は内部では表示されません。あなたの例では、関数スコープの外で宣言されているため、関数は $myText が何であるかわかりません。変数を関数に渡すには、変数をパラメーターとして追加する必要があります。変数は、関数を定義してから呼び出すときに渡す変数ですfunction addText($param1, $param2)

他の人が述べたように、キーワードを使用して関数が特定の変数を参照できるようにすることができますがglobal、実際にはデータベース接続などの抽象的なものにのみこれを使用し、構成したい実際のデータではなく、関数内ですべてを実行します。

PHPの理解を深める一助になれば幸いです。

于 2011-03-30T21:11:57.550 に答える
2

これは、変数スコープと呼ばれるものです。ここで説明されているように、変数が既知のコードの部分です。短い話をさらに短くすると、関数内の $myText は外部のものと名前を共有していますが、それらは完全に異なります。それらは異なるボックスで、1 つは自分の部屋 (関数内の 1 つ) で、もう 1 つは外部 (もう 1 つ) です。同じラベルが付けられていても、一方に入れたものはもう一方の中に表示されません. やりたいことをやるには2つの方法があります。

最初の簡単だが悪い方法: 前に投稿したように、グローバル キーワードを関数内のキーワードに追加して、すべてのボックスを含む 1 つの大きなボックスを作成します。これは、「このラベルの付いた箱を探して、これを使用してください」と言っているようなものです。ただし、覚えておいてください: グローバル変数は悪いものです。

ダークサイドが魅力的かもしれませんが、別の方法があります... あなたの箱を持って...

$myText = "";

function addText($existingText, $textToAdd) {
    return $existingText . $textToAdd;
}

addText($myText, "Look, it's there!");

echo $myText;

ソースがあなたと共にありますように。

于 2011-03-30T21:22:52.067 に答える
0

文字列を返す関数を取得する

function addText($textString){
   $myText .= $textString;
   return $myText
}

$myText = addText('文字列');

于 2011-03-30T21:08:25.403 に答える
0

PHP 変数のスコープは、使い慣れた他の言語のスコープとは少し異なります。$myText関数内で変数を表示するには、次のキーワードaddTextを使用する必要があります。global

$myText = "";

function addText($textString){
   global $myText; //added this line
   $myText .= $textString;
}

addText("Hello there...");

echo $myText;

または、コードがクラス内にある場合は、キーワード を使用して $myText をクラス レベルの変数にすることができます$this

class SomeClass{
   function __init__(){
      $this->myText = "";
   }
   function addText($textString){
      $this->myText .= $textString;
   }

   function someFunction(){
      $this->addText("Hello there...");
   echo $this->myText;
   }
}
于 2011-03-30T21:09:44.280 に答える
0

変数のスコープに関係しています。基本的に、関数の$myText 外側は関数の内側とaddTextは異なります。$myTextこれを使用して、関数内の変数を関数外の変数に設定できます。

function addText($textString){
    global $myText;
    $myText .= $textString;
}
于 2011-03-30T21:11:28.620 に答える
0

ちょうど別のテイク...

$myText = "The quick brown fox";

echo addText(" jumped over the lazy dog.", $myText);

function addText($addString,$toVar) {
    $newString = $toVar.$addString;
    return $newString;
} 
于 2011-03-30T21:16:50.957 に答える
0

関数のスコープ (変数の有効期間) は、関数の外には達しません。この単純なタスクに対して、関数を作成する理由がわかりません。ただし、変数に同じ名前を付けても、関数に渡された変数は関数スコープにコピーされ、同じにはなりません。関数の外で何かを取得できるようにするには、return ステートメントを使用する必要があります。

(C++ では、関数へのパラメーターが参照として渡されていれば、このアプローチは可能でした)

ただし、問題の可能な解決策は次のとおりです。

function addText($text){
    return $text;
}
$myText .= addText("Hello there");
echo $myText;

しかし、繰り返しになりますが、この単純なタスクのために関数を作成する理由がわかりません

于 2011-03-30T21:16:50.983 に答える