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
的字符串,否则您的代码肯定会失败是的,您是对的。谢谢。是的,正确,但是我正在开发的接口需要有一个调用其他类方法的公共方法。通用方法将对象实例和方法名称作为参数。