我有下面的代码,在函数“test”按要求工作的情况下,而当“foreach”的工作被分解到函数中时,当变量超出范围时,事情就会停止工作。有没有办法将它们维护在范围内,同时能够将代码分解为函数?
function test()
{
$a = 'aaa';
$b = 'bbb';
$c = 'ccc';
$A = ['a', 'b', 'c'];
foreach ($A as $_a) $r[$_a] = $$_a;
var_dump($r);
}
// running test() gives ['a'=>'aaa','b'=>'bbb','c'=>'ccc']
function KV($A)
{
foreach ($A as $_a) $r[$_a] = $$_a;
return $r;
}
function test1()
{
$a = 'aaa';
$b = 'bbb';
$c = 'ccc';
$A = ['a', 'b', 'c'];
$r = KV($A);
var_dump($r);
}
运行 test1() 给出
['a'=>NULL,'b'=>NULL,'c'=>NULL]
注释:循环变量已命名为“_a”,以避免与可能的变量名称发生名称冲突。
为了了解需求的用处,我在下面写了一个使用该函数的真实案例。
$r = [
'series' => $series,
'aa' => $aa,
'issueDate' => $issueDate,
'invoiceType' => $invoiceType,
'vatPaymentSuspension' => $vatPaymentSuspension,
'currency' => $currency,
'exchangeRate' => $exchangeRate,
];
if ($correlatedInvoices) {
$r['correlatedInvoices'] = $correlatedInvoices;
}
if ($selfPricing) {
$r['selfPricing'] = $selfPricing;
}
似乎实际上没有办法做到这一点,所以我提出了我设计的解决方案来绕过缺乏选项的情况来执行相同的操作。 顺便说一句,我建议语言设计者提供一个像 $LOCALS 这样的二维数组,我们可以在其中访问之前调用的值,如
$LOCALS[-1]['nameOfLocalInCallingFunction']
或类似的东西 ($LOCALS[1])
下面的解决方案似乎是获得手头范围的最佳选择:
<?php
function test(){
$a='aaa';$b='bbb';$c='ccc';
$A=['a','b','c'];
foreach($A as $_a) $r[$_a]=$$_a;
var_dump($r);
}
// running test() gives ['a'=>'aaa','b'=>'bbb','c'=>'ccc']
function KV($A){
foreach($A as $a)
$r[]="'$a'=>\$$a";
return '[' . implode(',',$r) . '];' ;
}
function test1(){
$a='aaa';$b='bbb';$c='ccc';
$A=['a','b','c'];
eval('$r='.KV($A));
var_dump($r);
}
// running test1() now gives ['a'=>'aaa','b'=>'bbb','c'=>'ccc']