Контакты RSS 2.0

Разделы Сайта:

Кубтеле - о компании
Инструменты SEO
FreeBSD
Администрирование
Centos администрирование
Windows администрирование
Программирование для web

Аккаунт

Популярное:

Материалы по web программированию › Функции обратного вызова в PHP
Функции обратного вызова (далее - callback) – широко используемая техника в программировании. Callback – это участок кода, который передаётся функции и затем выполняется самой же функцией. В этой статье я покажу Вам, как объявлять и вызывать callback’и в PHP, а также практические примеры, когда они могут быть полезны.

Чтобы показать, чем callback’и могут быть полезны, предположим, что у нас есть PHP скрипт, который при вызове загружает RSS ленту из 10 разных источников. Если для загрузки с каждого сайта потребуется по 2 секунды, то в сумме этот процесс займёт 20 секунд времени.

Код, который делает это, представлен ниже. Я добавил функцию sleep(), чтобы показать каким медленным может быть скрипт.
// эта функция симулирует загрузку данных с сайта
function getFromSites($urls)
{
	$ret = array();

	foreach ($urls as $url) {
		sleep(2);

		// сохраним данный для текущего сайта в массив
		$ret[] = array(
			'url' => $url,
			'data' => 'загруженные данные'
		);
	}

	return $ret;
}

// воображаемый список сайтов для загрузки
$urls = array(
	'http://www.first-site.com',
	'http://www.second-site.com'
	// много сайтов...
);

// начнём загрузку и сохраним результат
$data = getFromSites($urls);

// выведем полученные данные
foreach ($data as $row) {
	echo sprintf("Загрузка закончена из %s\n", $row['url']);
}


Если Вы запустите этот скрипт, то заметите, что он зависает на время прохождения по всем сайтам. Далее Вы получите доступ сразу ко всем загруженным данным. Следующая схема показывает процесс работы скрипта.

процесс работы скрита без callback функции

Намного лучшим решением будет возвращать свежезагруженные данные, как только они становятся доступными. Конечно же, Вы можете захардкодить нужную функциональность в функцию getFromSites(), но тогда станет очень трудно повторно использовать этот код и использовать возвращаемые данные по-другому в случае необходимости.

Следующая схема показывает процесс работы предыдущей функции, модифицированной для использования callback’ов. В этом случае callback вызывается каждый раз по завершении загрузки с отдельного сайта.

описание работы php callback функции, обратного вызова

В PHP процесс использования callback’ов предельно прост, используя вспомогательные функции is_callable() и call_user_func(). Существует три типа callback’ов, которые могут быть использованы:

1. Стандартная PHP функция.

2. Статический метод класса. Он передаётся как массив с именем класса первым элементом и именем метода вторым. Например, array(‘CallbackClass’, ‘myFunc’).

3. Метод объекта. Он также передаётся как массив, но вместо имени класса первым элементом становится объект. Например, array($obj, ‘myFunc’).

Следующий листинг показывает, как объявить каждый из типов callback’ов.
// 1: нормальная функция
function myFunc() {
}

$callback = 'myFunc';

// 2: статический метод
class CallbackClass {
	public static function myFunc() {
	}
}

$callback = array('CallbackClass', 'myFunc');

// 3: метод объекта
class AnotherClass {
	public function myFunc() {
	}
}

$obj = new AnotherClass();
$callback = array($obj, 'myFunc');


Чтобы проверить может ли callback быть использован, Вы можете воспользоваться функцией is_callable(). Эта функция принимает callback как аргумент и возвращает true, если он корректен. Вы можете вызвать callback, используя call_user_func(). Здесь также callback передаётся как первый аргумент, а если он в свою очередь принимает какие-либо аргументы, то добавьте их вторым, третьим параметром и т.д.

Следующий код показывает, как этим пользоваться. Этот код сначала убеждается в том, что callback корректен, а затем вызывает его с одним аргументом. Этот скрипт выводит ‘Hello’ в браузер.
function myFunc($arg1) {
	echo $arg1;
}

$callback = 'myFunc';

if (is_callable($callback)) {
	call_user_func($callback, 'Hello');
}


Возвращаясь к нашему предыдущему примеру, мы можем сейчас изменить функцию getFromSites() так, чтобы она принимала callback вторым аргументом. Теперь в дополнении к тому, что все данные будут возвращены за раз после обработки всех сайтов, callback будет вызван после обработки каждого сайта.

Callback будет принимать имя сайта своим первым аргументом, а загруженные данные - вторым.
// эта функция симулирует загрузку данных из сайта
function getFromSites($urls, $callback = null)
{
	$ret = array();

	foreach ($urls as $url) {
		sleep(2);

		$data = 'загруженные данные';

		// проверим корректен ли callback
		if (is_callable($callback)) {
			// callback корректен – вызовем 
	                //  его с данными аргументами
			call_user_func($callback, $url, $data);
		}

		// сохраним данные для текущего сайта
		// в выходной массив
		$ret[] = array(
			'url' => $url,
			'data' => $data
		);
	}

	return $ret;
}

// объявим выдуманный класс для callback’а
class CallbackClass
{
	// это метод callback’a
	public static function downloadComplete($url, $data)
	{
		echo sprintf("Загрузка завершена из %s\n", $url);
	}
}

// воображаемый список сайтов для загрузки
$urls = array(
	'http://www.first-site.com',
	'http://www.second-site.com'
	// много сайтов...
);

// начнём загрузку и сохранение данных
getFromSites($urls, array('CallbackClass', 'downloadComplete'));

// нам не нужно проходится циклом по выходным данным
// теперь этим управляет наш callback ;)


Когда Вы запустите этот код, то увидите, что сообщение “Загрузка завершена” появляется после обработки каждого сайта в отдельности, а не после всех в конце.
скачать dle 10.3фильмы бесплатно
Добавил: admin › 31-12-2014, 11:07
› 0 комментария › печатькатегория
Другие новости по теме
  • Сокращение URL c Google URL Shortener API
  • Перевод текста, используя Google Translate API и PHP, JSON и cURL
  • Функции в PHP
  • Класс singleton в PHP
  • Сортировка многомерных массивов в PHP

  • Кубтеле 350000, Россия, Краснодарский край, , город Краснодар,улица Айвазовского, д. 94, корп. А
    Продвижение сайтов,Регистрация доменов,Компьютерная системная интеграция
    8(861) 299-02-62, +7(903) 449-666-8