PHP 函数使用外部变量


PHP function use variable from outside

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

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

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

添加第二个参数

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

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的事情。使用它被认为是一种不好的做法(请参阅此和此)。

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

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

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

推荐阅读:

  • PHP 中的变量作用域
  • 匿名函数

或者,您可以通过使用带有 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在闭包范围内将是一个完全不同的新创建的变量,只存在于闭包范围内。

尽管两个变量

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

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

我想这取决于你的架构和你可能需要考虑的任何其他东西,但你也可以采用面向对象的方法并使用一个类。

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特别想要实现的目标来说,这可能是矫枉过正的,但这至少是我想为新人提出的一个选择,因为还没有人提到它。

这里的优势是可扩展性和遏制性。例如,如果您发现自己需要为了一个常见任务而将相同的变量作为对多个函数的引用传递,这可能是一个类有序的指标。

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

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

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

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

您可以添加以下结构

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

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

 global $site_url;