如何在PHP中定义局部函数


How to define local functions in PHP?

当我尝试这样做时:

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引用,但是,让我们解释一下!

  1. 在PHP中只存在函数声明的全局作用域;
  2. 唯一的替代是使用另一种函数,匿名函数。

举例说明:

  1. function a(){ function b() {} return b(); }中的b()函数也是全局的,因此声明的效果与function a(){ return b(); } function b() {}相同。

  2. 要声明像"函数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();