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

时间:2013-06-18 02:53:35

标签: 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 docs始终使用public个回调。

回调可能只是private没有记录好,或者将它们private制成会导致问题吗?

3 个答案:

答案 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)

usortarray_map等其他函数实际上是上下文感知的;如果你在一个类中使用非公共回调,它就可以正常工作。它不是从类外部调用该方法,而是通过回调间接调用,这是一个受支持的用例。