【问题标题】:php array_map with static method of objectphp array_map 与对象的静态方法
【发布时间】:2016-05-02 19:33:16
【问题描述】:

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

【问题讨论】:

  • 试试这个:- array_map(array(new Buy, 'pay'), $bill_list);
  • 感谢 Ravi Hirani,因为您的解决方案也有效。
  • PHP5.2 哇,我想所有这些新版本(5.3、5.4、5.5、5.6)可能都有错误
  • 别担心,我用的是5.6,但我只发现了这个关于array_map和方法的问题:)

标签: php array-map


【解决方案1】:

根据documentation

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 如果您要使用这个类,这会使代码混乱(同一代码上的多个引用)。对此的解决方案是创建一个私有函数和 array_map 。 use Other\namespace\CustomClass; class myClass { private function pay($var) { return CostomClass::pay($var); } public function payMe($model_list) { return array_map([$this, 'pay'], $model_list);} }
    【解决方案3】:

    根据docs

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

    类有several ways 来引用它自己的名字,视情况而定。 PHP 5.5+ 中一种干净、高效的方法是self::class (class keyword)。 (注意:如果您使用带有智能感知的代码编辑器,这也是一种特别好的方法,因为编辑器可以正确识别类引用以执行重命名和转到引用等操作。)

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

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

    当您引用其他命名空间类的静态方法时,这也适用,如下所示:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        相关资源
        最近更新 更多