在JavaScript中,嵌套函数非常有用:闭包、私有方法等等。
嵌套的PHP函数是用来做什么的?有没有人在用它们?有什么用?
这是我做的一个小调查
<?php
function outer( $msg ) {
function inner( $msg ) {
echo 'inner: '.$msg.' ';
}
echo 'outer: '.$msg.' ';
inner( $msg );
}
inner( 'test1' ); // Fatal error: Call to undefined function inner()
outer( 'test2' ); // outer: test2 inner: test2
inner( 'test3' ); // inner: test3
outer( 'test4' ); // Fatal error: Cannot redeclare inner()
发布于 2009-01-06 10:19:22
基本上没有。我一直认为这是解析器的副作用。
Eran Galperin错误地认为这些函数是私有的。在outer()
运行之前,它们是未声明的。它们也不是私人范围的;它们确实污染了全球范围,尽管延迟了。作为回调,外部回调仍然只能调用一次。我仍然看不出将它应用于数组有什么帮助,数组很可能会多次调用别名。
我能找到的唯一“现实世界”的例子是this,它只能运行一次,而且可以重写得更干净。
我能想到的唯一用途是让模块调用[name]_include
方法,该方法在全局空间中设置几个嵌套方法,并结合
if (!function_exists ('somefunc')) {
function somefunc() { }
}
检查。
PHP的OOP显然是一个更好的选择:)
发布于 2011-05-20 18:12:32
如果你使用的是PHP 5.3,你可以通过一个匿名函数获得更多类似JavaScript的行为:
<?php
function outer() {
$inner=function() {
echo "test\n";
};
$inner();
}
outer();
outer();
inner(); //PHP Fatal error: Call to undefined function inner()
$inner(); //PHP Fatal error: Function name must be a string
?>
输出:
test
test
发布于 2009-01-06 12:11:45
在函数中定义的函数我看不出有多大用处,但有条件地定义的函数我可以。例如:
if ($language == 'en') {
function cmp($a, $b) { /* sort by English word order */ }
} else if ($language == 'de') {
function cmp($a, $b) { /* sort by German word order; yes it's different */ }
} // etc
然后你的代码需要做的就是在像usort()调用这样的事情中使用'cmp‘函数,这样你就不会把语言检查弄得到处都是。现在我还没有做到这一点,但我可以看到这样做的理由。
https://stackoverflow.com/questions/415969
复制相似问题