• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Problem mit Closure

Tronjer

Senior HTML'ler
PHP:
class Debugger
{
    protected $dateFormat;
    
    public function __construct($dateFormat)
    {
        $this->dateFormat = $dateFormat;
    }
    function createDebugger($type) {
        return function ($message) use ($type) {
            $dateTime = date($this->dateFormat, time());
            echo "[{$type}] [{$dateTime}] {$message}\n";
        };
    }
}

$debugger = new Debugger('Y-m-d H:i:s');
$infoDebugger = $debugger->createDebugger("INFO");
$infoDebugger("Das ist ein Info-Eintrag");

Der Aufruf dieses Codes erzeugt einen Fatal Error: Using $this when not in object context in
PHP:
$dateTime = date($this->dateFormat, time());

Wo liegt hier der Fehler? Ich instanziiere eine Klasse, rufe darauf die Methode createDebugger() auf und müsste innerhalb der Closure mit $this Zugriff auf die Attribute des Objekts haben.
 
In deinem Fall muss es so sein:


PHP:
<?php 
class Debugger
{
    protected $dateFormat;
    
    public function __construct($dateFormat)
    {
        $this->dateFormat = $dateFormat;
    }
    function createDebugger($type) {
        $dateFormat = $this->dateFormat;
        return function ($message) use ($type, $dateFormat) {
            $dateTime = date($dateFormat, time());
            echo "[{$type}] [{$dateTime}] {$message}\n";
        };
    }
}

$debugger = new Debugger('Y-m-d H:i:s');
$infoDebugger = $debugger->createDebugger("INFO");
$infoDebugger("Das ist ein Info-Eintrag");
 
Ok, das funktioniert. Erklärt für mich allerdings noch nicht, warum so etwas wie $this-dateFormat zwar in den Methoden einer Klasse aber nicht in der Closure verwendet werden kann.

Sind Closures denn so gekapselt, dass kein Zugriff auf die innerhalb der Klasse gebildeten Objekte besteht und alle Variablen grundsätzlich per use durchgereicht werden müssen?

Der gepostete Code war eine Übungsaufgabe. Mir geht es hier um den Lerneffekt.
 
Zurück
Oben