如何使用没有对象的数组调用方法?

时间:2017-04-21 10:55:21

标签: php laravel routes slim

如何调用laravel或slim路线中的方法?

我们说我有这样的课程:

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

我想以这种方式打电话

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

我该怎么做?

1 个答案:

答案 0 :(得分:0)

最简单的方法

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

php.net source call_user_func_array()

如果您需要检查方法是否存在,请使用

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

php.net method_exists()

所以你的路由器类可能是下一个:

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
     }
}

如果您想以更聪明的方式进行操作,可以使用Reflection,它将为您提供有关类/方法存在的信息,并提供有关方法参数的信息,以及哪些是必需的或可选的。

UPDATE:此示例要求方法是静态的。对于非静态,你可以在Router类中为类存在添加check(class_exists($ class))并像这样做

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

更新(2)要检查此问题,请转到here并粘贴下一个代码

<?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');