closure - PHP函数回调参数如何在回调函数内使用外部参数

WBOY
Release: 2016-06-06 20:38:19
Original
1540 people have browsed it

直接代码,使用场景:
现在的代码:

<code>$gifts = $this->get_list();
$gifts = array_filter($gifts,function($v) use ($customer_id){
    return call_user_func(array($this,'gift_selector'),$v,$customer_id);
});
</code>
Copy after login
Copy after login

如果:

<code>$gifts = $this->get_list();
$gifts = array_filter($gifts,($this,'gift_selector'));
</code>
Copy after login
Copy after login

$gift是可以作为默认参数传入$this->gift_selector(),但是 外部变量 $customer_id 怎么传入呢?

当然,closure的时候可以使用 use ($customer_id) 这个是知道的,不过在这里想把回调函数拿出来写,因为写成closure太长了。

回复内容:

直接代码,使用场景:
现在的代码:

<code>$gifts = $this->get_list();
$gifts = array_filter($gifts,function($v) use ($customer_id){
    return call_user_func(array($this,'gift_selector'),$v,$customer_id);
});
</code>
Copy after login
Copy after login

如果:

<code>$gifts = $this->get_list();
$gifts = array_filter($gifts,($this,'gift_selector'));
</code>
Copy after login
Copy after login

$gift是可以作为默认参数传入$this->gift_selector(),但是 外部变量 $customer_id 怎么传入呢?

当然,closure的时候可以使用 use ($customer_id) 这个是知道的,不过在这里想把回调函数拿出来写,因为写成closure太长了。

<code>php</code><code>class Demo
{
    private $customer_id = 0;

    public function doit()
    {
        $gifts = array('1', '2', '3');

        $this->customer_id = 3;

        $gifts = array_filter($gifts, array($this,'gift_selector'));

        return $gifts;
    }

    private function gift_selector($v)
    {
        return $v==$this->customer_id ? true : false;
    }
}

$obj    = new Demo();
$gifts  = $obj->doit();

var_dump($gifts);
/*
array (size=1)
  2 => string '3' (length=1)
*/
</code>
Copy after login

蟹妖

写callback硬要传非参数的值可以通过 @宋小北 那样的类成员等方式实现,但我个人觉得这类似全局变量传递状态,属于不好的code smell

我的建议是可以考虑给get_list增加按回调过滤的能力

<code>php</code><code>function get_list($filter = null) {
  $gifts = [];//原本的逻辑..

  if(is_callable($filter)) {
    $gifts = array_filter($gifts,function($gift) use ($customer_id) {
      return call_user_func($filter, $gift, $customer_id);
    });
  }

  return $gifts;
}
</code>
Copy after login

于是就有

<code>php</code><code>$this->get_list([$this,'gift_selector']);
</code>
Copy after login

了,gift_selector能够收到$gift, $customer_id作为参数

全局变量,session/cookie,引用传值

edit:
类属性赋值
$this->customer_id;

Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template