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);
我想将 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);