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

usort和其他类似array_map的功能实际上是上下文感知的;如果您在类中使用非公共回调,它就可以正常工作。这不像是从类外部调用该方法,它只是通过回调间接调用,这是一个受支持的用例。

于 2013-06-18T06:43:22.903 回答
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 回答