Associative support for func_get_args function
还没有人认领这个 Issue。
- 主要语言
- C
- 星标
- 40.4k
- 派生
- 8.2k
- 平均合并
- 2 天 15 小时
- 30 天内合并 PR
- 103
描述
Description
It seems that currently there is no way to get function arguments with parameters name!
Example:
function tg_send_message(
string $text,
int $chat_id,
?int $message_thread_id = null,
?string $parse_mode = null,
?array $entities = null,
bool $disable_web_page_preview = false,
bool $disable_notification = false,
bool $protect_content = false,
?int $reply_to_message_id = null,
bool $allow_sending_without_reply = false,
array $reply_markup = [],
) {
print_r(func_get_args());
}
tg_send_message(text: 'FooBarBaz', chat_id: 123, disable_notification: true);
/*
Output:
Array
(
[0] => FooBarBaz
[1] => 123
[2] =>
[3] =>
[4] =>
[5] =>
[6] => 1
)
*/
But how we can get the arguments with the parameter name?! I mean there must be a way to get something like this:
Array
(
[text] => FooBarBaz
[chat_id] => 123
[message_thread_id] => null
[parse_mode] => null
[entities] => null
[disable_web_page_preview] => false
[disable_notification] => 1
[protect_content] => false
[reply_to_message_id] => null
[allow_sending_without_reply] => false
[reply_markup] => []
)
It can be done with the ReflectionFunction class:
Example:
function tg_send_message(
string $text,
int $chat_id,
?int $message_thread_id = null,
?string $parse_mode = null,
?array $entities = null,
bool $disable_web_page_preview = false,
bool $disable_notification = false,
bool $protect_content = false,
?int $reply_to_message_id = null,
bool $allow_sending_without_reply = false,
array $reply_markup = [],
) {
$reflection = new ReflectionFunction(__FUNCTION__);
$arguments = [];
foreach ($reflection->getParameters() as $parameter) {
$name = $parameter->getName();
$value = $$name ?? $parameter->getDefaultValue();
$arguments[$name] = $value;
}
print_r($arguments);
}
tg_send_message(text: 'FooBarBaz', chat_id: 123, disable_notification: true);
/*
Output:
Array
(
[text] => FooBarBaz
[chat_id] => 123
[message_thread_id] =>
[parse_mode] =>
[entities] =>
[disable_web_page_preview] =>
[disable_notification] => 1
[protect_content] =>
[reply_to_message_id] =>
[allow_sending_without_reply] =>
[reply_markup] => Array
(
)
)
*/
But the above code is not good when we want to use another funtion to get the called function arguments.
Example:
function tg_send_message(
string $text,
int $chat_id,
?int $message_thread_id = null,
?string $parse_mode = null,
?array $entities = null,
bool $disable_web_page_preview = false,
bool $disable_notification = false,
bool $protect_content = false,
?int $reply_to_message_id = null,
bool $allow_sending_without_reply = false,
array $reply_markup = [],
) {
print_r(get_function_arguments(__FUNCTION__));
}
// another function
function delete_message(
int $chat_id,
int $message_id,
) {
// get_function_arguments(__FUNCTION__);
}
function get_function_arguments($function)
{
$reflection = new ReflectionFunction($function);
$parameters = [];
// Here, there is nothing in the ReflectionParameter class to get parameter value !!!
foreach ($reflection->getParameters() as $parameter) {
$name = $parameter->getName();
$value = $$name ?? $parameter->getDefaultValue();
$parameters[$name] = $value;
}
return $parameters;
}
tg_send_message(text: 'FooBarBaz', chat_id: 123, disable_notification: true);
It gives me this error:
PS D:\Documents\Code\ZiBot> php .\bot.php
PHP Fatal error: Uncaught ReflectionException: Internal error: Failed to retrieve the default value in D:\Documents\Code\ZiBot\lib.php:83
Stack trace:
#0 D:\Documents\Code\ZiBot\lib.php(83): ReflectionParameter->getDefaultValue()
#1 D:\Documents\Code\ZiBot\lib.php(74): get_function_arguments('tg_send_message')
#2 D:\Documents\Code\ZiBot\bot.php(12): tg_send_message('FooBarBaz', 123, NULL, NULL, NULL, false, true)
#3 {main}
thrown in D:\Documents\Code\ZiBot\lib.php on line 83
Fatal error: Uncaught ReflectionException: Internal error: Failed to retrieve the default value in D:\Documents\Code\ZiBot\lib.php:83
Stack trace:
#0 D:\Documents\Code\ZiBot\lib.php(83): ReflectionParameter->getDefaultValue()
#1 D:\Documents\Code\ZiBot\lib.php(74): get_function_arguments('tg_send_message')
#2 D:\Documents\Code\ZiBot\bot.php(12): tg_send_message('FooBarBaz', 123, NULL, NULL, NULL, false, true)
#3 {main}
thrown in D:\Documents\Code\ZiBot\lib.php on line 83
HOW CAN I SOLVE THIS ISSUE ?!
If there is no way for that, please add a parameter to the func_get_args or add another function for this.
Thank you for your attention.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 func_get_args 入口点开始,将其行为与 ReflectionFunction 和 ReflectionParameter 进行比较,并以示例中的命名参数和默认值作为要求。确定预期的关联结果以及对省略值、null、布尔值和数组值的处理方式,然后添加覆盖以展示所提议的行为。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- php
- 领域
- compilers
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 活跃
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100