Heim > Backend-Entwicklung > PHP-Tutorial > closure - PHP函数回调参数如何在回调函数内使用外部参数

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-06 20:38:19
Original
1598 Leute haben es durchsucht

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

<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>
Nach dem Login kopieren
Nach dem Login kopieren

如果:

<code>$gifts = $this->get_list();
$gifts = array_filter($gifts,($this,'gift_selector'));
</code>
Nach dem Login kopieren
Nach dem Login kopieren

$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>
Nach dem Login kopieren
Nach dem Login kopieren

如果:

<code>$gifts = $this->get_list();
$gifts = array_filter($gifts,($this,'gift_selector'));
</code>
Nach dem Login kopieren
Nach dem Login kopieren

$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>
Nach dem Login kopieren

蟹妖

写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>
Nach dem Login kopieren

于是就有

<code>php</code><code>$this->get_list([$this,'gift_selector']);
</code>
Nach dem Login kopieren

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

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

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

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
PHP-Datenerfassung?
Aus 1970-01-01 08:00:00
0
0
0
PHP-Erweiterung intl
Aus 1970-01-01 08:00:00
0
0
0
Wie man PHP gut lernt
Aus 1970-01-01 08:00:00
0
0
0
Mehrere PHP-Versionen
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage