0

回调函数如何帮助我的开发?尤其是 PHP。我是 php 和编程本身的新手,但我在 jquery 等 js 库中看到了回调的强大功能。我在 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');
   }
}

这个回调是如何工作的?参数从何而来?

4

1 回答 1

1

我不知道 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(),但这些是由调用回调的函数决定的,而不是由回调决定的。回调无法控制传递给它的参数。

于 2009-10-22T01:12:06.883 回答