Функции PHP: больше аргументов, чем ожидалось - PullRequest
1 голос
/ 23 октября 2019

PHP code1:

function f() {return 'hello world!';}

echo f().'<br>';
echo f(123).'<br>';
echo f(123, 'foo').'<br>';

Вывод:

hello world!
hello world!
hello world!

PHP code2:

function g(int $x) {return 'hello world!';}

echo g(123).'<br>';
echo g(123, 'foo').'<br>';

Вывод:

hello world!
hello world!

Вопрос

Можно ли заставить PHP выдавать ошибку при передаче большего количества аргументов, чем ожидает функция?


Вопросы

  1. Почему PHP не выдает ошибку, когда я передаю слишком много параметров в функцию?

Последующее наблюдение

Уже был RFC, предлагающий Строгое количество аргументов при вызовах функций , которое, к сожалению, было отозвано из-за высокого отклонения. Вот некоторые интересные моменты:

  • "Во время тестов стало ясно, что предлагаемая строгая проверка количества аргументов не будет проблемой. На самом деле, это совсем наоборот. Это поможетповысить качество PHP-кода с PHP7 и выше, поскольку все предупреждения были полезны для выявления ошибок или даже ошибок ».
  • "RFC был отозван из-за многих спорных моментов и общего отклонения и не будет вновь предложен автором RFC. Автор RFC рекомендует не восстанавливать этот RFC, поскольку он уже был отклонен."

Также доступно более глубокое обсуждение: [PHP-DEV] [RFC] [DISCUSSION] Строгое количество аргументов

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Как и другие предлагали, используйте класс ReflectionFunction.

<?php
function foo($bar, $baz) {
    $refFunc = new ReflectionFunction(__FUNCTION__);
    if(func_num_args() > $refFunc->getNumberOfParameters())
        throw new Exception('Too many arguments.');
}

foo(1,2,3);

Будет сгенерировано исключение.

Или проще. Поместите это в начало функции:

function bar($baz, $bat) {
    if(func_num_args()>count(get_defined_vars()))
        throw new Exception('Too many args.');
}

bar(1,2,3);

Будет выброшено исключение.

0 голосов
/ 23 октября 2019

В Php нет ничего плохого в том, чтобы передать в функцию больше аргументов, чем необходимо, и вы получите ошибку, только если передадите меньше аргументов.

Количество аргументов, переданных в функцию, можно получить с помощью func_num_args (), ноесли вы хотите узнать, сколько параметров в действительности имеет ваша функция, вы можете использовать методы отражения:

$method = new \ReflectionMethod('MyClassName', 'myFunction');
$method = new \ReflectionFunction('myFunction');
var_dump($method->getNumberOfParameters(), $method->getParameters());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...