Associative support for func_get_args function
Nessuno ha ancora preso questa issue.
- Lingua principale
- C
- Stelle
- 40.4k
- Fork
- 8.1k
- Merge medio
- 2g 13h
- PR unite (30g)
- 96
Descrizione
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.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia dal punto di ingresso func_get_args e confronta il suo comportamento con ReflectionFunction e ReflectionParameter, usando gli argomenti denominati e i valori predefiniti dell'esempio come requisiti. Determina il risultato associativo previsto e la gestione dei valori omessi, null, booleani e array, quindi aggiungi la copertura che mostri il comportamento proposto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- php
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Attiva
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100