Aus einer Diskussion mit einem Kollegen, entstand folgender Proof-of-Konzept:

Die Aufgabe
Um ein möglichst einfaches Logging für Kollegen bieten zu können, kam ich auf die Idee eine Logger Klasse zu bauen, die als Eingabe Parameter NUR die Logging-Nachricht erhält und die Parameter aus der Eltern-Funktion benutzt OHNE diese angeben zu müssen. Bspw:

class Test
{
    protected function doit($in, $out)
    {
        Log::it("Input from doit: in (%d) and out (%d)\n");
    }
}

Die Übergabe der Parameter sollte hier gar nicht mehr nötig sein. Nach einigem Rätseln und Ausprobieren kamen wir schlussendlich auf den richtigen Ansatz mit Hilfe der in PHP 5.4 neu eingeführten Traits. Wie bereits in einem weiteren Artikel erläutert, lassen sich mit Traits Teile einer Klasse auslagern und wiederverwenden.

Dies machen wir uns bei folgendem Code auch zu Nutze. Wir haken uns mit der Traits-Klasse bei jedem Funktionsaufruf der Eltern Klasse ein und speichern alle Funktionsnamen und Parameter in einem assoziativen Array zwischen. Dadurch können wir beim Funktionsaufruf des Loggers auf das assoziative Array mit Hilfe des Elter-Funktionsnamens zugreifen:

/**
 * Used for capturing and storing of arguments
 */
trait Logger
{
    /**
     * Hook into every Class call to capture all arguments
     * @param $name
     * @param $args
     * @return mixed
     */
    public function __call($name, $args)
    {
        Log::set();
        $result = call_user_func_array(array($this, $name), $args);
        return $result;
    }
}

Im gesamten sieht dass dann folgender Maßen aus: .

Die Ausgabe ist dann wie zu erwarten:

Input from doit: in (1) and out (2)