2017-04-21 3 views
0

Wie kann ich eine Methode wie in Laravel oder schlanke Route aufrufen?So rufen Sie eine Methode mit Array ohne Objekt auf?

Lassen Sie uns sagen, ich habe Klasse wie folgt:

namespace App; 
class App 
{ 
    public function getApp(){ 
     return "App"; 
    } 
} 

und ich möchte auf diese Weise Wie

$route->get('App\App','getApp'); 

anrufen kann ich dies tun?

+0

Warum willst du es so machen? –

Antwort

0

Der einfachste Weg

call_user_func_array(['App\App', 'getApp'], $params_if_needed); 

php.net source call_user_func_array()

Wenn Sie überprüfen müssen, wenn Methode vorhanden ist, verwenden nur

method_exists('SomeClass','someMethod') // returns boolean 

php.net method_exists()

So können Sie Router Klasse weiter:

class Router 
{ 
    public function get($class, $method) 
    { 
      if($_SERVER['REQUEST_METHOD'] !== 'GET') { 
       throw new SomeCustomNotFoundException(); 
      } 

      if (!method_exists($class, $method)) { 
       throw new SomeCustomNoMethodFoundException(); 
      } 

      call_user_func_array([$class, $method], $_REQUEST); //with params 
      // OR 
      call_user_func([$class, $method]); //without params, not sure 
    } 
} 

Wenn Sie in der mehr kluge Weise tun möchten, können Sie Reflection verwenden, wird es Ihnen Informationen über Klasse/Methode Existenz geben und auch Informationen über Verfahren params geben, und welche von ihnen sind erforderlich oder optional.

UPDATE: In diesem Beispiel werden Methoden als statisch erwartet. Für nicht-statische können Sie überprüfen, in der Router-Klasse hinzufügen, für die Klasse Existenz (class_exists ($ class)) und do smth wie dies

$obj = new $class(); 
$obj->$method(); //For methods without params 

UPDATE (2) dies zu überprüfen, geht here und Paste nächster Code

<?php 

class Router 
{ 
    public function get($class, $method) 
    { 
      if($_SERVER['REQUEST_METHOD'] !== 'GET') { 
       throw new SomeCustomNotFoundException(); 
      } 

      if(!class_exists($class)) { 
       throw new ClassNotFoundException(); 
      } 

      if (!method_exists($class, $method)) { 
       throw new SomeCustomNoMethodFoundException(); 
      } 

      call_user_func_array([$class, $method], $_REQUEST); //with params 
      // OR 
     //call_user_func([$class, $method]); //without params, not sure 
    } 
} 

class Test 
{ 
    public static function hello() 
    { 
     die("Hello World"); 
    } 
} 

$route = new Router(); 
$route->get('Test', 'hello'); 
Verwandte Themen