function parts($part) {
$structure = 'http://' . $site_url . 'content/';
echo($tructure . $part . '.php');
}
この関数は、このページの上部で定義された$site_url
変数を使用しますが、この変数は関数に渡されていません。
関数で返すにはどうすればよいですか?
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ローカル変数(関数内)であると考えています。
推奨読書:
あるいは、use
キーワードを指定したクロージャーを使用して、外部スコープから変数を取り込むことができます。
$myVar = "foo";
$myFunction = function($arg1, $arg2) use ($myVar)
{
return $arg1 . $myVar . $arg2;
};
これらの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
変数は[]
この場合、コードが終了した後。
GLOBALキーワードを使用して関数を挿入するだけです。
global $site_url;