是否可以在 PHP 中访问外部局部变量?
Posted
技术标签:
【中文标题】是否可以在 PHP 中访问外部局部变量?【英文标题】:Is it possible to access outer local variable in PHP? 【发布时间】:2011-01-25 10:03:59 【问题描述】:是否可以在 php 子函数中访问外部局部变量?
在下面的代码中,我想访问内部函数栏中的变量$l
。在 bar 中将 $l
声明为 global $l
不起作用。
function foo()
$l = "xyz";
function bar()
echo $l;
bar();
foo();
【问题讨论】:
【参考方案1】:function a()
function val1($arg=null)
static $a;
if ($arg !== null) $a = $arg;
else return $a;
function b()
val1('1234');
echo val1() . '<br>'; // shows: 1234
val1('my custom data');
echo val1() . '<br>'; // shows: my custom data
b();
a();
使用val1('my custom data')
设置我的值
使用val1()
获取我的价值
【讨论】:
【参考方案2】:您可能可以使用闭包来做到这一点......
编辑:花了一些时间来记住语法,但它是这样的:
function foo()
$l = "xyz";
$bar = function () use ($l)
var_dump($l);
;
$bar();
foo();
并且,运行脚本,你会得到:
$ php temp.php
string(3) "xyz"
几个注意事项:
您必须在函数声明后添加;
!
您可以通过引用use
变量,在其名称前加上&
:use (& $l)
更多信息,作为参考,你可以看看手册中的这个页面:Anonymous functions
【讨论】:
为什么要使用嵌套函数? 谁知道^^那不是问题^^;;使用 PHP 5.3 和匿名函数,它对闭包非常有用;;;在 PHP 5.3 之前...我从未在 PHP 中使用过任何嵌套函数 @PascalMARTIN 重要的是,PHP 5.3 之前的嵌套函数不存在。尽管看起来它们是在本地声明的,但它们最终会在全局范围内。我认为现在也是如此,这就是为什么你必须使用匿名函数来实现任何类型的嵌套。 是否有使用这样的所有变量的速记符号? C++ 有一个[&]
表示法(C++ 的[]
等同于PHP 的use()
)但是PHP 中的use(&)
不起作用。在一个有很多局部变量的函数中,最好能写一些简短的东西而不是use($foo, $bar, /*lots of other variables*/)
。【参考方案3】:
您可以通过以下方式读取默认值:
function()
return preg_match(
"yourVar = \d+"
, str_file_get_contents(functionFile)
, arrayToPutFieldsValue
);
如果您同时使用两个功能 - 就像有人在使用勺子,而您想从勺子中取食物 - 您会浪费食物,或者您中的一些人会挨饿。 无论如何-您将不得不以某种困难的方式设置指针。 如果不调用它,就不可能从其他函数或类中获取任何字段。 函数/方法类似于实例——它们需要被调用。
通过使用同步函数访问全局字段来共享公共字段。
【讨论】:
【参考方案4】:您必须使用use
关键字。
$bar = function() use(&$l)
;
$bar();
在非常古老的 PHP 5.2 和更早版本中,这不起作用。你得到的语法不是闭包,而是全局函数的定义。
function foo() function bar()
工作原理与:
function foo() include "file_with_function_bar.php";
如果你执行函数foo
两次,PHP 会抱怨你试图重新定义一个(全局)函数bar
。
【讨论】:
代词太多!第二次执行会死什么?外部变量,还是内部函数中的use
'd 变量?死是什么意思(不是刻薄,只是想知道)。 die 是否意味着该变量无法使用或必须通过其他方式重新建立?我猜它会死掉(在任何意义上),因为它们都指向的共享位置在第一次执行后无法重新指向?如果将变量设为静态然后立即取消设置怎么办?
die 表示die("Fatal Error")
。 PHP
以上是关于是否可以在 PHP 中访问外部局部变量?的主要内容,如果未能解决你的问题,请参考以下文章