﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-silvermyth-文章分类-Php</title><link>http://www.blogjava.net/silvermyth/category/55187.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 22 Apr 2017 06:59:32 GMT</lastBuildDate><pubDate>Sat, 22 Apr 2017 06:59:32 GMT</pubDate><ttl>60</ttl><item><title>Php 5.5中闭包和回调函数的使用注意事项</title><link>http://www.blogjava.net/silvermyth/articles/432450.html</link><dc:creator>Gavin Li</dc:creator><author>Gavin Li</author><pubDate>Thu, 13 Apr 2017 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/silvermyth/articles/432450.html</guid><wfw:comment>http://www.blogjava.net/silvermyth/comments/432450.html</wfw:comment><comments>http://www.blogjava.net/silvermyth/articles/432450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/silvermyth/comments/commentRss/432450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/silvermyth/services/trackbacks/432450.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp;近日在项目开发过程中，遇到了在php中使用闭包和回调函数的情况，先看代码：
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;filterAlarmNodes()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$category</span>&nbsp;=&nbsp;<span style="color: #800080; ">$this</span>-&gt;params["url"]['category'];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$nodesInfo</span>&nbsp;=&nbsp;<span style="color: #800080; ">$this</span>-&gt;_getHostsInfo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$clusterName</span>&nbsp;=&nbsp;<span style="color: #800080; ">$this</span>-&gt;Cluster-&gt;getClusterName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$clusterView</span>&nbsp;=&nbsp;<span style="color: #800080; ">$this</span>-&gt;health-&gt;clusterView(<span style="color: #800080; ">$nodesInfo</span>,&nbsp;<span style="color: #800080; ">$clusterName</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$all_hosts</span>&nbsp;=&nbsp;<span style="color: #800080; ">$this</span>-&gt;machines-&gt;getAllDisplayNames();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">var_dump($clusterView);</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$data</span>&nbsp;=&nbsp;<span style="color: #0000FF; ">array</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">foreach</span>&nbsp;(<span style="color: #800080; ">$clusterView</span>&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;<span style="color: #800080; ">$key</span>&nbsp;=&gt;&nbsp;<span style="color: #800080; ">$entry</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!<span style="color: #008080; ">preg_match</span>('/[0-9\.]/',&nbsp;<span style="color: #800080; ">$key</span>))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$_this</span>&nbsp;=&nbsp;<span style="color: #800080; ">$this</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$callback</span>&nbsp;=&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(<span style="color: #800080; ">$category</span>,&nbsp;<span style="color: #800080; ">$key</span>,&nbsp;<span style="color: #800080;">$entry</span>)&nbsp;<span style="color: #0000FF; ">use</span>(<span style="color: #800080; ">$_this</span>){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #008080; ">call_user_func</span>(<span style="color: #0000FF; ">array</span>(<span style="color: #800080; ">$_this</span>,&nbsp;'_filterNodes'),&nbsp;<span style="color: #800080; ">$category</span>,&nbsp;<span style="color: #800080; ">$key</span>,&nbsp;<span style="color: #800080; ">$entry</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((<span style="color: #800080; ">$desc</span>&nbsp;=&nbsp;<span style="color: #800080; ">$callback</span>(<span style="color: #800080; ">$category</span>,&nbsp;<span style="color: #800080; ">$key</span>,&nbsp;<span style="color: #800080; ">$entry</span>))&nbsp;!=&nbsp;<span style="color: #0000FF; ">false</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$data</span>[]&nbsp;=&nbsp;<span style="color: #0000FF; ">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'nodename'&nbsp;=&gt;&nbsp;<span style="color: #800080; ">$all_hosts</span>[<span style="color: #800080; ">$this</span>-&gt;machines-&gt;getHostByIP(<span style="color: #800080; ">$key</span>)]['dispname'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ip'&nbsp;=&gt;&nbsp;<span style="color: #800080; ">$key</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'desc'&nbsp;=&gt;&nbsp;<span style="color: #800080; ">$desc</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080; ">$info</span>&nbsp;=&nbsp;<span style="color: #0000FF; ">array</span>('code'&nbsp;=&gt;&nbsp;'success',&nbsp;'data'&nbsp;=&gt;&nbsp;<span style="color: #800080; ">$data</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #800080; ">$this</span>-&gt;_jsonView(<span style="color: #800080; ">$info</span>);<br />
}<br />
</div>
&nbsp; &nbsp; 该方法主要用来筛选集群中警告状态的节点，根据传入的参数category，返回不同的结果集，例如CPU温度过高的，CPU利用率过高的等等；由于每个category采用的筛选算法不同，因此定义了一个callback方法，该方法调用$this的_filterNodes方法根据category继续进行方法分派。定义callback屏蔽了不同筛选方法的差异，外部调用接口始终一致。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;_filterNodes(<span style="color: #800080; ">$category</span>,&nbsp;<span style="color: #800080; ">$key</span>,&nbsp;<span style="color: #800080; ">$entry</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>&nbsp;(<span style="color: #800080; ">$category</span>){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;"cpu_temp_alarm":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #800080; ">$this</span>-&gt;_filterNodesForCpuTemp(<span style="color: #800080; ">$key</span>,&nbsp;<span style="color: #800080; ">$entry</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;"cpu_usage_alarm":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #800080; ">$this</span>-&gt;_filterNodesForCpuUsage(<span style="color: #800080; ">$key</span>,&nbsp;<span style="color: #800080; ">$entry</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; background-color: #eeeeee;">_filterNodesForCpuTemp方法很简单，根据当前节点采集的各个meter的值(包含在$entry中)，返回该节点是否需要包含在筛选结果集中（false为不包含）。在闭包和callback使用中，有两个地方需要注意：<br /><ul><li>&nbsp; &nbsp; _filterNodes不能定义为private，否则回报错。</li><li>&nbsp; &nbsp; $this不能直接先use($this)，然后在回调中使用(php会报错)；需要先把$this赋值给一个变量(本例中是$_this)，然后再use($_this)，然后在回调方法中使用</li></ul></span><img src ="http://www.blogjava.net/silvermyth/aggbug/432450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/silvermyth/" target="_blank">Gavin Li</a> 2017-04-13 18:01 <a href="http://www.blogjava.net/silvermyth/articles/432450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>