我想用静态方法使用 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?但这个问题是关于标准方法,而不是静态。
答案 0 :(得分:24)
答案 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::class
(class keyword)。 (注意:如果您将代码编辑器与intellisense一起使用,这也是一种特别好的方法,因为该编辑器随后可以正确地标识类引用,以进行重命名和定位引用等操作。)
因此,您可以执行以下操作:
array_map([self::class, 'pay'], $bill_list);
当您在其他命名空间类上引用静态方法时,这也适用:
use Some\Cool\OtherClass;
array_map([OtherClass::class, 'pay'], $bill_list);