外链论坛

 找回密码
 立即注册
搜索
查看: 14|回复: 0

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

[复制链接]

3057

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108867
发表于 2024-10-5 09:18:04 | 显示全部楼层 |阅读模式

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

倘若要自定义一个能够回调的函数, 能够选取运用变量函数帮忙实现。

<?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(); } }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-5 20:31 , Processed in 0.075664 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.