2017-10-29 3 views
0

Ich habe ein paar Probleme beim Aufruf einer Funktion aus einer Zeichenfolge, da es viel komplizierter ist, als nur eine Funktion aufzurufen, ich muss es innerhalb einer anderen Klasse mit einem anderen Namensraum tun.PHP: Aufruf einer anderen Klassenfunktion mit Namespace?

Ich verschicke meine Routen mit dieser Methode, ich benutze TreeRoute-Paket auf GitHub.

public function dispatch() { 
    $uri = substr($_SERVER['REQUEST_URI'], strlen(implode('/', array_slice(explode('/', $_SERVER['SCRIPT_NAME']), 0, -1)) . '/')); 
    $method = $_SERVER['REQUEST_METHOD']; 

    $result = $this->router->dispatch($method, $uri); 

    if (!isset($result['error'])) { 
     $handler = $result['handler']; 
     $params = $result['params']; 

     // TODO: Call the handler here, but how? 
    } 
    else { 
     switch ($result['error']['code']) { 
      case 404 : 
       echo 'Not found handler here'; 
       break; 
      case 405 : 
       echo 'Method not allowed handler here'; 
       $allowedMethods = $result['allowed']; 
       if ($method == 'OPTIONS') { 
        // OPTIONS method handler here 
       } 
       break; 
     } 
    } 
} 

Ich registrieren Routen wie folgt aus:

public function __construct() { 
    $this->router = new \TreeRoute\Router(); 
} 

public function setRoutes() { 
    $this->router->addRoute('GET', '/test', 'App/Controllers/SomeController/test'); 
} 

Was ich will, Anruffunktion 'Test' in der Klasse zu tun ist 'SomeController', jetzt App \ Controllers '‚SomeController einen Namensraum' hat.

Ich schaute in Calluserfunc, aber ich konnte nicht herausfinden, wie es mit meinem String-Format und mit einem Namespace, kann mir jemand helfen?

http://php.net/manual/en/function.call-user-func.php

Antwort

0

Sie können wie folgt call_user_func mit voller Klassenpfad nennen:

call_user_func('App\Controllers\SomeController::test', $arg1, $arg2) 
// or 
call_user_func(['App\Controllers\SomeController', 'test'], $arg1, $arg2) 
// or better 
use App\Controllers\SomeController; 
call_user_func([SomeController::class, 'test'], $arg1, $args2); 
0

Ich glaube, das

if (!isset($result['error'])) { 
    $handler = $result['handler']; 
    $params = $result['params']; 

    $method = substr(strrchr($handler, '/'), 1); // get the method's name from $handler string 
    $class = substr($handler, 0, -strlen($method)-1); // get the class name from $handler string 
    $class = str_replace('/', '\\', $class); // change slashes for anti-slashes 

    // then choose one of those : 

     // if your methods are static : 
     call_user_func_array([$class, $method], $params); 

     // otherwise : 
     (new $class)->{$method}(...$params); // needs php 7 
} 
die Arbeit erledigt
Verwandte Themen