实用的回调函数

时间:2009-10-22 00:39:18

标签: php kohana

回调函数如何帮助我进行开发?特别是PHP。我是php和编程本身的新手,但我看到了像jquery这样的js库中回调的强大功能。我曾经在php中使用过回调,但我还是被问了很多关于它的问题:

  1. 回调函数的范围是什么
  2. 我可以将哪些参数传递给回调函数(隐式或显式)
  3. 这是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 个答案:

答案 0 :(得分: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定义的回调函数()。我希望我足够清楚。

基本上,传递给回调的参数取决于调用它们的函数。我可以使用我想要的任何参数调用parseBBCode()来调用parseBBCode(),但这些函数由调用回调的函数决定,而不是由回调决定。回调无法控制传递给它的参数。