gpt4 book ai didi

php - 使用不同的参数调用 PHP 方法

转载 作者:可可西里 更新时间:2023-11-01 00:35:59 25 4
gpt4 key购买 nike

我正在编写一个 API 类,我的总体目标是通过 API 轻松地访问任何类的方法,而不必对类本身进行任何重大更改。本质上,我应该能够在我想使用的任何类上实例化一个 API 类实例(在我的小框架内),并且让它正常工作。

例如,在我的 API 类中,我有一个方法 call ,我想使用 $_GET从我想要访问的类中调用正确的函数(我们称之为 Beep )。所以我指定了一个 action我的 API 中的参数,以便 actionBeep的方法调用,其余参数在 $_GET 中大概是该方法的参数。在 API->call ,我能做到$BeepInstance->$_GET['action']() ,但我无法确定要从 $_GET 发送哪些参数,以及以什么顺序发送它们。

func_get_args只会返回调用它的函数的给定参数列表,我不一定知道用 call_user_func_array 传递它们的正确顺序.

有没有人试过做类似的事情?

最佳答案

这是一个解决方案 + 示例,它使用反射将您的输入参数映射到方法参数。我还添加了一种方法来控制公开哪些方法以使其更安全。

class Dispatch {
private $apis;

public function registerAPI($api, $name, $exposedActions) {
$this->apis[$name] = array(
'api' => $api,
'exposedActions' => $exposedActions
);
}

public function handleRequest($apiName, $action, $arguments) {
if (isset($this->apis[$apiName])) {
$api = $this->apis[$apiName]['api'];
// check that the action is exposed
if (in_array($action, $this->apis[$apiName]['exposedActions'])) {
// execute action

// get method reflection & parameters
$reflection = new ReflectionClass($api);
$method = $reflection->getMethod($action);

// map $arguments to $orderedArguments for the function
$orderedArguments = array();

foreach ($method->getParameters() as $parameter) {
if (array_key_exists($parameter->name, $arguments)) {
$orderedArguments[] = $arguments[$parameter->name];
} else if ($parameter->isOptional()) {
$orderedArguments[] = $parameter->getDefaultValue();
} else {
throw new InvalidArgumentException("Parameter {$parameter->name} is required");
}
}

// call method with ordered arguments
return call_user_func_array(array($api, $action), $orderedArguments);
} else {
throw new InvalidArgumentException("Action {$action} is not exposed");
}
} else {
throw new InvalidArgumentException("API {$apiName} is not registered");
}
}
}

class Beep {
public function doBeep($tone = 15000)
{
echo 'beep at ' . $tone;
}

public function notExposedInAPI()
{
// do secret stuff
}
}

例子:

// dispatch.php?api=beep&action=doBeep&tone=20000

$beep = new Beep();
$dispatch = new Dispatch();
$dispatch->registerAPI($beep, 'beep', array('doBeep'));

$dispatch->handleRequest($_GET['api'], $_GET['action'], $_GET);

关于php - 使用不同的参数调用 PHP 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7505498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com