PHP函数使用外部变量

Rob*_*ght 46 php variables function

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

此函数使用$site_url在此页面顶部定义的变量,但此变量未传递到函数中.

我们如何让它在函数中返回?

Zbi*_*iew 101

添加第二个参数

您需要将其他参数传递给您的函数:

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

在关闭的情况下

如果您更愿意使用闭包,那么您可以将变量导入当前范围(use关键字):

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

global - 一个不好的做法

这篇文章经常被阅读,所以需要澄清一些事情global.使用它被认为是一种不好的做法(参考这个这个).

为了完整起见,这里的解决方案是使用global:

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

它的工作原理是因为你必须告诉解释器你想要使用全局变量,现在它认为它是一个局部变量(在你的函数中).

建议阅读:


Joe*_*een 39

或者,您可以通过使用带use关键字的闭包来从外部范围引入变量.

$myVar = "foo";
$myFunction = function($arg1, $arg2) use ($myVar)
{
 return $arg1 . $myVar . $arg2;
};
Run Code Online (Sandbox Code Playgroud)

  • 这种方式有点困难,例如,如果您有 10 个变量,这种方式将很难。 (2认同)
  • @thiout_p我认为现在回答为时已晚.但也许其他人正在寻求答案:闭包是在变量中定义的,并且没有名称$ myFunction = function myFunction()这是一个错误的语法.并且使用词汇变量是不可能的.正确的语法是**$ myFunction = function()**然后允许词法变量.调用闭包$ myFunction() (2认同)

Val*_*Shi 5

不要忘记,您也可以通过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);
Run Code Online (Sandbox Code Playgroud)

现在$newarray将包含(为简便起见,此处为伪代码) [{times2:2},{times2:4}]

相反,$newarray不带&修饰符使用将使外部$newarray变量在闭包范围内是只读访问。但是$newarray在闭包范围内将是一个完全不同的新创建的变量,仅存在于闭包范围内。

尽管两个变量的名称相同,但它们将是两个不同的变量。在这种情况下,外部$newarray变量将[]在代码完成之后包含在内。