call user func array php

(PHP 4 >= 4.0.4, PHP 5, PHP 7)

call_user_func_array — Вызывает пользовательскую функцию с массивом параметров

Описание

Вызывает пользовательскую функцию callback , с параметрами из массива param_arr .

Список параметров

Вызываемая функция типа callable .

Передаваемые в функцию параметры в виде индексированного массива.

Возвращаемые значения

Возвращает результат функции или FALSE в случае ошибки.

Список изменений

Версия Описание
5.3.0 Изменилась интерпретация объектно-ориентированных ключевых слов, таких как parent и self. Ранее их вызов с помощью синтаксиса двойного двоеточия вызывал предупреждение уровня E_STRICT , так как они расценивались как статические вызовы.

Примеры

Пример #1 Пример использования функции call_user_func_array()

function foobar ( $arg , $arg2 ) <
echo __FUNCTION__ , » got $arg and $arg2
» ;
>
class foo <
function bar ( $arg , $arg2 ) <
echo __METHOD__ , » got $arg and $arg2
» ;
>
>

// Вызываем функцию foobar() с 2 аргументами
call_user_func_array ( «foobar» , array( «one» , «two» ));

// Вызываем метод $foo->bar() с 2 аргументами
$foo = new foo ;
call_user_func_array (array( $foo , «bar» ), array( «three» , «four» ));
?>

Результатом выполнения данного примера будет что-то подобное:

Пример #2 Пример использования call_user_func_array() и имени из пространства имен

class Foo <
static public function test ( $name ) <
print «Hello < $name >!
» ;
>
>

// Начиная с версии PHP 5.3.0
call_user_func_array ( __NAMESPACE__ . ‘Foo::test’ , array( ‘Hannes’ ));

// Начиная с версии PHP 5.3.0
call_user_func_array (array( __NAMESPACE__ . ‘Foo’ , ‘test’ ), array( ‘Philip’ ));

Результатом выполнения данного примера будет что-то подобное:

Пример #3 Использование lambda-функции

= function( $arg1 , $arg2 ) <
return $arg1 * $arg2 ;
>;

var_dump ( call_user_func_array ( $func , array( 2 , 4 ))); /* Начиная с версии PHP 5.3.0 */

Результат выполнения данного примера:

Примечания

До PHP 5.4 переменные-ссылки в param_arr передавались в функции по ссылке вне зависимости от того, ожидает ли функция передачу соответствующего параметра по ссылке или нет. При использовании этого вида «динамической» передачи по ссылке не выводится предупреждение об устаревшем поведении, но тем не менее такая передача считается устаревшей и была удалена в PHP 5.4. Кроме того, это не влияет на встроенные функции, у которых учитывается сигнатура функции. Передача параметра функции по значению при ожидаемой передаче по ссылке вызовет предупреждение и заставит call_user_func() вернуть FALSE (однако имеется исключение для передаваемых значений, у которых количество ссылок равно 1, также как у литералов, поскольку последние могут быть преобразованы в ссылки без побочных последствий, однако запись значения в такие параметры не имеет никакого эффекта. Не полагайтесь на такое поведение, все-таки количество ссылок — это подробности реализации и правильность такого режима работы вызывает сомнения).

Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array() , не будут вызваны при наличии не пойманного исключения, брошенного в предыдущей callback-функции.

Смотрите также

  • call_user_func() — Вызывает пользовательскую функцию, указанную в первом параметре
  • информация о типе callback
  • ReflectionFunction::invokeArgs() — Вызов функции с передачей аргументов
  • ReflectionMethod::invokeArgs() — Вызов метода с передачей аргументов массивом

(PHP 4 >= 4.0.4, PHP 5)

call_user_func_array — Вызывает пользовательскую функцию с массивом параметров

Описание

Вызывает пользовательскую функцию function, с параметрами из массива param_arr.

Список параметров

Передаваемые в функцию параметры, в качестве индексированного массива.

Возвращаемые значения

