Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Узнать, сколько аргументов принимает функция
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Узнать, сколько аргументов принимает функция

Страниц (1): [1]
 

1. MAXUS - 12 Ноября, 2014 - 20:04:37 - перейти к сообщению
Есть ли способ узнать, сколько аргументов ожидает функция? Например, чтобы предотвратить ошибку, когда в функцию передаются не все требуемые аргументы.
2. teddy - 12 Ноября, 2014 - 20:16:40 - перейти к сообщению
Есть.

PHP:
скопировать код в буфер обмена
  1. function hello($name, $age, $notRequired = null)
  2. {
  3.     //...
  4. }
  5.  
  6. $rFunction = new \ReflectionFunction('hello');
  7. var_dump($rFunction->getNumberOfParameters());
  8. var_dump($rFunction->getNumberOfRequiredParameters());


getNumberOfParameters - возвращает общее количество ожидаемых параметров.
getNumberOfRequiredParameters - возвращает количество обязательных параметров

Обязательными является те параметры, которые не имеют значения по умолчанию.

Аналогичные reflection-методы доступны через ReflectionMethod(если речь в данном случае идет о методах класса, тогда нужен именно ReflectionMethod )
3. MiksIr - 12 Ноября, 2014 - 20:34:00 - перейти к сообщению
MAXUS пишет:
Есть ли способ узнать, сколько аргументов ожидает функция? Например, чтобы предотвратить ошибку, когда в функцию передаются не все требуемые аргументы.

Воспользоваться IDE
4. MAXUS - 12 Ноября, 2014 - 20:51:14 - перейти к сообщению
teddy пишет:
getNumberOfParameters - возвращает общее количество ожидаемых параметров.
getNumberOfRequiredParameters - возвращает количество обязательных параметров


Спасибо! Направление понял. Единственное, в php4 работать не будет?
(Добавление)
MiksIr пишет:
Воспользоваться IDE


А ватета не понял. Не соблаговолите расшифровать? Улыбка Вернее, расшифровать я расшифровал, но конкретно применительно к php это как выглядит?
5. teddy - 12 Ноября, 2014 - 21:05:22 - перейти к сообщению
MAXUS
Ниже PHP 5 работать не будет. А что, Вы все ещё 4 версией пользуетесь?Улыбка
6. OrmaJever - 12 Ноября, 2014 - 21:08:42 - перейти к сообщению
MAXUS пишет:
А ватета не понял. Не соблаговолите расшифровать? Вернее, расшифровать я расшифровал, но конкретно применительно к php это как выглядит?

открыть в редакторе файлик с функцией и посомтреть сколько и каких аргументов она принимает. По моему глупо использовать не знакомую функцию. Если вы не знаете сколько и каких аргументов она принимает то как вы можите быть уверен в возвращаемом значении?
7. Мелкий - 12 Ноября, 2014 - 21:35:09 - перейти к сообщению
И хочу напомнить, что даже обязательные параметры могут варьироваться, в том числе от других параметров этой же самой функции. printf, например.
8. teddy - 12 Ноября, 2014 - 21:36:35 - перейти к сообщению
Согласен с OrmaJever.

Но иногда подобные возможности могут оказаться полезными.

Например, если мы разрабатываем программу, которая должна динамически отслеживать сколько/какого типа параметры ожидает некий метод. Как более точный пример можно указать реализацию Dependency Injector, который должен самостоятельно отслеживает куда и какие зависимости нужно внедрить. Если он не будет знать, экземпляр какого класса ожидает некий метод в качестве параметра, то успешно будет отхвачен Fatal error.
9. MiksIr - 13 Ноября, 2014 - 00:03:37 - перейти к сообщению
Рефлексия, увы, весьма медленная штука. По-этому и стараются делать DI через конфиги, контейнеры и т.п.
И потом все-равно одного анализа мало, ибо он не дает ответа - синглтон нужно или новый инстанс, или какая реализация конкретного интерфейса нужна.
Хотя, наверно, такой инжектор кто только не писал =)

MAXUS пишет:
А ватета не понял. Не соблаговолите расшифровать? Вернее, расшифровать я расшифровал, но конкретно применительно к php это как выглядит?

Я к тому, что не нужно "предотвратить ошибку, когда в функцию передаются не все требуемые аргументы" в рантайме, эту ошибку нужно предотвратить в процессе разработки, и IDE в этом поможет.

 

Powered by ExBB FM 1.0 RC1