运用变量函数声明和应用回调函数
倘若要自定义一个能够回调的函数, 能够选取运用变量函数帮忙实现。 <?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 需要传递一个字符串做为参数
@paramstring $msg2 需要传递另一个字符串做为参数
*/
function fun($msg1, $msg2) {
echo $msg1 = .$msg1;
echo <br>;
echo $msg2 = .$msg2;
}
/** 经过系统函数call_user_func_array() 调用函数fun()
第1个参数为函数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
@paramint $num 需要一个整数做为参数
*/
function one($num) {
return $num%3 == 0;
}
/** 声明一个函数two, 倘若参数是一个回文数(翻转后还等于自己的数)返回true, 否则返回false
@paramint $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(),
回调类中的成员办法:第一个参数必须运用数组,并且这个数组需要指定两个元素,
第1个元素为类名叫作字符串,第二个元素则是该类中的静态办法名叫作字符串。
第二个参数亦是一个数组,这个数组中每一个元素值会按次序传递给调用Demo类中的fun()办法参数列表中。
*/
call_user_func_array( array("Demo", fun), array(LAMP, 兄弟连) );
/** 经过系统函数call_user_func_array()调用Test类的实例对象中的成员办法fun(),
回调类中的成员办法:第1个参数必须运用数组,并且这个数组需要指定两个元素,
第1个元素为对象引用,在本例亦能够是$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;
}
/**
* 更新币种到数据库
* @parambool $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;
}
/**
* 更新行情信息到数据库
* @returnarray
*@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();
}
}
|