Php 有没有办法检查方法返回的值的类型?

Php 有没有办法检查方法返回的值的类型?,php,types,gettype,Php,Types,Gettype,我正在写一个方法,它可以从任何类调用任何方法(这个过程是动态的)。 在我的方法中,我需要找出返回值的类型,根据返回值的类型,我将继续下一步 例如: <?php function identifyReturnType($className, $methodName) { $result = $className->$methodName(); //Here I need to find out the $result type } ?>

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

例如:

<?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)方法找出值类型,但是对于这个,我的方法必须返回一个值。我有一些情况(正如我上面解释的)方法只是设置查询对象

请分享你的想法


非常感谢。

如果我正确理解了你的问题,你可以通过传递一个论点作为参考来做到这一点。 如果有什么帮助的话,这是我为你做的


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

您真的需要一个方法来调用其他方法吗?您只需实例化该类并在adition中手动调用它,我建议您这样检查:

if(is_callable($className, $methodName)){
      $className->$methodName();
}

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

我遇到过这个问题,我们有一个用PHP/Mysql编写的大型web应用程序。随着时间的推移,我们在不同的类中拥有数千个函数。现在我们必须开发一个RESTAPI,它将具有不同的功能。主要的问题是我们没有使用不同的函数来返回查询对象,有些函数返回数组,有些函数返回布尔值等等。API应该以JSON的形式返回数据。现在,我们必须选择将现有代码用于不同的功能,或者为API重新编写新代码。第二种选择比较贵,所以我们只能选择第一种。但是我提到的问题远没有结束,这些方法将返回不同的类型,我们是否需要编写更多的代码来检查调用了哪个函数,如果调用了say函数“xyz()”,我们知道它返回的查询对象,那么就通过它循环生成数组,然后是json。不,这是一个坏主意,需要很多努力,最好是编写单独的代码

因此,我们遵循以下方法

我们的api调用看起来像

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

现在我们捕获资源和方法,其中Resource是一个类名,Method是该类的方法名

所以我们知道我们必须调用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()将执行返回的数据转换,如下所示

函数进程\返回\数据($resource、$method、$ret\u val、$resource\u obj=NULL){ 如果(数组\键\存在(“返回”,ResourceMethodMap::$resource\方法\映射[$resource][$method])){ $return\u type=ResourceMethodMap::$resource\u method\u map[$resource][$method][“return”]; $return_array=array(); 开关($return\u类型){ “布尔”大小写: 如果(false==$ret_val){ 返回false; }否则{ if(is_数组($ret_val)){ 返回$ret_val; }elseif(true===$ret_val){ 返回$ret_val; }否则{ $return\u array[]=$ret\u val; return$return\u数组;
} } 打破 案例“数组”: 返回$ret_val; 打破 } ..... } }

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


我已经发布了完整的代码,她看起来

不确定我是否完全理解你的问题,但是-就像在JS中一样-如果没有找到
return
语句,所有函数/方法都会隐式返回。在JS中这是未定义的,在PHP中返回空值。所以只要
返回$result
就行了。另外:
$classname->$methodname()
?我希望您传递的是一个实例,而不是
$className
的字符串,否则您的代码肯定会失败是的,您是对的。谢谢。是的,正确,但是我正在开发的接口需要有一个调用其他类方法的公共方法。通用方法将对象实例和方法名称作为参数。