PHP 函数使用外部变量

问题描述 投票:0回答:7
function parts($part) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo($tructure . $part . '.php'); 
}

这个函数使用了一个在本页顶部定义的变量

$site_url
,但是这个变量没有被传递到函数中。

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

php function variables
7个回答
169
投票

添加第二个参数

你需要传递额外的参数给你的函数:

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
。使用它被认为是一种不好的做法(参考thisthis)。

为了完整起见,这里是使用

global
的解决方案:

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

它之所以有效,是因为你必须告诉解释器你想使用一个全局变量,现在它认为它是一个局部变量(在你的函数中)。

推荐阅读:


48
投票

或者,您可以使用带有

use
关键字的闭包从外部范围引入变量。

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

12
投票

不要忘记您也可以通过引用传递这些

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
将是一个完全不同的新创建的变量,只存在于闭包范围内。

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

$newarray
变量将包含
[]

注意:不要忘记,您最好在常用的 Web 项目中使用 immutable 数据结构(与上述不同)。这将占用例的 99%。所以上面的方法,使用可变性,是很少的“低级”用例。


2
投票

我想这取决于您的体系结构以及您可能需要考虑的任何其他因素,但您也可以采用面向对象的方法并使用 class.

class ClassName {

    private $site_url;

    function __construct( $url ) {
        $this->site_url = $url;
    }

    public function parts( string $part ) {
        echo 'http://' . $this->site_url . 'content/' . $part . '.php';
    }

    # You could build a bunch of other things here
    # too and still have access to $this->site_url.
}

然后您可以在任何地方创建和使用该对象。

$obj = new ClassName($site_url);
$obj->parts('part_argument');

这对于 OP 特别想要实现的目标来说可能有点矫枉过正,但这至少是我想为新来者提出的一个选择,因为还没有人提到它。

这里的优势是可扩展性和包容性。例如,如果您发现自己需要将相同的变量作为对多个函数的引用的传递来完成一项常见任务,这可能表明一个类是有序的。


0
投票

我有类似的问题。答案:使用global。还有其他选择。 但是如果你需要使用外部范围的命名函数,我有:

global $myNamedFunctionWidelyAccessibleCallableWithScope;
$myNamedFunctionWidelyAccessibleCallableWithScope =
    function ($argument) use ($part, $orWhatYouWant) {
        echo($argument . $part . '.php');
        // do something here
        return $orWhatYouWant;
    };
function myNamedFunctionWidelyAccessible(string $argument)
{
    global $myNamedFunctionWidelyAccessibleCallableWithScope;
    return $myNamedFunctionWidelyAccessibleCallableWithScope($argument);
}

它对于使函数 myNamedFunctionWidelyAccessible 可以从任何地方访问是有用的,但也将它与范围绑定。我故意给了很长的名字,全球事物都是邪恶的:(

这里是文档和一个很好的例子


0
投票

您可以添加以下结构

$var1=5;
function sample() use ($var1){echo $var1;}

-1
投票

只需使用 GLOBAL 关键字放入函数中:

 global $site_url;
© www.soinside.com 2019 - 2024. All rights reserved.