这有效:
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 docs始终使用public
个回调。
回调可能只是private
没有记录好,或者将它们private
制成会导致问题吗?
答案 0 :(得分:3)
回调是上下文感知的,您可以看到它周围存在一些错误,例如: https://bugs.php.net/bug.php?id=62547
https://bugs.php.net/bug.php?id=63468
但它正在修复,因此得到支持:)
答案 1 :(得分: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。当然,我放弃了整个混乱,现在只使用一个闭包。
答案 2 :(得分:0)
usort
和array_map
等其他函数实际上是上下文感知的;如果你在一个类中使用非公共回调,它就可以正常工作。它不是从类外部调用该方法,而是通过回调间接调用,这是一个受支持的用例。