私のコード:
$myText = "";
function addText($textString){
$myText .= $textString;
}
addText("Hello there...");
echo $myText;
期待される出力:
こんにちは...
$myText
空でした。
なぜこれが起こるのですか?
私のコード:
$myText = "";
function addText($textString){
$myText .= $textString;
}
addText("Hello there...");
echo $myText;
期待される出力:
こんにちは...
$myText
空でした。
なぜこれが起こるのですか?
グローバル変数 $myText を使用するように関数に指示する必要があります
function addText($textString){
global $myText;
$myText .= $textString;
}
ただし、関数内でグローバル変数を使用することは有害と見なされます。
これを試して:
$myText = "";
function addText($textString){
global $myText;
$myText .= $textString;
}
addText("Hello there...");
echo $myText;
あなたがしなければならない理由は、bc$myText
が関数のスコープにないからです。
スコープに入れるには、使用するグローバル変数を関数に指示する必要があります
ここにデモがあります: http://codepad.org/DeH89No6
現在の例を機能させる方法を説明するだけでなく、実際にお手伝いさせてください。基本的に、カスタム関数の外部で定義された変数は内部では表示されません。あなたの例では、関数スコープの外で宣言されているため、関数は $myText が何であるかわかりません。変数を関数に渡すには、変数をパラメーターとして追加する必要があります。変数は、関数を定義してから呼び出すときに渡す変数ですfunction addText($param1, $param2)
。
他の人が述べたように、キーワードを使用して関数が特定の変数を参照できるようにすることができますがglobal
、実際にはデータベース接続などの抽象的なものにのみこれを使用し、構成したい実際のデータではなく、関数内ですべてを実行します。
PHPの理解を深める一助になれば幸いです。
これは、変数スコープと呼ばれるものです。ここで説明されているように、変数が既知のコードの部分です。短い話をさらに短くすると、関数内の $myText は外部のものと名前を共有していますが、それらは完全に異なります。それらは異なるボックスで、1 つは自分の部屋 (関数内の 1 つ) で、もう 1 つは外部 (もう 1 つ) です。同じラベルが付けられていても、一方に入れたものはもう一方の中に表示されません. やりたいことをやるには2つの方法があります。
最初の簡単だが悪い方法: 前に投稿したように、グローバル キーワードを関数内のキーワードに追加して、すべてのボックスを含む 1 つの大きなボックスを作成します。これは、「このラベルの付いた箱を探して、これを使用してください」と言っているようなものです。ただし、覚えておいてください: グローバル変数は悪いものです。
ダークサイドが魅力的かもしれませんが、別の方法があります... あなたの箱を持って...
$myText = "";
function addText($existingText, $textToAdd) {
return $existingText . $textToAdd;
}
addText($myText, "Look, it's there!");
echo $myText;
ソースがあなたと共にありますように。
文字列を返す関数を取得する
function addText($textString){
$myText .= $textString;
return $myText
}
$myText = addText('文字列');
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;
}
}
変数のスコープに関係しています。基本的に、関数の$myText
外側は関数の内側とaddText
は異なります。$myText
これを使用して、関数内の変数を関数外の変数に設定できます。
function addText($textString){
global $myText;
$myText .= $textString;
}
ちょうど別のテイク...
$myText = "The quick brown fox";
echo addText(" jumped over the lazy dog.", $myText);
function addText($addString,$toVar) {
$newString = $toVar.$addString;
return $newString;
}
関数のスコープ (変数の有効期間) は、関数の外には達しません。この単純なタスクに対して、関数を作成する理由がわかりません。ただし、変数に同じ名前を付けても、関数に渡された変数は関数スコープにコピーされ、同じにはなりません。関数の外で何かを取得できるようにするには、return ステートメントを使用する必要があります。
(C++ では、関数へのパラメーターが参照として渡されていれば、このアプローチは可能でした)
ただし、問題の可能な解決策は次のとおりです。
function addText($text){
return $text;
}
$myText .= addText("Hello there");
echo $myText;
しかし、繰り返しになりますが、この単純なタスクのために関数を作成する理由がわかりません