практические функции обратного вызова - PullRequest
0 голосов
/ 22 октября 2009

Как функции обратного вызова могут помочь мне в моем развитии? Особенно с PHP. Я новичок в php и в программировании, но я видел силу обратных вызовов в js-библиотеках, таких как jquery. Я работал с обратным вызовом в php, но меня оставили, задавая много вопросов об этом:

  1. какова область действия функции обратного вызова
  2. какие параметры я могу передать функции обратного вызова (неявно или явно)

вот код из документации Kohana:

$post->add_callbacks('email', array($this, '_unique_email'));

// Define the callback method
/*
 * Callback method that checks for uniqueness of email
 *
 * @param  Validation  $array   Validation object
 * @param  string      $field   name of field being validated
 */
public function _unique_email(Validation $array, $field)
{
   // check the database for existing records
   $email_exists = (bool) ORM::factory('user')->where('email', $array[$field])->count_all();

   if ($email_exists)
   {
       // add error to validation object
       $array->add_error($field, 'email_exists');
   }
}

как работал этот обратный вызов? откуда взялись параметры?

1 Ответ

1 голос
/ 22 октября 2009

Я не знаю Kohana, но я предполагаю, что это подразумевает, что при проверке электронной почты он вызывает _unique_email ().

В PHP обратные вызовы могут помочь вам в разработке, чтобы предоставить вам простой способ расширить ваш код. Например:

$post = new Blog_Post();
$post->contents = $_POST['contents'];
$post->save();

Этот фрагмент кода создаст новое сообщение в блоге, установит содержимое и сохранит его в базе данных. Но, допустим, вы хотите обработать BBCode в содержимом. Как вы можете сделать это без необходимости редактировать класс Blog_Post? С обратным вызовом.

$post = new Blog_Post();
$post->onSave('parseBBCode');
$post->contents = $_POST['contents'];
$post->save(); # Will call parseBBCode when saving the blog post.

function parseBBCode($contents) {
  # Parse BBCode and return the parsed contents.
}

Очевидно, что существуют разные способы реализации обратных вызовов, но вы сказали, что знаете силу обратных вызовов в JS, и они всегда onClick, onLoad, onKeyUp и т. Д., Поэтому я хотел бы привести пример, несколько напоминающий такое поведение.

Надеюсь, это помогло. Относительно ваших вопросов о параметрах, это зависит от того, что дано для обратного вызова. В моем примере любая функция, которая запускается в onSave, будет иметь только параметр $ contents.

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

В основном, аргументы, которые передаются обратным вызовам, зависят от функций, которые их вызывают. Я мог бы вызвать функцию save () parseBBCode () с любыми аргументами, которые я хотел, но они решаются функцией, которая вызывает обратный вызов, а не обратным вызовом. Обратный вызов не контролирует, какие аргументы ему передаются.

...