是否无法在静态函数中调用/声明函数?

时间:2017-08-22 12:09:14

标签: php

那是我的班级:

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

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

           array_walk_recursive($data, 'clean');
 ...

我正在通过以下方式致电课程:

MyClass::test("$data")

我收到的错误消息:

  

错误:[2] array_walk_recursive()期望参数2是有效的回调,函数' clean'未找到或无效的功能名称

3 个答案:

答案 0 :(得分:2)

您应该将您的函数分配给变量,然后在对array_walk_recursive的调用中引用该函数:

class MyClass
{
    public static function test($data)
    {
        $clean = function ($item, $key) {
           // do something
        };

       array_walk_recursive($data, $clean);
    }
}

$data = [1, 2, [3, 4, 5]];
MyClass::test($data);

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

array_walk_recursive($data, function ($item, $key) {
    // ...
});

您目前获得的内容将正常运行,但您的clean功能不会局限于本地范围。 PHP允许您在任何级别定义函数,但它们将在全局范围内(或在您当前正在使用的任何命名空间的范围内)创建。

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

答案 1 :(得分:0)

在课堂上,你有静态方法,你可以使用' 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();

答案 2 :(得分:-1)

<?

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

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