PHP函数使用外部变量

时间:2012-06-18 16:09:56

标签: php function variables

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

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

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

6 个答案:

答案 0 :(得分:91)

添加第二个参数

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

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'); 
}

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

建议阅读:

答案 1 :(得分:39)

或者,您可以使用带有use关键字的闭包从外部范围中引入变量。

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

答案 2 :(得分:2)

不要忘记,您也可以通过引用传递这些use变量。

用例是当您需要从回调内部更改use'd变量时(例如,从某个对象的源数组中产生新的不同对象数组)。

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

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

答案 3 :(得分:1)

我想这取决于您的架构以及您可能需要考虑的任何其他事项,但您也可以采用面向对象的方法并使用 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 特别想要实现的目标来说可能有点矫枉过正,但这至少是我想为新手提供的一个选项,因为还没有人提到它。

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

答案 4 :(得分:1)

我有类似的问题。答案:使用全局。还有其他选择。 但是,如果您需要使用外部作用域的命名函数,这里是我所拥有的:

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 可从任何地方访问,但也将其与作用域绑定。而且我故意给了很长的名字,全局的东西都是邪恶的:(

这里是documentation with a good example

答案 5 :(得分:0)

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

 global $site_url;