我想将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
}
}