我正在编写一个方法,可以从任何类调用任何方法(此过程是动态的)。 在我的方法中,我需要找出返回值的类型,根据返回的值类型,我将继续下一步。
例如:
<?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)方法找出值类型是什么,但为此,我的方法必须返回一个值。我有案例(如上所述),其中方法只是设置查询对象。
请分享您的想法。
非常感谢你。
答案 0 :(得分:0)
如果我理解你的问题,你可以通过传递参数作为参考来做到这一点。 如果有任何帮助,这是我为你制作的example。
http://php.net/manual/en/language.references.pass.php
另一个解决方案是返回一个包含返回值和类型的数组。
答案 1 :(得分:0)
你真的需要一种方法来调用其他方法吗?您可以实例化该类并手动调用它
答案 2 :(得分:0)
另外我建议像这样检查:
if(is_callable($className, $methodName)){
$className->$methodName();
}
答案 3 :(得分:0)
这实际上取决于您的实施。一些遵循架构,其中每个函数将数据作为数组返回。即使对于查询,返回的数据也会以小块的数组返回。这完全取决于您如何优化或编写脚本。假设您正在获取所有联系人,如果您在数据库中说过10,000个联系人,并且您将所有联系人返回到数组中,这是一个坏主意。如果您希望函数将数据作为数组返回,请使用分页并返回少量数据。
我遇到过这个问题,我们有一个用PHP / Mysql编写的大型Web应用程序。随着时间的推移,我们在不同的类中拥有数千个函数。现在我们必须开发一个具有不同功能的REST API。主要问题是我们没有使用不同的函数来返回查询对象,一些返回数组,一些返回布尔值等等。 API应该将数据作为JSON返回。现在我们必须选择使用现有代码来实现不同功能,或者为API重新编写新代码。第二选择更贵,所以我们留下了第一选择。但是我提到的问题远不是方法将返回不同的类型,我们是否需要真正编写更多的代码来检查调用哪个函数以及是否调用了say函数“xyz()”并且我们知道它返回的查询对象然后循环它生成数组然后json。这不是一个坏主意,需要付出很多努力,然后更好地编写单独的代码。
所以我们遵循以下方法。
我们的api电话看起来像
www.api.oursite.com/api/v1/Resource/Method?param = ....
现在我们捕获资源和方法,其中资源是类名,Method是该类的方法名。
所以我们知道我们必须调用Resource-&gt; 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()将返回数据转换为
function process_return_data($ resource,$ method,$ ret_val,$ resource_obj = NULL){
如果(array_key_exists( “回归”,ResourceMethodMap :: $ resource_method_map [$资源] [$方法])){
$ return_type = ResourceMethodMap :: $ resource_method_map [$ resource] [$ method] [“return”];
$ return_array = array();
开关($ return_type){
case'boolean':
if(false === $ ret_val){
返回false;
}其他{
如果(is_array($ RET_VAL)){
return $ ret_val;
} elseif(true === $ ret_val){
return $ ret_val;
}其他{
$ return_array [] = $ ret_val;
return $ return_array;
}
}
打破;
case'array':
return $ ret_val;
打破;
}
.....
}
}
所以是的,它完全取决于开发人员如何返回他们的数据。上面的例子只是我们实施的一个实时场景。
我已发布她http://codepad.org/MPY1gVed看完的完整代码