9

これは機能します:

class MyClass {
  private static $data = array( 'banana', 'cherry', 'apple' );

  private static function sort_by_text( $first, $second ) {
    return strcasecmp( $first, $second );
  } 

  public static function sorted_data() {
    usort( self::$data, array( __CLASS__, 'sort_by_text' ) );
    return self::$data;
  }
}

print_r( MyClass::sorted_data() ); 
// Array ( [0] => apple [1] => banana [2] => cherry ) 

ただし、PHP ドキュメントでは常にpublicコールバックが使用されます。

コールバックがprivate十分に文書化されていない可能性があるという事実、またはそれらを作成するprivateと問題が発生する可能性がありますか?

4

3 に答える 3

3

コールバックはコンテキストを認識しており、次のようないくつかのバグがあることがわかります: https://bugs.php.net/bug.php?id=62547

https://bugs.php.net/bug.php?id=63468

しかし、それは修正されているため、サポートされています:)

于 2013-07-20T18:32:22.717 に答える
0

非常に奇妙な。コールバック内でスタック トレースを少し落として遊んでみました。多分それは可視性で緩んでいたのは静的呼び出しだったと思いましたが、しかし:

class MyClass
{
  private static $data = array( 'banana', 'cherry', 'apple' );

  private function sort_by_text( $first, $second ) {
    return strcasecmp( $first, $second );
  }

  public function sorted_data() {
    usort( self::$data, array( __CLASS__, 'sort_by_text' ) );
    return self::$data;
  }
}

class MyClass2
{
  public function __construct()
  {
    $mc = new MyClass();
    print_r($mc->sorted_data());
  }
}

$bleh = new MyClass2();

これも機能し、コール スタックは正常に表示されます。それがあなたのためのPHPです。もちろん、私は混乱全体を忘れて、今はクロージャを使用します。

于 2013-06-18T06:22:50.113 に答える