2013-06-18 5 views
9

Dies funktioniert:Ist die gültige private static Rückrufe in PHP zu verwenden?

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) 

Aber PHP docs immer public Rückrufe verwenden.

Ist die Tatsache, dass Rückrufe gut private nur nicht dokumentiert werden kann, oder macht sie private zu Problemen führen?

+2

Ihr Aufruf der private Methode aus der Klasse, so dass es erlaubt ist, nicht wahr? – DevZer0

+0

@ DevZer0: aber es ist nicht die Methode innerhalb der Klasse nannte es; es ist 'usort'. – Ashe

Antwort

0

Sehr seltsam. Ich habe damit herumgespielt und ein paar Stack-Spuren im Callback hinterlassen. vielleicht dachte, war es die statischen Anrufe, die sie spielen locker mit Sicht wurden im Stich gelassen, aber:

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(); 

Dies funktioniert auch, und der Call-Stack sieht, wie es sollte. Das ist PHP für dich. Natürlich würde ich auf das ganze Durcheinander verzichten und jetzt einfach eine Schließung benutzen.

0

usort und andere Funktionen wie array_map sind eigentlich Kontext bewusst; Wenn Sie innerhalb einer Klasse einen nicht öffentlichen Callback verwenden, funktioniert das problemlos. Es ist nicht so, dass Methode von außerhalb der Klasse aufgerufen wird, es ist nur indirekt über einen Rückruf aufgerufen, und das ist ein Anwendungsfall unterstützt.

+0

Können Sie dieses Verhalten dokumentieren? Ich habe versucht zu suchen, konnte aber keine direkte Beschreibung finden. – sectus

Verwandte Themen