注册函数的原型
function method_impl(string $method_name, array $params, array $user_data);
$method_name
调用客户端已知的公共方法名称
$params
调用客户端指定的参数
$user_data
任何本地数据,由 `xmlrpc_server_call_method` 传递
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
xmlrpc_server_register_method — 将 PHP 函数注册到与 method_name 匹配的资源方法
注册函数的原型
function method_impl(string $method_name, array $params, array $user_data);
$method_name
调用客户端已知的公共方法名称
$params
调用客户端指定的参数
$user_data
任何本地数据,由 `xmlrpc_server_call_method` 传递
请记住,如果您想从静态类添加方法(因此您无法创建任何实例),则不能像 Chrigu 和 Nate 所说的那样做。
一种解决方法是创建调用
方法的lambda函数
// 我们的静态处理程序类
static class MyHandler
{
public function getPrice($item)
{
$prices = array("apple" => 4, "orange" => 5);
return $prices[$item];
}
public function buy($item, $number)
{
$price = self::getPrice($item) * $number;
do_thing_to_sell_the_item();
return $price;
}
}
// 使用反射获取方法名称和参数
$mirror = new ReflectionClass("MyHandler");
foreach ($mirror->getMethods() as $method)
{
// 为每个方法创建新的“lambda”函数
// 生成参数列表
$args = array();
foreach ($method->getParameters() as $param)
{
$args[] = '$'.$param->getName();
}
$args = implode(',', $args);
// 生成代码
$methodname = $method->getName();
$code = "return {$real_class}::{$methodname}({$args});";
// 创建函数,检索函数名称
$function_name = create_function($args, $code);
// 注册函数
xmlrpc_server_register_method($myserver, $methodname, $function_name);
}
这是一个如何注册类方法的示例
xml_rpc_server_register_methode($xmlrpc_server, "foo", array(&$bar, "foo_func"));
其中 $bar 是您类的实例,foo_func 是此类的方法。不要忘记“&”!
希望这可能有用……
Chrigu
要以编程方式生成服务器生成的 xmlrpc 错误响应,作为方法处理程序注册的 php 函数必须返回一个包含 FaultCode 和 FaultString 成员的数组。
function $myfunc($methodname, $vals, $extra_data)
{
...
return array('faultCode' => 666, 'faultString' => 'DOH!');
}
注意 1:即使您通过调用 `xmlrpc_server_register_introspection_callback` 或 `xmlrpc_server_add_introspection_data` 添加内省数据,服务器也不会为您验证接收到的参数的数量或类型。
这意味着您必须在您的 php 函数中实现所有必需的接收参数验证。
注意 2:注意处理接收参数中的 base64 和日期时间值:它们不会自动转换为 php 标量值,而是转换为具有成员 `xmlrpc_type` 和 `scalar` 的 stdClass 对象
要将回调注册到同一类中的“静态”函数,请考虑以下语法
<code>
$callback = array (__CLASS__, "my_function_name");
xmlrpc_server_register_method($xmlrpc_server, "my_function", $callback);
</code>
这样操作可以更轻松地以后重命名您的类。
如果 Chrigu 的意思不完全清楚,
您可以通过执行以下操作在您的类中注册方法
xml_rpc_server_register_methode($xmlrpc_server, "myClientCall", array(&$this, "handleClientCallFunc"));
其中 $this == 魔术类 $this。=)