dann versuche ich mal meine allgemeinen Techniken auch in der PHP-Sprache:
nach hier PHP: usort - Manual
die comparator-Funktion in richtigen Anführungszeichen übergeben, aber kann egal sein,
gibt es stattdessen Fehlermeldung wenn ‘hddgdgdf’ eingetragen?
kannst du in der comparatorPerson-Methode mit echo etwas ausgeben, kommt die Methode zahlreich dran?
Wert von strcmp() und auch beide Parameter ruhig dabei ausgeben, immer Wert 0 oder anderes?
ist die Liste zufällig schon sortiert? dann kein Wunder wenn es gleich bleibt ;), aufsteigend oder absteigend verwechseln man schnell
und noch am ehesten, wenn auch nicht wahrscheinlich:
kann es sein dass $personenObjektListe->getPersonenListe() jedesmal ein neues Array erzeugt?
3x in deinem Code ist für sich schon zuviel, selbst ohne Probleme,
kannst du das nur 1x abfragen und in eine kurze Variable pa ablegen (oder $pa, immer dieser Geldbezug…) ?
wenn gar nichts bisher geht, dann kopiere das Beispiel mit TestObj aus dem Link, geht hoffentlich?
wandle die Klasse nach und nach in eine zu deiner ähnlichen um, etwa Klassenname PersonTest, gleiche Attribute und Methoden
(nach und nach, nicht alles auf einmal ändern)
geht es mit direkt erzeugten Objekten?
geht es auch mit deiner Person-Klasse mit direkt befüllten Array?
dann wieder verstärkt auf personenObjektListe->getPersonenListe() schauen…
Der Punkt ist, Funktionskonstrukte können nicht direkt als Referenz übergeben werden. Nur Variablen und usort erwartet für den ersten Parameter eine Referenz. Und wenn du schon englische Ausgaben machst, dann programmier auf sauber englisch. Und wenn schon Objekte, kann auch die Compare-Funktion in der Klasse sein.
<?php
final class People
{
private $people = array();
public function all()
{
return $this->people;
}
public function compare(/* ... */)
{
// ...
}
// ...
}
$people = new People();
// wird halt irgendwie befüllt..
$sortedPeople = $people->all();
usort($sortedPeople, array($people, 'compare'));
foreach ($sortedPeople as $val) {
// whatever
}
heißt das, dass usort intern nicht das übergebende Array-Objekt ändert (Java-Denkweise, vielleicht gar nicht möglich),
sondern ein neues Array zusammenbaut und dem Parameter zuweist?
na, wenn nicht hier dann in anderen Methoden,
wäre es dann nicht essentiel hilfreich zu prüfen, ob eine Referenz oder etwas anders übergeben wird?
Wie usort das array manipuliert, keine Ahnung. Aber es wird halt das übergebene per Referenz zurückgegeben. Nicht via return. Wenn natürlich die Funktion auch eine Referenz zurückgibt, geht es natürlich direkter. Die Frage ist, ob man das will, dass der interne Instanzmember von außen so manipuliert werden kann.
*** Edit ***
Achja, das mit den Fatal Error wäre nett. Habe aber selbst gerade gestern eine Library überarbeitet die reset direkt auf Funktionen aufgerufen hat und das einzige was kam, war ein Notice. Und die sind standardmäßig nicht aktiv, wenn man nicht von selbst das error_reporting auf E_ALL hochdreht.