当我尝试这样做时:
function a()
{
function b() { }
}
a();
a();
我得到Cannot redeclare b...
当我尝试这样做时:
function a()
{
if(!isset(b))
function b() { }
}
a();
a();
我得到unexpected ), expected ...
我怎么能声明函数为本地和被遗忘时,a
返回?我需要这个函数把它传递给array_filter
。
"局部函数"的概念也被称为"函数中的函数"或"嵌套函数"…线索在这个页面,匿名函数,由@ceejayoz和@Nexerus引用,但是,让我们解释一下!
- 在PHP中只存在函数声明的全局作用域;
- 唯一的替代是使用另一种函数,匿名函数。
举例说明:
-
function a(){ function b() {} return b(); }
中的b()
函数也是全局的,因此声明的效果与function a(){ return b(); } function b() {}
相同。 -
要声明像"函数b()在a()的作用域内"这样的东西,唯一的选择不是使用
b()
,而是使用引用$b()
。语法类似于function a(){ $b = function() { }; return $b(); }
PS:在PHP中不可能声明一个"静态引用",匿名函数永远不会是static。
参见:
- var functionName = function() {} vs function functionName() {} (ans) 什么是PHP嵌套函数?
您可以在array_filter
调用中使用匿名函数
PHP 7.2或以上版本警告!
create_function
在php 7.2中已弃用,并在php 8+中删除。
此函数已在PHP 7.2.0中被弃用,并在PHP 8.0.0中被删除。强烈建议不要依赖此函数。
替换为:https://www.php.net/manual/en/functions.anonymous.php
原始答:
你可以试试PHP的create_function
函数。http://php.net/create_function
$myfunc = create_function(..., ...);
array_filter(..., $myfunc(...));
unset($myfunc);
这个方法不需要PHP 5.3+
可以在PHP中定义局部函数,但只能声明一次。这可以通过定义和比较静态变量来实现。
检查以下示例:
<?php
function a()
{
static $init = true;
if ($init) {
function b() { }
$init = FALSE;
}
}
a();
a();
或者通过检查函数是否已经存在:
<?php
function a()
{
if (!function_exists('b')) {
function b() { }
}
}
a();
a();