2014-12-18 4 views
0

(나는 여러 인스턴스를 가질 필요가 없기 때문에) 싱글 톤으로 사용되는 "정적 클래스"와이를 확장하는 데 사용되는 다른 클래스 같은 방식으로.PHP 정적 클래스의 부모 클래스에있는 Usort 정적 클래스

처리 중 일부 지점에서 확장 클래스는 parent :: doThis()를 호출하고 doThis는 궁극적으로 usort를 수행합니다.

각각의 정렬을 다르게 처리하기 때문에 호출 순서는 호출 클래스에 있어야합니다. "class :: method()"와 같은 것이 usort 콜백의 문자열이 될 수 있습니까? 그렇다면 부모 클래스가 그것을 호출하는 클래스를 인수로 전달하지 않고 부모 클래스가 그것을 호출하는 방법을 알기 쉽게 지정할 수 있습니다. 호출 클래스의 usort 콜백? 결정하는 부모의 어떤 수단을 기반으로

class parentClass { 
    protected static function doThis($data) { 
    // do stuff, then 
    usort($data, "myCallingClass::cmp()" 
    } 
} 

무엇 myCallingClass가, 또는 그것이 내가 당신이 Late Static Bindings이 작업을 수행 할 수 있어야한다고 생각

class parentClass { 
    protected static function doThis($data, $calling_class) { 
    // do stuff, then 
    usort($data, $calling_class . "::cmp()" 
    } 
} 
+0

두 솔루션이 작동합니다,하지만 u는 다른 콜백을 둘 필요가 있다면, 그래서 유와 콜백 – UnskilledFreak

+0

사이에 뭔가 잘못 항상 되었습니까 전환 할 수 있습니다 # 2를 사용 질문? 나는 그것이 downvoted 것을 안다. –

답변

3

할 필요가 않습니다

usort($data, function($a, $b) {return(static::cmp($a, $b));}); 
+0

이런 식으로 좋겠지 만 PHP에서는 아직 구현되지 않았습니다. – georg

+0

@georg 구현되지 않은 것은 무엇입니까? 후기 정적 바인딩은 PHP (5.3 년 ~ 5 년) 이후로 사용되었습니다. – AlpineCoder

+0

코드를 사용해 보셨습니까? – georg

2

각 클래스에 static function name() { return "myCallingClass"; }을 추가 할 수 있습니다. 그런 다음 당신이 필요

usort($data, static::name() . "::cmp()"); 

static 변경 용은 그 방법이 하나가있는 경우 클래스를 상속에서 호출됩니다 보장 호출하는 것입니다.

2

간단한 해결책은 get_called_class와 함께 잘 알려진 콜백 이름을 사용하는 것입니다

class Numbers 
{ 
    static function sort() { 
     $things = [1,2,3,4,5]; 
     usort($things, [get_called_class(), 'cmp']); 
     print join(' ', $things); 
    } 
} 

class Mod2 extends Numbers { 
    static function cmp($a, $b) { 
     return $a % 2 - $b % 2; 
    } 
} 

Mod2::sort(); // 4 2 5 3 1 

A는 그리 간단하지,하지만 정확한 솔루션이 모든 "정적 클래스"와 "싱글을 잊지하는 것입니다 "물건과 사용은 그들이 사용하기위한 것입니다 방법 객체 :

class Numbers 
{ 
    function sort() { 
     $things = [1,2,3,4,5]; 
     usort($things, [$this, 'cmp']); 
     print join(' ', $things); 
    } 
} 

class Mod2 extends Numbers { 
    function cmp($a, $b) { 
     return $a % 2 - $b % 2; 
    } 
} 

(new Mod2)->sort(); // 4 2 5 3 1 
관련 문제