php array_map使用静态对象方法

时间:2016-01-26 09:19:38

标签: php array-map

我想用静态方法使用 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?但这个问题是关于标准方法,而不是静态。

4 个答案:

答案 0 :(得分:24)

根据documentation

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

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

答案 1 :(得分:2)

让我扩展@ 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

答案 2 :(得分:0)

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为有效的回调, 找不到“ SomeClass”类

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

答案 3 :(得分:0)

根据docs

也可以通过传递静态类方法而无需通过传递类名而不是索引0的对象来实例化该类的对象。

根据情况,有several ways个类可以引用其自己的名称。在PHP 5.5+中,一种干净有效的方法是self::classclass keyword)。 (注意:如果您将代码编辑器与intellisense一起使用,这也是一种特别好的方法,因为该编辑器随后可以正确地标识类引用,以进行重命名和定位引用等操作。)

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

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

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

use Some\Cool\OtherClass;

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