0

我正在编写一个可以从任何类调用任何方法的方法(这个过程是动态的)。在我的方法中,我需要找出返回值是什么类型,根据返回值的类型,我将继续下一步。

例如:

<?php
  function identifyReturnType($className, $methodName) {
       $result = $className->$methodName();
       //Here I need to find out the $result type
  }
?>

我有许多类,其中方法返回 bool、string、int 等,并且有一些方法不返回任何内容,这些方法设置对象中的值或对象具有资源指针:

<?php
    function getCategories() {
        $this->query("SELECT * FROM categories");
    }

    function getItems() {
        $this->query("SELECT * FROM items");
        $this->getValues();
    }
?>

PHP gettype($var) 方法找出什么是值类型,但为此,我的方法必须返回一个值。我有一些案例(如上所述),其中方法只是设置查询对象。

请分享你的想法。

太感谢了。

4

4 回答 4

0

如果我理解你的问题是正确的,你可以通过传入一个参数作为参考来做到这一点。这是我为您制作的示例,如果有帮助的话。

http://php.net/manual/en/language.references.pass.php

另一种解决方案是返回一个包含返回值和类型的数组。

于 2013-07-04T14:04:32.743 回答
0

你真的需要一个方法来调用其他方法吗?您可以实例化该类并手动调用它

于 2013-07-04T14:05:47.930 回答
0

这实际上取决于您的实施。有些遵循架构,其中每个函数都将数据作为数组返回。即使对于查询返回的数据也以小块数组的形式返回。这完全取决于您如何优化或编写脚本。假设您正在获取所有联系人,并且如果您在 DB 中有 10,000 个联系人并且您将所有联系人都返回到一个数组中,那是个坏主意。如果您希望函数将数据作为数组返回,请使用分页并以少量返回。

我遇到过这个问题,我们有一个用 PHP/Mysql 编写的大型 Web 应用程序。随着时间的推移,我们在不同的类中有数千个函数。现在我们必须开发一个具有不同功能的 REST API。主要问题是我们没有使用不同的函数来返回查询对象,一些返回数组,一些返回布尔值等等。API 应以 JSON 格式返回数据。现在我们必须选择使用现有代码来实现不同的功能,或者为 API 重新编写新代码。第二选择更贵,所以我们只剩下第一选择。但是我提到的问题远不止这些方法将返回不同的类型,我们是否真的需要编写更多代码来检查调用了哪个函数以及是否说函数“xyz()” 被调用,我们知道它返回的查询对象然后循环遍历它生成数组,然后生成 json。不,那不是一个坏主意,需要付出很多努力,然后最好编写单独的代码。

所以我们遵循以下方法。

我们的 api 调用看起来像

www.api.oursite.com/api/v1/Resource/Method?param=....

现在我们捕获资源和方法,其中资源是类名,方法是该类的方法名。

所以我们知道我们必须调用 Resource->Method()

现在我们有一个名为 ResourceMethodMap.class.php 的类,它包含数组

static $resource_method_map = array(
    "Users"=>array(
"getUserInfo"=> // gets the user info 
array(
"return"=>"array",
"accessToken"=>true
)
),
....
...

)

所以 API 请求处理代码会做类似的事情

public function call_method($resource = "",$method=""){
    if($resource == "") $resource = $this->get_resource();
if($method == "") $method = $this->get_api_method();
if (class_exists($resource)) { 
  $resource_obj = new $resource();
      // Parse the method params as array
  $param_array = $this->parse_method_params($resource,$method);
      if(false !== $param_array){
  $result = call_user_func_array(array($resource_obj, $method), $param_array);
}else{
  $result = $resource_obj->$method() ;
}   
return   $this->process_return_data($resource,$method,$result,$resource_obj);                   
}else{
$this->setMessage("Invalid Resource");
return false ;
}

}

这里函数 process_return_data() 会将返回的数据转换为

函数 process_return_data($resource,$method,$ret_val,$resource_obj = NULL){ if(array_key_exists("return",ResourceMethodMap::$resource_method_map[$resource][$method])){ $return_type = ResourceMethodMap::$resource_method_map [$resource][$method]["return"]; $return_array= 数组();switch($return_type){ case 'boolean': if(false === $ret_val){ return false ; }else{ if(is_array($ret_val)){ return $ret_val ; }elseif(true === $ret_val){ return $ret_val ; }else{ $return_array[] = $ret_val ; 返回 $return_array ;
} } 休息; 案例“数组”:返回 $ret_val ;休息; } ..... } }

所以是的,这完全取决于开发人员他们希望如何返回他们的数据。上面的例子只是我们实现的一种实时场景。

我已经发布了她的完整代码http://codepad.org/MPY1gVed看看

于 2013-12-26T10:42:47.360 回答
0

另外,我建议像这样检查:

if(is_callable($className, $methodName)){
      $className->$methodName();
}
于 2013-07-05T07:21:44.587 回答