<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/commentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" >
<channel>
	<title>脚本编程 - 星空博客</title>
	<link>http://www.xklog.org/rss.php?cate=7</link>
	<description>PHP、ASP等脚本研究</description>
	<language>zh-cn</language>
	<copyright>Powered By XKLog V0.7.244.Copyright 2010 星空博客 All Rights Reserved.</copyright>
	<pubDate>Mon, 06 Sep 2010 01:17:31 +0000</pubDate>
	<generator>XKLog V0.7.244</generator>
	
	<item>
		<title><![CDATA[nginx 爆 0day 漏洞，上传图片可入侵服务器]]></title>
		<link>http://www.xklog.org/article/php/nginx-0day-by-80sec.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>国内顶级安全团队80sec于5.20日下午6点发布了一个关于nginx的漏洞通告，由于该漏洞的存在，使用nginx+php组建的网站只要允  许上传图片就可能被黑客入侵，直到5.21日凌晨，nginx尚未发布补丁修复该漏洞。</p>
<p>根据Netcraft的统计，直到2010年4月，全球一共有1300万台服务器运行着nginx程序；非常保守的估计，其中至少有600万台服务  器运行着nginx并启用了php支持；继续保守的估计，其中有1/6，也就是100万台服务器允许用户上传图片。</p>
<p>没错，重申一次，由于nginx有漏洞，这100万台服务器可能通过上传图片的方法被黑客轻易的植入木马。植入木马的过程也非常简单，就是把木马改  成图片上传就是了，由于危害非常大，就不说细节了。有兴趣的请访问 <a href="http://www.80sec.com/nginx-securit.html">http://www.80sec.com/nginx-securit.html</a></p>
<p>说了那么多，我想大家对80sec这个顶级安全团队比较好奇吧，素包子简单介绍一下。</p>
<p>80sec团队由一群年轻、充满活力、充满体力、充满激情、富有创造力的未婚dota男组成，他们均在各大互联网公司从事信息安全工作，他们的口号  是know it then hack   it，素包子非常认同这个观点：&ldquo;我们只要非常熟悉一个事物，就有可能客观的发现它的不足之处，同时我们也能的发现该事物的优点&rdquo;。</p>
<p>80sec的意思是&ldquo;80端口的安全&rdquo;，也就是&ldquo;web安全&rdquo;；同时由于该团队成员都是80后的年轻人，我们也可以理解为&ldquo;80后安全&rdquo;；另外由于  sec的发音是se ke，我们还可以理解为&ldquo;80后色客&rdquo;、&ldquo;80后摄客&rdquo;或&ldquo;80后S客&rdquo;，我们对80sec的理解仅受限于想象力。</p>
<p>下面介绍一下他们的丰功伟绩，他们曾发现IIS、IE、FireFox、Maxthon、世界之窗、PHPWind、DeDeCMS、QQ   mail、QuarkMail、EXTMail等软件的漏洞，可见硕果累累。</p>
<p>既然介绍了80sec，就不得不介绍另外一个非常专注WEB安全的顶级安全团队80vul，该团队同样也是由80后的男童鞋组成（90后表示压力很  大:p），他们也发现了大量WEB APP的安全漏洞，例如IE、Gmail、wordpress、PHPWind、DISCUZ、MYBB等。</p>
<p>看到这里，想必大家心里都有那么点遗憾，那就是为何没有80后女黑客（我不歧视伪娘，但我必须说明不是伪娘），我也有相同的遗憾。</p>
<p>最后发一个小道消息，据说黑客已经在行动了；安全人员、系统管理人员、行动起来吧，赶紧修复该漏洞；最好不要有侥幸心理，否则下一个被黑客入侵的可  能就是你的网站。根据80sec安全公告的描述，临时修复方法如下，可3选其一。</p>
<p>1、设置php.ini的cgi.fix_pathinfo为0，重启php。最方便，但修改设置的影响需要自己评估。</p>
<p>2、给nginx的vhost配置添加如下内容，重启nginx。vhost较少的情况下也很方便。</p>
<p>if ( $fastcgi_script_name ~ \..*\/.*php ) {<br />
return 403;<br />
}</p>
<p>3、禁止上传目录解释PHP程序。不需要动webserver，如果vhost和服务器较多，短期内难度急剧上升；建议在vhost和服务器较少的  情况下采用。</p>
<p>http://baoz.net/nginx-0day-by-80sec/</p>]]></description>
		<category>脚本编程</category>
		<guid>http://www.xklog.org/article/php/nginx-0day-by-80sec.html</guid>
		<pubDate>Fri, 21 May 2010 16:04:27 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[IIS源码泄露及文件类型解析错误]]></title>
		<link>http://www.xklog.org/article/php/iis-cgifastcgi-security-hol.html</link>
		<author>星空泪</author>
		<description><![CDATA[<div class="storycontent">
<p>漏洞介绍：IIS是微软推出的一款webserver，使用较为广泛，在支持asp/asp.net的同时还可以较好的支持PHP等其他语言的 运行。但是80sec发现在IIS的较高版本中存在一个比较严重的安全问题，在按照网络上提供的默认配置情况下可能导致服务器泄露服务器端脚本源码，也可 能错误的将任何类型的文件以PHP的方式进行解析，使得恶意的攻击者可能攻陷支持PHP的IIS服务器，特别是虚拟主机用户可能受的影响较大。</p>
<p><br />
漏洞分析：<br />
IIS支持以CGI的方式运行PHP，但是此种模式下，IIS处理请求的时候可能导致一些同80sec提到的nginx安全漏洞一样的问题，任何用户可以 远程将任何类型的文件以PHP的方式去解析，你可以通过查看Phpinfo中对php的支持方式，其中如果为CGI/FAST-CGI就可能存在这个问 题。</p>
<p>黑盒访问</p>
<p>http://www.80sec.com/robots.txt/1.php</p>
<p><br />
查看文件是否存在和返回的HTTP头就可以知道是否存在此漏洞。</p>
<p>同时，如果服务器支持了PHP，但应用中使用的是asp就可以通过如下方式来直接查看服务端asp源码</p>
<p>http://www.80sec.com/some.asp/1.php</p>
<p>漏洞厂商：http://www.microsoft.com</p>
<p>解决方案：</p>
<p>我们已经尝试联系官方，但是此前你可以通过以下的方式来减少损失<br />
<code><br />
关闭cgi.fix_pathinfo为0<br />
</code></p>
</div>
<p><a title="IIS源码泄露及文件类型解析错误" href="http://www.80sec.com/iis-cgifastcgi-security-hol.html">IIS源码泄露及文件类型解析错误</a>:<a title="IIS源码泄露及文件类型解析错误" href="http://www.80sec.com/iis-cgifastcgi-security-hol.html">http://www.80sec.com/iis-cgifastcgi-security-hol.html</a><a title="IIS源码泄露及文件类型解析错误" href="http://www.80sec.com/iis-cgifastcgi-security-hol.html">security-hol.html</a></p>]]></description>
		<category>脚本编程</category>
		<guid>http://www.xklog.org/article/php/iis-cgifastcgi-security-hol.html</guid>
		<pubDate>Fri, 21 May 2010 16:02:26 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[一个真正的“PHP”模板引擎]]></title>
		<link>http://www.xklog.org/article/php/a-real-PHP-Template-engine.html</link>
		<author>星空泪</author>
		<description><![CDATA[<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;模板引擎</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;Copyright(c)&nbsp;2005-2008&nbsp;by&nbsp;陈毅鑫(深空).&nbsp;All&nbsp;rights&nbsp;reserved</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;To&nbsp;contact&nbsp;the&nbsp;author&nbsp;write&nbsp;to&nbsp;{@link&nbsp;mailto:shenkong@php.net}</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;陈毅鑫(深空)</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;$Id:&nbsp;Template.class.php&nbsp;1687&nbsp;2008-07-07&nbsp;01:16:07Z&nbsp;skchen&nbsp;$</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@package&nbsp;Template</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>defined(<span class="string">'FW'</span><span>)&nbsp;||&nbsp;</span><span class="func">exit</span><span>(header(</span><span class="string">'HTTP/1.0&nbsp;400&nbsp;Bad&nbsp;Request'</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;Template&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="vars">$obj</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="vars">$vars</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="vars">$includeFiles</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="vars">$includeFile</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="vars">$templates</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="vars">$template</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="vars">$contents</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$_content</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$_contents</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$_path</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;__construct()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;vars&nbsp;=&nbsp;</span><span class="keyword">array</span><span>();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">require_once</span><span>&nbsp;ROOT_PATH&nbsp;.&nbsp;</span><span class="string">&quot;lib/template.func.php&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;初始化模板引擎</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;object&nbsp;模板引擎对象</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;&amp;init()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_null</span><span>(self::</span><span class="vars">$obj</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::<span class="vars">$obj</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Template();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;self::</span><span class="vars">$obj</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;注册模板变量</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;注册模板变量后在模板里就可以直接使用该变量,注册与被注册变量名不一定要一样</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;如:$template-&gt;assign('var',&nbsp;$value);</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;意思是将当前变量$value注册成模板变量var,在模板里就可以直接调用$val</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$var&nbsp;注册到模板里的变量名的字符串形式,不包含$</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;mixed&nbsp;$value&nbsp;需要注册的变量</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;assign(</span><span class="vars">$var</span><span>,&nbsp;</span><span class="vars">$value</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_array</span><span>(</span><span class="vars">$var</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$var</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$key</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$val</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;vars[</span><span class="vars">$key</span><span>]&nbsp;=&nbsp;</span><span class="vars">$val</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;vars[</span><span class="vars">$var</span><span>]&nbsp;=&nbsp;</span><span class="vars">$value</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析模板文件</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析模板,并将变量植入模板,解析完后返回字符串结果</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;unknown_type&nbsp;$templates</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;unknown</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;fetch(</span><span class="vars">$templates</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_array</span><span>(</span><span class="vars">$templates</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;templates&nbsp;=&nbsp;</span><span class="vars">$templates</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;templates&nbsp;=&nbsp;func_get_args();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract(<span class="vars">$this</span><span>-&gt;vars);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;_contents&nbsp;=&nbsp;</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;templates&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;template)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob_end_clean();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob_start();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;_path&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;getPath(</span><span class="vars">$this</span><span>-&gt;template);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">require</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;_path;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;_content&nbsp;=&nbsp;ob_get_contents();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob_end_clean();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob_start();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;_contents&nbsp;.=&nbsp;</span><span class="vars">$this</span><span>-&gt;_content;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;contents[</span><span class="vars">$this</span><span>-&gt;template]&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;_content;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;_contents;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;getPath(</span><span class="vars">$path</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$path</span><span>&nbsp;=&nbsp;</span><span class="func">explode</span><span>(</span><span class="string">&quot;.&quot;</span><span>,&nbsp;</span><span class="vars">$path</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$num</span><span>&nbsp;=&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$path</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$num</span><span>&nbsp;==&nbsp;1)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;ROOT_PATH&nbsp;.&nbsp;</span><span class="string">&quot;template&quot;</span><span>&nbsp;.&nbsp;DIRECTORY_SEPARATOR&nbsp;.&nbsp;</span><span class="vars">$path</span><span>[0]&nbsp;.&nbsp;</span><span class="string">&quot;.html&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">elseif</span><span>&nbsp;(</span><span class="vars">$num</span><span>&nbsp;&gt;&nbsp;1)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$templatePath</span><span>&nbsp;=&nbsp;</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$templatePath</span><span>&nbsp;=&nbsp;</span><span class="vars">$path</span><span>[</span><span class="vars">$num</span><span>&nbsp;-&nbsp;1];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">array_pop</span><span>(</span><span class="vars">$path</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$templatePath</span><span>&nbsp;=&nbsp;ROOT_PATH&nbsp;.&nbsp;implode(DIRECTORY_SEPARATOR,&nbsp;</span><span class="vars">$path</span><span>)&nbsp;.&nbsp;DIRECTORY_SEPARATOR&nbsp;.&nbsp;</span><span class="string">'template'</span><span>&nbsp;.&nbsp;DIRECTORY_SEPARATOR&nbsp;.&nbsp;</span><span class="vars">$templatePath</span><span>&nbsp;.&nbsp;</span><span class="string">&quot;.html&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$templatePath</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;false;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;display(</span><span class="vars">$templates</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>())&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!</span><span class="func">is_array</span><span>(</span><span class="vars">$templates</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$templates</span><span>&nbsp;=&nbsp;func_get_args();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$templates</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;templates&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;template)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;contents[</span><span class="vars">$this</span><span>-&gt;template];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;fetch(</span><span class="vars">$templates</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//end&nbsp;of&nbsp;script</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;模板扩充函数</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;Copyright(c)&nbsp;2005&nbsp;by&nbsp;陈毅鑫(深空).&nbsp;All&nbsp;rights&nbsp;reserved</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;To&nbsp;contact&nbsp;the&nbsp;author&nbsp;write&nbsp;to&nbsp;{@link&nbsp;mailto:shenkong@php.net}</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;陈毅鑫(深空)</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;$Id:&nbsp;template.func.php&nbsp;1687&nbsp;2008-07-07&nbsp;01:16:07Z&nbsp;skchen&nbsp;$</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@package&nbsp;Template</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>defined(<span class="string">'FW'</span><span>)&nbsp;||&nbsp;</span><span class="func">exit</span><span>(header(</span><span class="string">'HTTP/1.0&nbsp;400&nbsp;Bad&nbsp;Request'</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;包含模板</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;当你需要在主模板文件里(有些模板引擎称之为layout布局模板,其实不是所有模板都是布局)</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;再包含其他公共模板的时候,使用该函数进行包含,则所有已注册的变量均可在被包含文件里使</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;用,貌似支持多层嵌套,没有测试过,参数可以使用数组,也可以使用多个参数,如:</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;&lt;?=includeFile('user.header',&nbsp;'user.main',&nbsp;'user.footer')?&gt;&nbsp;或者</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;&lt;?=includeFile(array('user.header',&nbsp;'user.main',&nbsp;'user.footer'))?&gt;</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;string|array&nbsp;$filename&nbsp;模板名(module.templateName形式)</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;includeFile(</span><span class="vars">$templates</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$template</span><span>&nbsp;=&nbsp;Template::init();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_array</span><span>(</span><span class="vars">$templates</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$template</span><span>-&gt;includeFiles&nbsp;=&nbsp;</span><span class="vars">$templates</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$template</span><span>-&gt;includeFiles&nbsp;=&nbsp;func_get_args();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;extract(<span class="vars">$template</span><span>-&gt;vars);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$template</span><span>-&gt;includeFiles&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$template</span><span>-&gt;includeFile)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">require</span><span>&nbsp;</span><span class="vars">$template</span><span>-&gt;getPath(</span><span class="vars">$template</span><span>-&gt;includeFile);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//end&nbsp;of&nbsp;script</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>]]></description>
		<category>脚本编程</category>
		<guid>http://www.xklog.org/article/php/a-real-PHP-Template-engine.html</guid>
		<pubDate>Sat, 21 Nov 2009 00:29:22 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[PHP5中的Class/Object函数]]></title>
		<link>http://www.xklog.org/article/php/php5-in-the-class-object-functions.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>class_exists &mdash; 判定一个类是否已经被定义<br />
get_class_methods &mdash; 获取某个类中所有方法的名称<br />
get_class_vars &mdash; 获取一个类中所有的特性<br />
get_class &mdash; 返回一个方法所在的类名<br />
get_declared_classes &mdash; 显示已定义的类的信息<br />
get_declared_interfaces &mdash; 显示已定义的接口的信息<br />
get_object_vars &mdash; 获取一个对象中所有的特性<br />
get_parent_class &mdash; 获取一个类的父类的名称<br />
interface_exists &mdash; 判定一个接口是否存在<br />
is_a &mdash; 判定一个对象是否属于一个类或者是这个类的派生类<br />
is_subclass_of &mdash; 判定一个对象或者类是否是另一个类的子类或者是子类的对象<br />
method_exists &mdash; 判定一个方法是否存在于某个类<br />
property_exists &mdash; 判定一个对象或者方法是否具有某一特性</p>
<p>这个库里面的call_user_method_array()函数和call_user_method()函数是PHP不建议使用的函数，如果要实现此功能，应该使用《PHP中处理函数的函数（Function Handling Functions）》这里的call_user_func_array()函数和call_user_func()函数代替。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>interfacetest_interface &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;publicfunctiontest_method(); &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>classtest_classimplementstest_interface &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>{ &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="vars">$test_value1</span><span>; &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span class="vars">$test_value2</span><span>; &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;functiontest_method() &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>classtest_class2extendstest_class &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>{ &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>method_exists()函数的作用是判定一个方法是否存在于某个对象中，method_exists()函数有两个参数，第一个参数表示对象，第二个参数变数需要判定方法的名称。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span class="vars">$test_object</span><span>=newtest_class; &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>var_dump(method_exists(</span><span class="vars">$test_object</span><span>,</span><span class="string">'test_method'</span><span>));</span><span class="comment">//显示&nbsp;bool(true) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>class_exists()函数的作用是判定一个类是否被定义，class_exists()函数有一个参数，表示类的名称</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>var_dump(</span><span class="func">class_exists</span><span>(</span><span class="string">'test_class'</span><span>));</span><span class="comment">//显示&nbsp;bool(true) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>?&gt; &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>property_exists()函数的作用是判定一个对象或者方法是否存在某一特性，<strong>特性其实就是对象或者类的非私有属性</strong>，property_exists()函数有两个参数，第一个参数可以是一个对象或者类名，第二个参数表示需要判定的特性名称</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>var_dump(property_exists(</span><span class="string">'test_class'</span><span>,</span><span class="string">'test_value1'</span><span>));</span><span class="comment">//显示&nbsp;bool(true) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>var_dump(property_exists(</span><span class="string">'test_class'</span><span>,</span><span class="string">'test_value2'</span><span>));</span><span class="comment">//显示&nbsp;bool(false) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>var_dump(property_exists(newtest_class,</span><span class="string">'test_value1'</span><span>));</span><span class="comment">//显示&nbsp;bool(true) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>var_dump(property_exists(newtest_class,</span><span class="string">'test_value2'</span><span>));</span><span class="comment">//显示&nbsp;bool(false) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>interface_exists()函数的作用是判定一个接口是否存在，interface_exists()函数有一个参数，表示接口的名称。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>var_dump(</span><span class="func">interface_exists</span><span>(</span><span class="string">'test_interface'</span><span>));</span><span class="comment">//显示&nbsp;bool(true) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>is_a()函数的作用是判定一个对象是否属于一个类或者是这个类的派生类，is_a()函数有两个参数，第一个参数表示一个对象，第二个参数表示类的名称。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="vars">$test_object</span><span>=newtest_class2; &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>var_dump(</span><span class="func">is_a</span><span>(</span><span class="vars">$test_object</span><span>,</span><span class="string">'test_class'</span><span>));</span><span class="comment">//显示&nbsp;bool(true) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>var_dump(</span><span class="func">is_a</span><span>(</span><span class="vars">$test_object</span><span>,</span><span class="string">'test_class2'</span><span>));</span><span class="comment">//显示&nbsp;bool(true)</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>is_subclass_of()函数的作用是判定一个对象或者类是否是另一个类的子类或者是子类的对象，is_subclass_of()函数有两个参数，第一个参数表示需要判定的对象或者类名，第二个参数表示一个类名。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="vars">$test_object</span><span>=newtest_class2; &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>var_dump(</span><span class="func">is_subclass_of</span><span>(</span><span class="vars">$test_object</span><span>,</span><span class="string">'test_class'</span><span>));</span><span class="comment">//显示&nbsp;bool(true) </span><span>&nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>var_dump(</span><span class="func">is_subclass_of</span><span>(</span><span class="string">'test_class2'</span><span>,</span><span class="string">'test_class'</span><span>));</span><span class="comment">//显示&nbsp;bool(true)</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>get_class_vars()函数的作用是获取一个类中所有的特性，get_object_vars()函数的作用是获取一个对象中所有的特性，<strong>特性其实就是对象或者类的非私有属性</strong>。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="vars">$test_object</span><span>=newtest_class; &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span class="vars">$class_vars</span><span>=get_object_vars(</span><span class="vars">$test_object</span><span>); &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span>print_r(</span><span class="vars">$class_vars</span><span>); &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span class="comment">/*&nbsp;显示 </span>&nbsp;</li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="comment">Array </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span><span class="comment">( </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;[test_value1]&nbsp;=&gt; </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span><span class="comment">) </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span class="vars">$class_vars</span><span>=get_class_vars(</span><span class="string">'test_class'</span><span>); &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>print_r(</span><span class="vars">$class_vars</span><span>); &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span class="comment">/*&nbsp;显示 </span>&nbsp;</li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span><span class="comment">Array </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="comment">( </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;[test_value1]&nbsp;=&gt; </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span class="comment">) </span>&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>get_parent_class()函数的作用是获取一个类的父类的名称。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span>echoget_parent_class(</span><span class="string">'test_class2'</span><span>); &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span class="comment">//&nbsp;显示&nbsp;test_class</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>get_declared_classes()函数的作用是显示已定义的类的信息，get_declared_interfaces()函数的作用是显示已定义的接口的信息。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">&nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span><span>print_r(get_declared_classes()); &nbsp;&nbsp;</span></span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li><span>print_r(get_declared_interfaces()); &nbsp;&nbsp;</span></li>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <li class="alt"><span class="comment">//&nbsp;显示所有已定义的类和接口的信息</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
		<category>脚本编程</category>
		<guid>http://www.xklog.org/article/php/php5-in-the-class-object-functions.html</guid>
		<pubDate>Mon, 19 Oct 2009 09:08:30 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[PHPWind Forum V7.5 数据结构参考手册]]></title>
		<link>http://www.xklog.org/article/php/PHPWind-Forum-V7-5-Data-Structure.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>PHPWind Forum V7.5 数据结构参考手册</p>
<p><span class="download"><a target="_blank" href="/include/attachment.php?id=11">点击这里下载</a></span></p>]]></description>
		<category>脚本编程</category>
		<guid>http://www.xklog.org/article/php/PHPWind-Forum-V7-5-Data-Structure.html</guid>
		<pubDate>Mon, 28 Sep 2009 21:45:55 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[UCenter 密码算法规则和生成方法]]></title>
		<link>http://www.xklog.org/article/php/UCenter-password-algorithm-and-the-way-to-create.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>　　康盛的系列产品，包括 Discuz、UCHome、Supesite 都集成了统一个用户系统&mdash;&mdash;UCenter，用户登录的密码也保留在 UCenter 中，对于其他系统集成或导出数据到 UCenter系统，通常会碰到密码生成的题目，这里就讨论一下 UCenter 的用户密码算法规则和生成方法。</p>
<p>　　密码通常使用 MD5 对用户密码 HASH 后保留在数据库中的方法，假如黑客拿到了这个 HASH 数值，那么可以采用字典的方式暴力破解，假如这个字典数据库足够大，并且字典比较符合人们的设置习惯的话，那很轻易就能破解常见的密码，因此 UCenter 采用了 salt 来防止这种暴力破解，salt 是一随机字符串，它与口令连接在一起，再用单向函数对其运算，然后将 salt 值各单向函数运算的结果存入数据库中。假如可能的 salt 值的数量足够大的话，它实际上就消除了对常用口令采用的字典式攻击，由于黑客不可能在数据库中存储那么多 salt 和用户密码组合后的 HASH 值。</p>
<p>　　UCenter 的创始人密码是保留在文件中的，打开 uc 下面 /data/config.inc.php 文件，里面的 UC_FOUNDERPW 保留的就是密码，而 UC_FOUNDERSALT 保留的是SALT数值，创始人密码的创建规则是：UC_FOUNDERPW=md5（md5（PASSWORD）.UC_FOUNDERSALT），就是先将密码 MD5，然后添加 salt，然后再次MD5，产生的 HASH 数值保留在 config.inc.php 文件中，因此修改 UC_FOUNDERPW 里面的数值就可以修改 UCenter 的创始人密码。</p>
<p>　　UCenter 的用户信息是保留在 uc_members 表中，在这个表中，每个用户都有一个不同的随机 salt 字段，表中的 password 字段为计算后的密码，密码计算规则是$password=md5（md5（$password）.$salt），也就是将用户的密码 MD5 后，添加 salt，然后再 MD5，保留在 password 字段中。</p>
<p>　　因此，假如进行不同系统的数据转换，可以根据这个原理，将其他系统的用户名和密码计算后，导入 UCenter 的 uc_members 表中，实现用户的迁移。例如，假如原有系统使用的是 md5（password） 这样的算法保留密码，那就通过程序随机生成 salt，然后计算两者累加后的 md5，这样就很轻易计算出这个用户在 UCenter 中的用户密码 HASH 值，从而实现用户的无缝迁移。</p>
<p>　　不外，假如原有系统使用的是 md5（password+salt）的方式保留的密码，那就无法实现密码的平滑迁移 UCenter了，即使迁移，也只能人为将其 UCente r的 password 增加一个 salt 才能使用，因此，我们在平时设计系统用户密码的时候，应该尽量采用 md5（md5（password）+salt）的方式保留密码，这样才能利便的实现和UCenter的接口，并且保证了安全性，通常对于英文用户名来说，自建系统使用 username 来做 salt 是个简便的方法。</p>
<p>　　星空泪无奈地表示：XKLog 采用的是 md5（password+salt）方式，所以想要把用户信息平滑转移到其他系统几乎是不可能的，唯一的办法是重置用户的密码&hellip;&hellip;</p>]]></description>
		<category>脚本编程</category>
		<guid>http://www.xklog.org/article/php/UCenter-password-algorithm-and-the-way-to-create.html</guid>
		<pubDate>Mon, 28 Sep 2009 17:40:45 +0000</pubDate>
	</item>

	</channel>
</rss>