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吗?

我已经读过:在 PHP 5.2 中,方法可以用作array_map函数吗? 但这个问题是关于标准方法的,而不是静态的。

根据文档,

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

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

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

如果要调用另一个类的静态方法,则必须将完整的命名空间放入引号中:

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

仅按use使用类是不够的:

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

根据文档:

静态类方法也可以在不实例化该类的对象的情况下传递,方法是传递类名而不是索引 0 处的对象。

类可以通过多种方式引用其自己的名称,具体取决于具体情况。PHP 5.5+ 中一个干净、高效的方法是 self::class(类关键字)。(注意:如果您使用的是具有智能感知的代码编辑器,这也是一种特别好的方法,因为编辑器可以正确识别类引用以执行重命名和转到引用等操作。

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

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

当您引用其他命名空间类上的静态方法时,这也适用于:

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

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 警告:array_map() 期望参数 1 是有效的回调, 找不到类"某个类"

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

给出的错误是:

PHP 警告:array_map() 期望参数 1 是有效的回调, 未找到类"Foo"

缩短行长和/或重复使用行的一种解决方法:

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

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

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
    }
}