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

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

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

4

6 回答 6

150

添加第二个参数

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

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

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

推荐阅读:

于 2012-06-18T16:11:24.237 回答
46

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

$myVar = "foo";
$myFunction = function($arg1, $arg2) use ($myVar)
{
 return $arg1 . $myVar . $arg2;
};
于 2012-06-18T16:13:15.000 回答
7

不要忘记您也可以通过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变量将[]在代码完成后包含。

于 2018-09-22T17:32:26.557 回答
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 想要实现的目标来说,这可能有点矫枉过正,但它至少是我想为新手提出的一个选项,因为还没有人提到它。

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

于 2020-12-23T22:10:28.103 回答
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从任何地方都可访问,但也将它与范围绑定。而且我故意给了很长的名字,全球的东西都是邪恶的:(

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

于 2021-06-08T11:38:29.633 回答
0

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

 global $site_url;
于 2012-06-18T16:11:38.480 回答