我有几个 php 文件要包含,它们必须在 protected 范围内充当函数。闭包旨在加载它们(包括)并执行。尽管我在编写这些闭包时遇到了奇怪的影响。所有 php 文件都以 return 语句结尾。
function myClosure () {
include 'file.php';
return $closure; // initialized in file.php
};
$func = myClosure();
echo $func('1'); // echoes '2'
echo $func('4'); // echoes '8'
其中 file.php 类似于
<?php
$closure = function($a) {
$b = $a + $a;
return $b;
};
?>
这行得通。但是,我希望在主代码中而不是在外部文件中包含周围的闭包“function($b)”(没有“return”)。遗憾的是,以下内容无法按预期工作:
function myClosure () {
$closure = function($a) {
include 'file.php';
};
return $closure;
};
$func = myClosure();
echo $func('1'); // echoes null
echo $func('4'); // echoes null
其中 file.php 类似于
<php
$b = $a + $a;
return $b;
?>
将 include 更改为 include_once 对第一个示例给出相同的结果,而不是第二个示例:第二个 echo 无法运行。 我现在怀疑这种行为是一个错误 (php 5) 或由于使用 include 做了一些非法的把戏。也许代码中的“返回”绑定(bind)到它们的上下文? 我将不胜感激一些帮助,无论是关于干净编码的类(class),还是正确的技巧。
最佳答案
由于闭包是有作用域的(正如 OP 已经提到的),您必须在 myClosure
中return
。
你现在有:
function myClosure () {
$closure = function($a) {
include 'file.php';
};
return $closure;
};
只需将其更改为:
function myClosure () {
$closure = function($a) {
return include 'file.php';
};
return $closure;
};
您应该会收到以下内容:
int(2) int(4)
鉴于您维护
$func = myClosure();
var_dump($func('1'));
var_dump($func('2'));
关于php - include inside 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40843931/