2013-06-18 2 views
9

이 작동 :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으로 만들면 문제가 발생할 수 있습니까?

+2

당신이 전화 때문에 고정되고 내부 클래스에서 개인 메서드 그래서 그것의 허용되지 않습니다? – DevZer0

+0

@ DevZer0 :하지만 클래스를 호출하는 메서드가 아닙니다. 그것은''usort''입니다. – Ashe

답변

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입니다. 물론, 나는 모든 혼란을 피하고 그냥 지금 폐쇄를 사용합니다.

0

usortarray_map과 같은 다른 기능은 실제로 컨텍스트를 인식합니다. 클래스 내에서 비 ​​public 콜백을 사용하면 잘 작동합니다. 클래스 외부에서 메서드가 호출되는 것과 달리 콜백을 통해 간접적으로 호출되므로 지원되는 사용 사례입니다.

+0

이 문제에 대한 문서를 보여줄 수 있습니까? 나는 검색하려했지만 직접 설명을 찾을 수 없었다. – sectus

관련 문제