web-dev-qa-db-ja.com

オブジェクトの静的メソッドを持つ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を使用する方法はありますか?

私はすでに読みました: PHP 5.2? でarray_map関数としてメソッドを使用できますか?.

18
Samuel Dauzon

documentation に従って、

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

試みには()メソッド名文字列内、これは間違っている

36
Mark Baker

@ 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
8
olidem

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'が見つかりません

行の長さを短くするか、再利用するための1つの回避策:

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