php array_map 对象的静态方法

php array_map with static method of object

我想将 array_map 与静态方法一起使用,但我失败了。 这是我的代码:

Class Buy {

    public function payAllBills() {
        $bill_list = OtherClass::getBillList();
        return array_map(array(self, 'pay'), $bill_list); // Issue line
    }

    private static function pay($bill) {
        // Some stuff
        return true;
    }

}

PHP 给我错误:

Use of undefined constant self - assumed 'self'

我也试过了:

return array_map('self::makeBean()', $model_list);

但是不行。

你知道如何使用静态方法 array_map 吗?

我已经读过:Can a method be used as a array_map function in PHP 5.2?但是这个问题是关于标准方法的,而不是静态的。

根据 documentation

return array_map('self::pay', $model_list);

请注意,您尝试在方法名称字符串中包含 (),这是错误的

让我扩展@mark-baker 的回答:

如果你想调用另一个class的静态方法,你必须将完整的命名空间放在引号中:

return array_map('Other\namespace\CustomClass::pay', $model_list);

使用 class 每个 use 是不够的:

// this is not enough:
// use Other\namespace\CustomClass;
return array_map('CustomClass::pay', $model_list); //does not work

PHP 5.6 - 7.3:

array_map('self::pay'], $bill_list); # works
array_map(['self', 'pay'], $bill_list); # works

array_map('\Some\Name\Space\SomeClass::method',$array); # works
array_map(['\Some\Name\Space\SomeClass','method'],$array); # works

use \Some\Name\Space\SomeClass;  # alias to local namespace fails:
array_map('SomeClass::method',$array); # fails
array_map(['SomeClass','method'],$array); # fails

给出的错误是:

PHP Warning: array_map() expects parameter 1 to be a valid callback, class 'SomeClass' not found

use SomeLongClassName as Foo; # alias within namespace fails:
array_map("Foo::method",$array); # fails
array_map(['Foo','method'],$array); # fails

给出的错误是:

PHP Warning: array_map() expects parameter 1 to be a valid callback, class 'Foo' not found

一种缩短行长度的解决方法and/or重新使用它:

const SomeClass = '\Some\Name\Space\SomeClass';
array_map([SomeClass,'method'],$array); # works

或者如果您在 class 中多次使用外部静态方法:

class MyClass{
    # in PHP 7.1+ you can make this private:
    const SCMethod = '\Some\Name\Space\SomeClass::method';

    public function myMethod($array){
        return array_map(self::SCMethod, $array); # works
    }
}

根据 docs:

Static class methods can also be passed without instantiating an object of that class by passing the class name instead of an object at index 0.

several ways for a class to reference it's own name, depending on the situation. One clean, efficient way in PHP 5.5+ is self::class (class keyword)。 (注意:如果您使用带有智能感知的代码编辑器,这也是一个特别好的方法,因为编辑器可以正确识别 class 引用以执行重命名和 go-to-references 等操作。)

因此,您可以执行以下操作:

array_map([self::class, 'pay'], $bill_list);

当您在其他一些命名空间 class 上引用静态方法时,这也适用,如下所示:

use Some\Cool\OtherClass;

array_map([OtherClass::class, 'pay'], $bill_list);