2016-06-14 10 views
0

Ich bin dabei, ein MVC-Framework neu zu schreiben, das ich geschrieben habe. Ich habe beschlossen, explizites Routing zusätzlich zum Standard-Routing-Verhalten meines Frameworks zu integrieren, aber ich habe ein Problem.Wie Klasseninstanzbereich an Callback-Funktion übergeben?

Dies ist die Methode, die eine Route ausgeführt (es ist ein Verfahren auf der App Klasse) ...

private function executeRoute($requestType, $route, $callback) 
    { 
     if (is_array($requestType)) 
     { 
     if (in_array($_SERVER['REQUEST_METHOD'], $requestType)) 
      $matched = true; 
     else 
      $matched = false; 
     } 
     else if (($_SERVER['REQUEST_METHOD'] == $requestType) || ($requestType == "ALL")) 
     $matched = true; 
     else 
     $matched = false; 
     if ($matched) 
     { 
     $uriVariables = $this->getUriVariables($route, implode("/", $this->uri)); 
     if (is_array($uriVariables)) 
      call_user_func_array($callback, $uriVariables); 
     } 
    } 

Hier ist, wo ich Probleme ...

mit bin
$app = new App; 

    $app->all("/", function() { 
    $controller = $app->setController("test"); 
    if ($controller) 
    { 
     $app->controller->index(); 
    } 
    else 
     echo $controller; 
    }); 

Diese isn funktioniert nicht, da die Callback-Funktion einen eigenen Bereich hat, der nicht die Instanz meiner Klasse App enthält. Gibt es eine Möglichkeit, einen Verweis auf die Callback-Funktion zu übergeben, ohne dass der Entwickler seine App Instanz explizit als Abhängigkeit/Argument zur Callback-Funktion hinzufügt?

Ich möchte $app innerhalb des Rückrufs verwenden oder $this zu einem Verweis auf die App Instanz neu schreiben.

Antwort

2

Sie müssen use verwenden, um Variablen aus dem übergeordneten Bereich zu erben.

$app = new App; 

$app->all("/", function() use ($app) { 
    $controller = $app->setController("test"); 
    if ($controller) 
    { 
     $app->controller->index(); 
    } 
    else 
     echo $controller; 
}); 
+0

Gibt es eine Möglichkeit, dies implizit zu tun, ohne dies an die Funktion zu übergeben? Danke für die Antwort übrigens. – Allenph

+0

Soweit ich weiß, ist dies die einzige Möglichkeit, auf den übergeordneten Bereich in PHP zuzugreifen. –