Возвращает результат функции или FALSE в случае ошибки.

Список изменений

Версия Описание
5.3.0 Изменилась интерпретация объектно-ориентированных ключевых слов, таких как parent и self. Ранее, их вызов с помощью синтаксиса двойного двоеточия вызывал предупреждение уровня E_STRICT, так как они расценивались как статические вызовы.

Примеры

Пример #1 Использование call_user_func_array()

function foobar ( $arg , $arg2 ) <
echo __FUNCTION__ , » got $arg and $arg2
» ;
>
class foo <
function bar ( $arg , $arg2 ) <
echo __METHOD__ , » got $arg and $arg2
» ;
>
>

// Вызываем функцию foobar() с 2 аргументами
call_user_func_array ( «foobar» , array( «one» , «two» ));

// Вызываем метод $foo->bar() с 2 аргументами
$foo = new foo ;
call_user_func_array (array( $foo , «bar» ), array( «three» , «four» ));
?>

Результатом выполнения данного примера будет что-то подобное:

Пример #2 Пример использования call_user_func_array() и имени из пространства имен

class Foo <
static public function test ( $name ) <
print «Hello < $name >!
» ;
>
>

// Начиная с версии PHP 5.3.0
call_user_func_array ( __NAMESPACE__ . ‘Foo::test’ , array( ‘Hannes’ ));

// Начиная с версии PHP 5.3.0
call_user_func_array (array( __NAMESPACE__ . ‘Foo’ , ‘test’ ), array( ‘Philip’ ));

Результатом выполнения данного примера будет что-то подобное:

Пример #3 Использование lambda-функции

= function( $arg1 , $arg2 ) <
return $arg1 * $arg2 ;
>;

var_dump ( call_user_func_array ( $func , array( 2 , 4 ))); /* Начиная с версии PHP 5.3.0 */

Результат выполнения данного примера:

Примечания

Переменные-ссылки в param_arr передаются в функцию по ссылке, вне зависимости от того, ожидает ли функция передачу соответствующего параметра по ссылке или нет. Эта форма «динамической» передачи по ссылке не выводит замечания об устаревшем поведении, но тем не менее считается устаревшей, и, скорее всего, будет удалена в следующей версии PHP. Далее, это не влияет на встроенные функции, у которых учитывается сигнатура функции. Передача по значению параметра функции, при ожидаемой передачи по ссылке, вызовет предупреждение и заставит call_user_func() вернуть FALSE (за исключением если переданное значение имеет количество ссылок (reference count) равное 1).

Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array() , не будут вызваны при наличии непойманного исключения, брошенного в предыдущей callback-функции.

В PHP есть такая функция, которая называется call_user_func_array. Данная функции может использоваться для динамического вызова методов класса, как с параметрами так и без.

Особенно, данная функция может быть полезна при динамическом вызове обработчиков маршрутов в MVC коде.

Допустим у нас есть следующий класс контроллера статей ArticlesController. Код максимально упрощен для того, чтобы показать суть использования данной функции.

// действие которое отображает статью из корпоративного блога
// $company_name — название компании
// $article_id — идентификатор статьи
public function actionСompanyBlog($company_name,$article_id) <
return «Company=<$company_name>;Article > >
>

// вызов первой метода с одним параметром
$result[] = call_user_func_array([«ArticlesController»,»actionArticle»], [123]);

// вызов второго метода с двумя параметрами
$result[] = call_user_func_array([«ArticlesController»,»actionСompanyBlog»], [«Myrusakov Support»,12345]);

Данная функция принимает два параметра — массива. Первый массив состоит из класса и метода, а второй из параметров, которые передаются методу массива.

Функция call_user_func_array сама производит вызов метода контроллера и передает ему параметры, причем в каждый аргумент метода будет передано соответствующее значение параметра.

Вот такая полезная функции call_user_func_array есть в PHP.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2019 Русаков Михаил Юрьевич. Все права защищены.

    Оцените статью