web-dev-qa-db-ja.com

PHP関数は外部から変数を使用

function parts($part) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo($tructure . $part . '.php'); 
}

この関数は、このページの上部で定義された$site_url変数を使用しますが、この変数は関数に渡されていません。

関数で返すにはどうすればよいですか?

41
Robin Knight

2番目のパラメーターを追加

関数に追加のパラメーターを渡す必要があります。

function parts($site_url, $part) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo $structure . $part . '.php'; 
}

クロージャーの場合

クロージャーを使用する場合は、変数を現在のスコープにインポートできます(useキーワード):

$parts = function($part) use ($site_url) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo $structure . $part . '.php'; 
};

global-悪い習慣

この投稿は頻繁に読まれるので、globalについて明確にする必要があります。それを使用することは悪い習慣と見なされます( this および this を参照)。

完全を期すために、ここではglobalを使用したソリューションを示します。

function parts($part) { 
    global $site_url;
    $structure = 'http://' . $site_url . 'content/'; 
    echo($structure . $part . '.php'); 
}

インタープリターにグローバル変数を使用したいことを伝えなければならないので機能しますが、今ではthinksローカル変数(関数内)であると考えています。

推奨読書:

94
Zbigniew

あるいは、useキーワードを指定したクロージャーを使用して、外部スコープから変数を取り込むことができます。

$myVar = "foo";
$myFunction = function($arg1, $arg2) use ($myVar)
{
 return $arg1 . $myVar . $arg2;
};
39
Joe Green

これらのuse変数を参照で渡すこともできることを忘れないでください。

ユースケースは、コールバック内からuse 'd変数を変更する必要がある場合です(たとえば、オブジェクトのソース配列から異なるオブジェクトの新しい配列を生成します)。

$sourcearray = [ (object) ['a' => 1], (object) ['a' => 2]];
$newarray = [];
array_walk($sourcearray, function ($item) use (&$newarray) {
    $newarray[] = (object) ['times2' => $item->a * 2];
});
var_dump($newarray);

$newarrayは、(簡潔にするためにここに擬似コード)[{times2:2},{times2:4}]

それどころか、$newarray なしで &修飾子は外側を$newarray変数は、クロージャスコープ内から読み取り専用でアクセスできます。しかし、$newarrayクロージャスコープ内では、クロージャスコープ内でのみ完全に異なる新しく作成された変数になります。

両方の変数の名前は同じですが、これらは2つの異なる変数になります。外側の$newarray変数は[]この場合、コードが終了した後。

5
bob-12345

GLOBALキーワードを使用して関数を挿入するだけです。

 global $site_url;
0
HBv6