在PHP中使用私有静态回调是否有效?



这行得通:

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。当然,我现在不需要这么麻烦,只需要使用闭包。

usortarray_map等其他函数实际上是上下文感知的;如果在类中使用非公共回调,它会工作得很好。它不像是从类外部调用的方法,它只是通过回调间接调用,这是一个支持的用例。

最新更新