Php 不能在静态函数中调用/声明函数吗?

Php 不能在静态函数中调用/声明函数吗?,php,Php,那是我的班级: class MyClass { public static function test($data) { function clean($item, $key) { ...do something } array_walk_recursive($data, 'clean'); ... 我打电话给全班同学: MyClass::test("$data") 我收到的错误消息

那是我的班级:

class MyClass
{
    public static function test($data)
    {

       function clean($item, $key)
       {         ...do something
           }

           array_walk_recursive($data, 'clean');
 ...
我打电话给全班同学:

MyClass::test("$data")
我收到的错误消息是:

错误:[2]数组\u walk\u recursive要求参数2为有效回调、未找到函数“clean”或函数名无效


您应该将函数分配给一个变量,然后在对数组\u walk\u recursive的调用中引用该变量:

或者,如果不需要在其他地方重复使用回调,则直接传递回调:

array_walk_recursive($data, function ($item, $key) {
    // ...
});
您当前获得的功能将正常工作,但您的clean函数不会局限于本地范围。PHP允许您在任何级别定义函数,但它们将在全局范围或当前使用的任何命名空间范围内创建


在第一次调用MyClass::test之后,您的代码将允许调用清除静态类上下文之外的内容,这可能是不可取的。

在类中,因为您有静态方法,所以可以使用“self”调用函数

class MyClass_test
{
    public static function test_this($data)
    {
       array_walk_recursive($data,array("self","clean"));
     }
     public static function clean($item, $key)
     {        //Do something
     }

}
$data = array(1,2,3);
MyClass_test::test_this();

这是你需要的解决方案。如果您不想使用回调。

1。这并不像你想象的那样有效,你不应该这样做。2.您是否处于命名空间中?只需将声明移出静态函数,它仍将可见。@splaten在这种情况下,您在函数内部还是外部声明函数没有任何区别。您不需要这样做,但这肯定比OP做的更好。好的。我直接通过回调。但是如何仅在当前作用域中声明函数?如何在作用域外调用函数?我试过干净,干净。两者都不起作用。调用未定义的函数…PHP不支持在本地范围内声明函数。无论何时编写函数xxx{…},您都是在全局范围内声明函数,或者在您操作的任何命名空间的范围内声明函数。您的原始代码没有提到名称空间,但是如果您的类位于名称空间Foo内,那么您可以将函数调用为Foo\clean$item,$key@iainn thx它工作得很好。但是我不知道为什么我必须把函数赋值给一个变量?有什么解释吗?
class MyClass_test
{
    public static function test_this($data)
    {
       array_walk_recursive($data,array("self","clean"));
     }
     public static function clean($item, $key)
     {        //Do something
     }

}
$data = array(1,2,3);
MyClass_test::test_this();
<?

class MyClass { 

    static function clean($item, $key) {
            echo $item.PHP_EOL;
    }

    public static function test($data)
    {        
        array_walk_recursive( $data, 'MyClass::clean'); 
    }
}

$a = [1,2,3];

MyClass::test($a);

?>

php select.php 
1
2
3