call_user_func和call_user_func_array详解

call_user_func和call_user_func_array详解

这是2020小目标20篇技术Blog的第 1 篇
距离小目标还有 19 篇✍️
@LiKachung

call_user_func

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
第一个参数 callback 是被调用的回调函数 其余参数是回调函数的参数

call_user_func_array

call_user_func_array ( callable $callback , array $param_arr ) : mixed
第一个参数 callback 是被调用的回调函数 param_arr是回调函数的参数数组

区别

  • 参数传递方式不同 call_user_func_array让参数的结构更清晰
  • call_user_func_array 参数支持引用传递方式

应用

调用第三方类库的时候优雅解决方法冗余(CI实现)

__call()魔术方法 当调用方法不存在时
会自动调用 __call()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
/**
* Model文件
* 假设项目存在email库
*/
class m_email extends CI_Model {
public function __construct()
{
parent::__construct();
$this->init = false;
$this->load->library('email');
}

// 初始化配置
public function init($config1=null){
$config = array();
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'xxxx';
$config['smtp_user'] = 'xxxx';
$config['smtp_pass'] = "xxxx";
$config['smtp_port'] = 'xxxx';
$config['smtp_crypto'] = 'xxxx';
$config['newline'] = "\r\n";
$config['mailtype'] = "xxxx";
$config['charset'] = 'utf-8';
if($config1){
$config = array_merge($config, $config1);
}
$this->email->initialize($config);
$this->init = true;
}

// 调用$this->email的方法
// 统一$this->email->send(), $this->email->to()等等方法
public function __call($name, $arguments){
if(!$this->init)$this->init();
// $this->email->$name($arguments)
return call_user_func_array(array($this->email, $name), $arguments);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/**
* Controller文件
* 调用email
*/
public function send_email($title, $content){
$this->load->model('m_email');
$this->m_email->clear();
$this->m_email->from('xxx', 'xxx');
$this->m_email->to('xxxx');
$this->m_email->subject($title);
$this->m_email->message($content);
$this->m_email->send();
}
# PHP

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×