这行得通:
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
会导致问题?
回调是上下文感知的,你可以看到它周围有一些bug,比如:https://bugs.php.net/bug.php?id=62547
https://bugs.php.net/bug.php?id=63468但它正在修复,因此支持:)
很奇怪。我对它做了一些改动,在回调中删除了堆栈跟踪。我想可能是静态调用让它在可见性上松懈了,但是:
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。当然,我现在不需要这么麻烦,只需要使用闭包。
usort
和array_map
等其他函数实际上是上下文感知的;如果在类中使用非公共回调,它会工作得很好。它不像是从类外部调用的方法,它只是通过回调间接调用,这是一个支持的用例。