PHP 使用变量函数声明和应用回调函数

PHP 使用变量函数声明和应用回调函数使用变量函数声明和应用回调函数如果要自定义一个可以回调的函数, 可以选择使用变量函数帮助实现。<?

大家好,欢迎来到IT知识分享网。

使用变量函数声明和应用回调函数

如果要自定义一个可以回调的函数, 可以选择使用变量函数帮助实现。

<?php /** 声明回调函数filter, 在0-100的整数中通过自定义条件过滤不要的数字 @param callback $fun 需要传递一个函数名称字符串作为参数 */ function filter( $fun ) { for($i=0; $i <= 100; $i++) { //将参数变量$fun加上一个圆插号$fun(), 则为调用和变量$fun值同名的函数 if( $fun($i) ) continue; echo $i.'<br>'; } } /** 声明一个函数one, 如果参数是3的倍数就返回true, 否则返回false @param int $num 需要一个整数作为参数 */ function one($num) { return $num%3 == 0; } /** 声明一个函数two, 如果参数是一个回文数(翻转后还等于自己的数)返回true, 否则返回false @param int $num 需要一个整数作为参数 */ function two($num) { return $num == strrev($num); } filter("one"); //打印出100以内非3的倍数,参数"one"是函数one()的名称字符串,是一个回调 echo '--------------------<br>'; filter('two'); //打印出100以内非回文数,参数"two"是函数two()的名称字符串,是一个回调

借助call_user_func_array()函数自定义回调函数

<?php /** 声明一个函数fun(), 功能只输出两个字符串,目的是作为call_user_func_array()回调参数 @param string $msg1 需要传递一个字符串作为参数 @param string $msg2 需要传递另一个字符串作为参数 */ function fun($msg1, $msg2) { echo '$msg1 = '.$msg1; echo '<br>'; echo '$msg2 = '.$msg2; } /** 通过系统函数call_user_func_array() 调用函数fun() 第一个参数为函数fun()的名称字符串 第二个参数则是一个数组,每个元素值会按顺序传递给调用的fun()函数参数列表中 */ call_user_func_array('fun', array('LAMP', '张三')); 
<?php /** 声明回调函数filter, 在0-100的整数中通过自定义条件过滤不要的数字 @param callback $fun 需要传递一个函数名称字符串作为参数 */ function filter( $fun ) { for($i=0; $i <= 100; $i++) { //使用系统函数call_user_func_array(),调用变量$fun值相同的函数 if( call_user_func_array($fun, array($i)) ) continue; echo $i.'<br>'; } } /** 声明一个函数one, 如果参数是3的倍数就返回true, 否则返回false @param int $num 需要一个整数作为参数 */ function one($num) { return $num%3 == 0; } /** 声明一个函数two, 如果参数是一个回文数(翻转后还等于自己的数)返回true, 否则返回false @param int $num 需要一个整数作为参数 */ function two($num) { return $num == strrev($num); } filter("one"); //打印出100以内非3的倍数,参数"one"是函数one()的名称字符串,是一个回调 echo '--------------------<br>'; filter('two'); //打印出100以内非回文数,参数"two"是函数two()的名称字符串,是一个回调

类静态函数和对象的方法回调

<?php /* 声明一个类Demo,类中声明一个静态的成员方法fun() */ class Demo { static function fun($msg1, $msg2) { echo '$msg1 = '.$msg1; echo '<br>'; echo '$msg2 = '.$msg2; } } /* 声明一个类Test, 类中声明一个普通的成员方法fun() */ class Test { function fun($msg1, $msg2) { echo '$msg1 = '.$msg1; echo '<br>'; echo '$msg2 = '.$msg2; } } /** 通过系统函数call_user_func_array()调用Demo类中的静态成员方法fun(), 回调类中的成员方法:第一个参数必须使用数组,并且这个数组需要指定两个元素, 第一个元素为类名称字符串,第二个元素则是该类中的静态方法名称字符串。 第二个参数也是一个数组,这个数组中每个元素值会按顺序传递给调用Demo类中的fun()方法参数列表中。 */ call_user_func_array( array("Demo", 'fun'), array('LAMP', '兄弟连') ); /** 通过系统函数call_user_func_array()调用Test类的实例对象中的成员方法fun(), 回调类中的成员方法:第一个参数必须使用数组,并且这个数组需要指定两个元素, 第一个元素为对象引用,在本例也可以是$obj=new Test()中的$obj, 第二个元素则是该对象中的成员方法名称字符串。 第二个参数也是一个数组,这个数组中每个元素值会按顺序传递给调用new Test()对象中的fun()方法参数列表中。 */ call_user_func_array( array(new Test(), 'fun'), array('BroPHP', '学习型PHP框架') ); 

call_user_func()方法使用

<?php //先引用后增加 function _call($call){ //通过传参获取call_user_func传过来的参数 echo $call++,'<br/>'; echo $call++,"<br/>"; } //上面回调函数没有返回值,所以,这里就没有返回值,_call为上面的函数的名称 $re = call_user_func('_call',1); //实验结果为 null,符合上面的结论 var_dump($re); ?>
<?php //先增加后引用 call_user_func(function($call){ echo ++$call,'<br/>'; echo ++$call,'<br/>'; },1);//传给匿名函数的参数为···1···,执行的结果为2,3 ?>

参考:

<?php namespace app\portal\adapter; abstract class AbstractAdapter { //要调用的方法 protected $invokes; /** * 调用invokes里的类和方法 * @param $method * @param $params * @param $break * @return array */ protected function callInvokes($method, $params = [], $break = true){ $params = (array)$params; $data = []; foreach ($this->invokes as $className) { if (class_exists($className)) { $class = new $className(); if (method_exists($class, $method)) { $result = call_user_func_array([$class, $method], $params); if ($result) { $data = array_merge($data, $result); if ($break === true || $break === $className) { break; } } } } } return $data; } }

使用方法

<?php namespace app\portal\adapter\marketspider; use app\portal\adapter\AbstractAdapter; use think\Db; class Spider extends AbstractAdapter { protected $invokes = [ BishijieSpider::class, //获取app\portal\adapter\marketspider\BishijieSpider类 GateioSpider::class, ]; protected $marketCoinData; public function getMarketCoin(){ if (! $this->marketCoinData) { $this->marketCoinData = $this->callInvokes('getMarketCoin', [], true); $this->marketCoinData = array_column($this->marketCoinData, null, 'code'); } return $this->marketCoinData; } /** * 更新币种到数据库 * @param bool $update * @return array * @throws \think\Exception */ public function setMarketCoinToDatabase($update = false){ $data = $this->getMarketCoin(); $query = Db::name('coin'); $insertData = []; foreach ($data as $v) { $code = strtoupper($v['code']); $where = ['code' => $code]; $count = $query->where($where)->count(); $arr = array_filter([ 'code' => $code, 'name' => getVar($v, 'name'), 'name_ch' => getVar($v, 'name_ch'), 'name_en' => getVar($v, 'name_en'), 'source_code' => getVar($v, 'source_code'), 'source' => getVar($v, 'source'), 'total_value' => getVar($v, 'total_value'), 'addtime' => time(), ]); if (! $count) { $insertData[] = $arr; } else if ($update) { $query->where($where)->update($arr); } } $insertData && $query->insertAll($insertData); return $data; } /** * 更新行情信息到数据库 * @return array * @throws \think\Exception */ public function setMarketInfoToDatabase(){ $data = $this->getMarketCoin(); $query = Db::name('market_info'); $insertData = []; foreach ($data as $v) { $code = strtoupper($v['code']); $where = ['coin' => $code]; $count = $query->where($where)->count(); $arr = array_filter([ 'coin' => $code, 'market' => strtolower($code) .'_'. 'usdt', 'last_price' => getVar($v, 'price'), 'rate' => getRmbRate(), 'percentchange' => getVar($v, 'percentchange'), 'basevolume' => getVar($v, 'basevolume'), 'addtime' => time(), ]); if (! $count) { $insertData[] = $arr; } else { $query->where($where)->update($arr); } } $insertData && $query->insertAll($insertData); return $data; } public function updateAll($update = false){ $this->setMarketCoinToDatabase($update); $this->setMarketInfoToDatabase(); } } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/87482.html

(0)
上一篇 2024-10-08 18:26
下一篇 2024-10-09 11:45

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信