Callbackfunktionen in Klassen

hpvw

Erfahrenes Mitglied
Hallo,
ich habe bei der Suche nach meinem Problem diesen Thread gefunden.
Es geht darum, in einer Klasse eine in der Klasse definierte Callbackfunktion zu verwenden.
Also zum Beispiel
PHP:
usort ($this->arr, array('klassenName','compare'));
Wobei compare($item1,$item2) in derselben Klasse definiert ist, wie der Aufruf über usort().
Das klappt soweit auch schon ganz gut.
Aber: Die Methode wird als Klassenmethode und nicht als Objektmethode angesprochen.
Dass heißt ich habe in der Methode keinen Zugriff auf die Objektattribute/-variablen.
Da ich dieses Konstrukt an vielen Stellen verwenden möchte, habe ich mir erstmal eine Testklasse geschrieben:
PHP:
<?
    echo"<pre>";
    $a = array(1,6,3,9,7,8,2,4,5);
    print_r($a);

    $c = new xyz($a);

    class xyz {
        var $arr = array();
        var $wichtig;
        function xyz($einArray) {
            $wichtig=4;
            $this->arr = $einArray;
            usort ($this->arr, array('xyz','compare'));
            print_r($this->arr);
        }

        function compare($el1,$el2) {
            if ($el1==$this->wichtig && $el1 != $el2) {
                return 1;
            }
            if ($el2==$this->wichtig && $el1 != $el2) {
                return -1;
            }
            if ($el1==$el2) {
            echo "gleich ";
                return 0;
            }
            return (($el1>$el2):-1);
        }

    }
    echo"</pre>";
?>
Mir ist klar, dass das $wichtig recht sinnlos ist, aber an Stelle dessen würde ich z.B. eine komplexe Sortierreihenfolge definieren. Außerdem wäre es in einigen Fällen hilfreich, wenn ich andere Objektmethoden ansprechen kann.

Also lautet meine Frage:
Kann ich die callback-Funktion auch so angeben, dass sie als Objektfunktion verwendet wird und somit Zugriff auf die Objektvariablen hat?
Wenn Ja, wie mach ich dass?
Ich würde gerne ohne Variablen außerhalb der Klasse auskommen, von wegen Kapselung und so.
In Java würde ich ja ein Objekt eines bestimmten Interface übergeben und ihm die jeweiligen Parameter im Konstruktor mit übergeben, aber das geht wohl mit den vordefinierten Funktionen in PHP nicht? Oder kann ich etwa auch Methoden definieren, die mehr als die von der "Callbackverwendenden" Funktion erwarten und diese mit übergeben? Das wäre eine Notlösung.

Ich benutze übrigends noch PHP 4.3.4. Ist das Verhalten in PHP 5 anders? Da soll ja einiges in Bezug auf Klassen passiert sein.

Bitte helft mir, wenn möglich, ohne globale Variablen. Mit denen finde ich auch genügend Auswege.

Dazu noch etwas, das ich noch nicht getestet habe:
Kann in der Klasse auch eine Callbackmethode verwendet werden, die erst in der Subklasse definiert ist, wenn das ganze natürlich als Objekt der Subklasse instanziiert ist?

Gruß hpvw
 
Ich habs!
Abgesehen davon, das meine $wichtig Zuweisung murks ist und der Vergleich mit wichtig den falschen Rückgabewert lieferte geht das mit dem callback so:
PHP:
usort ($this->arr, array($this,"compare"));
oder so:
PHP:
usort ($this->arr, array(&$this,"compare"));
Gruß hpvw
 
Zurück