<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; PHP应用</title>
	<atom:link href="https://www.phppan.com/tag/php%e5%ba%94%e7%94%a8/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 25 Apr 2026 00:56:17 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>用PHP实现MD5算法</title>
		<link>https://www.phppan.com/2012/07/php-md5/</link>
		<comments>https://www.phppan.com/2012/07/php-md5/#comments</comments>
		<pubDate>Mon, 16 Jul 2012 00:48:17 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[MD5]]></category>
		<category><![CDATA[MD5算法]]></category>
		<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1727</guid>
		<description><![CDATA[在上一篇文章 &#60;&#60; Content-MD5字段 &#62;&#62;中我们有提到MD5算法，此处MD5 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>在上一篇文章<a href="http://www.phppan.com/2012/06/apache-source-code-1-content-md5/"> &lt;&lt;  Content-MD5字段  &gt;&gt;</a>中我们有提到MD5算法，此处MD5算法的作用是验证文件的完整性，这与MD5算法开始的应用场景是一致的，即在90年代被广泛使用在各种程序语言中，用以确保资料传递无误。</p>
<p>MD5即Message-Digest Algorithm 5（信息-摘要算法 5）。  MD5算法是一种消息摘要算法，以任意长度的信息作为输入进行计算，产生一个128-bit(16-byte)的指纹或报文摘要(fingerprint or  message  digest)。两个不同的信息产生相同信息摘要的概率相当小，从一个给定的信息摘要逆向生成原始信息的可能性更小。但是由于还是存在碰撞的情况，随着计算机运算能力的提高，MD5已经不太适用于有较高安全要求的场合，但是应对一般的文件完整性检查还是可以的。</p>
<p>MD5算法的标准实现过程可以分为5步。</p>
<p><strong>1、MD5算法是对输入的数据进行补位，使得如果数据位长度LEN对512求余的结果是448。</strong></p>
<p>即数据扩展至K<em>512+448位。即K</em>64+56个字节，K为整数。 具体补位操作：补一个1，然后补0至满足上述要求</p>
<p><strong>2、补数据长度</strong></p>
<p>用一个64位的数字表示数据的原始长度B，把B用两个32位数表示。这时，数据就被填补成长度为512位的倍数。</p>
<p><strong>3. 初始化MD5参数</strong></p>
<p>四个32位整数 (A,B,C,D) 用来计算信息摘要，初始化使用的是十六进制表示的数字</p>
<ul>
<li>A=0X01234567</li>
<li>B=0X89abcdef</li>
<li>C=0Xfedcba98</li>
<li>D=0X76543210</li>
</ul>
<p><strong>4、处理位操作函数</strong></p>
<p>X，Y，Z为32位整数。</p>
<ul>
<li>F(X,Y,Z) = X&amp;Y|NOT(X)&amp;Z</li>
<li>G(X,Y,Z) = X&amp;Z|Y?(Z)</li>
<li>H(X,Y,Z) = X xor Y xor Z</li>
<li>I(X,Y,Z) = Y xor (X|not(Z))</li>
</ul>
<p><strong>5、主要变换过程</strong></p>
<p>使用常数组T[1 ... 64]， T为32位整数用16进制表示，数据用16个32位的整数数组M表示。</p>
<p>具体过程如下：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="shell" style="font-family:monospace;">&nbsp;
 /* 处理数据原文 */ 
&nbsp;
    For i = 0 to N/16-1 do 
&nbsp;
    /*每一次，把数据原文存放在16个元素的数组X中. */ 
    For j = 0 to 15 do 
        Set X[j] to M[i*16+j]. 
    end /结束对J的循环 
&nbsp;
    /* Save A as AA, B as BB, C as CC, and D as DD. */ 
    AA = A 
    BB = B 
    CC = C 
    DD = D 
&nbsp;
    /* 第1轮*/ 
     * 以 [abcd k s i]表示如下操作 
     * a = b + ((a + F(b,c,d) + X[k] + T) s). 
     */ 
&nbsp;
    /* Do the following 16 operations. */ 
&nbsp;
    [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] 
    [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] 
    [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] 
    [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16] 
&nbsp;
    /* 第2轮* */ 
&nbsp;
    /** 以 [abcd k s i]表示如下操作 
     * a = b + ((a + G(b,c,d) + X[k] + T) s).
     */ 
&nbsp;
    /* Do the following 16 operations. */ 
&nbsp;
    [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] 
    [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] 
    [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] 
    [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32] 
&nbsp;
    /* 第3轮*/ 
&nbsp;
    /** 以 [abcd k s i]表示如下操作 
      * a = b + ((a + H(b,c,d) + X[k] + T) s).
      */ 
&nbsp;
    /* Do the following 16 operations. */ 
&nbsp;
    [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] 
    [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] 
    [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] 
    [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48] 
&nbsp;
    /* 第4轮*/ 
&nbsp;
    /** 以 [abcd k s i]表示如下操作 
      * a = b + ((a + I(b,c,d) + X[k] + T) s).
      */ 
&nbsp;
    /* Do the following 16 operations. */ 
&nbsp;
    [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] 
    [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] 
    [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] 
    [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64] 
&nbsp;
    /* 然后进行如下操作 */ 
    A = A + AA 
    B = B + BB 
    C = C + CC 
    D = D + DD 
    end /* 结束对I的循环*</pre></td></tr></table></div>

<h3>用PHP实现MD5算法</h3>
<p>PHP的实现基本按照上面的算法实现，<br />
对于PHP来说，特殊的位置有三点：</p>
<ul>
<li>在于需要规避其在数组中，当数组元素超过整形长度时的自动转换；</li>
<li>无符号右移操作的实现；</li>
<li>将字符串转换成8位存储为一个元素的数据结构。</li>
</ul>
<p>代码如下：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$md5</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #990000;">MD5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$md5</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDigist</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> <span style="color: #990000;">MD5</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">const</span> CHAR_ALIGNMENT <span style="color: #339933;">=</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_digist</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_state</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$bin</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_str2bin<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">CHAR_ALIGNMENT</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$bin</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$len</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">|=</span> <span style="color: #cc66cc;">128</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$bin</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_md5Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_update<span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_digist <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_bin2hex<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 公有方法
     * 获取信息摘要
     * @return string  
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getDigist<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_digist<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _bin2hex<span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$hex_tab</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0123456789abcdef&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$str</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$hex_tab</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0xF</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span>
                    <span style="color: #000088;">$hex_tab</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0xF</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$str</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _update<span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$bin_len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$bin_len</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$block</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">16</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$block</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$bin</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_md5Transform<span style="color: #009900;">&#40;</span><span style="color: #000088;">$block</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$block</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
     <span style="color: #009933; font-style: italic;">/**
       * 初始化
       */</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _md5Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0x67452301</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0xefcdab89</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0x98badcfe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0x10325476</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _md5Transform<span style="color: #009900;">&#40;</span><span style="color: #000088;">$block</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$d</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$x</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$block</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** Round 1 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S11</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xd76aa478</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 1 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S12</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xe8c7b756</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 2 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S13</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x242070db</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 3 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S14</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xc1bdceee</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 4 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S11</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xf57c0faf</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 5 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S12</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x4787c62a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 6 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S13</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xa8304613</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 7 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S14</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xfd469501</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 8 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S11</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x698098d8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 9 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S12</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x8b44f7af</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 10 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S13</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xffff5bb1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 11 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S14</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x895cd7be</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 12 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S11</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x6b901122</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 13 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S12</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xfd987193</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 14 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S13</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xa679438e</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 15 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">FF</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S14</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x49b40821</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 16 */</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** Round 2 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S21</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xf61e2562</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 17 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S22</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xc040b340</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 18 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S23</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x265e5a51</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 19 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S24</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xe9b6c7aa</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 20 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S21</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xd62f105d</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 21 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S22</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x2441453</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 22 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S23</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xd8a1e681</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 23 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S24</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xe7d3fbc8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 24 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S21</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x21e1cde6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 25 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S22</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xc33707d6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 26 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S23</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xf4d50d87</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 27 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S24</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x455a14ed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 28 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S21</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xa9e3e905</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 29 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S22</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xfcefa3f8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 30 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S23</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x676f02d9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 31 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">GG</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S24</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x8d2a4c8a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 32 */</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** Round 3 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S31</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xfffa3942</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 33 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S32</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x8771f681</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 34 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S33</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x6d9d6122</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 35 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S34</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xfde5380c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 36 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S31</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xa4beea44</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 37 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S32</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x4bdecfa9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 38 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S33</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xf6bb4b60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 39 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S34</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xbebfbc70</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 40 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S31</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x289b7ec6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 41 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S32</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xeaa127fa</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 42 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S33</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xd4ef3085</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 43 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S34</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x4881d05</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 44 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S31</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xd9d4d039</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 45 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S32</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xe6db99e5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 46 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S33</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x1fa27cf8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 47 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">HH</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S34</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xc4ac5665</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 48 */</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** Round 4 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S41</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xf4292244</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 49 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S42</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x432aff97</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 50 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S43</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xab9423a7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 51 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S44</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xfc93a039</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 52 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S41</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x655b59c3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 53 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S42</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x8f0ccc92</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 54 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S43</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xffeff47d</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 55 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S44</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x85845dd1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 56 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S41</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x6fa87e4f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 57 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S42</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xfe2ce6e0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 58 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S43</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xa3014314</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 59 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S44</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x4e0811a1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 60 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S41</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xf7537e82</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 61 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S42</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xbd3af235</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 62 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S43</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x2ad7d2bb</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 63 */</span>
        MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">II</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> MD5Tool<span style="color: #339933;">::</span><span style="color: #004000;">S44</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xeb86d391</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* 64 */</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/**
         * 注意，这里必须执行intval函数
         */</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_state<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$d</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _str2bin<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$bin</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$alignment</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">CHAR_ALIGNMENT</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span> <span style="color: #339933;">*</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">CHAR_ALIGNMENT</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">+=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">CHAR_ALIGNMENT</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$bin</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">|=</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">/</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">CHAR_ALIGNMENT</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #000088;">$alignment</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$bin</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> MD5Tool <span style="color: #009900;">&#123;</span>
    <span style="color: #009933; font-style: italic;">/** S11-S44原本是一个 4 * 4 的矩阵，在C实现中是用#define 实现的，
     * 这里作为类的常量表示，在各种对象间共享 
     */</span>
    <span style="color: #000000; font-weight: bold;">const</span> S11 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S12 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S13 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">17</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S14 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">22</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">const</span> S21 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S22 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">9</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S23 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">14</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S24 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">const</span> S31 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S32 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S33 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">16</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S34 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">23</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">const</span> S41 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S42 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S43 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">15</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> S44 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">21</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/** F, G, H ,I 是4个基本的MD5函数，
     * 在C实现中，一般是用宏实现，这里我们以类方法的形式给出 
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> F<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span> <span style="color: #339933;">&amp;</span> <span style="color: #000088;">$y</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>~<span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> G<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span> <span style="color: #339933;">&amp;</span> <span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$y</span> <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span>~<span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> H<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$x</span> ^ <span style="color: #000088;">$y</span> ^ <span style="color: #000088;">$z</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> I<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$y</span> ^ <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span>~<span style="color: #000088;">$z</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 左移N位
     * @param type $x
     * @param type $n
     * @return type 
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> ROTATE_LEFT<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">URShift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * PHP无符号右移
     * @param type $x
     * @param type $bits
     * @return type 
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> URShift<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$bits</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #009933; font-style: italic;">/** 转换成代表二进制数字的字符串 */</span>
        <span style="color: #000088;">$bin</span> <span style="color: #339933;">=</span> <span style="color: #990000;">decbin</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** 字符串长度超出则截取底32位，长度不够，则填充高位为0到32位  */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$bin</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #339933;">,</span> <span style="color: #000088;">$len</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">32</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$bin</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_pad</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">32</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'0'</span><span style="color: #339933;">,</span> STR_PAD_LEFT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** 取出要移动的位数，并在左边填充0  */</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">bindec</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">str_pad</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bin</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">32</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$bits</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">32</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'0'</span><span style="color: #339933;">,</span> STR_PAD_LEFT<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * FF,GG,HH和II将调用F,G,H,I进行近一步变换
     * 其中FF,GG,HH和II分别为四轮转移调用
     * 
     * 注意: 在PHP中，这里使用了引用返回，第一个元素
     * 并且所有的返回值必须执行intval强制转换为整形，否则最终可能会被PHP自动转换
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> FF<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ac</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">+=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">F</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$ac</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ROTATE_LEFT</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> GG<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ac</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">+=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">G</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$ac</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ROTATE_LEFT</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> HH<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ac</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">+=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">H</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$ac</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ROTATE_LEFT</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> II<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$x</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ac</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">+=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">I</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$ac</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ROTATE_LEFT</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>在构造函数中，MD5算法的几个步骤基本一一对应。</p>
<h3>后记</h3>
<p>其实这篇文章并没有多大的实用价值，除非你想用PHP实现一下MD5算法，并了解一下具体的MD5算法，除非你和我一样，有些手贱，除非……</p>
<h3>参考资料</h3>
<ul>
<li>http://zh.wikipedia.org/zh-cn/MD5</li>
<li>http://www.cppblog.com/ant/archive/2007/09/11/31886.html</li>
<li>http://tech.fromeasy.com/bbs/viewthread.php?tid=693</li>
<li>http://pajhome.org.uk/crypt/md5/</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2012/07/php-md5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用PHP计算上一个月的今天</title>
		<link>https://www.phppan.com/2011/06/php-last-month-today/</link>
		<comments>https://www.phppan.com/2011/06/php-last-month-today/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 01:16:15 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP应用]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1404</guid>
		<description><![CDATA[一日，遇到一个问题，求上一个月的今天。 最开始我们使用 strtotime(&#8220;-1 month&# [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em;">一日，遇到一个问题，求上一个月的今天。 最开始我们使用 <strong>strtotime(&#8220;-1 month&#8221;)</strong> 函数求值，发现有一个问题，月长度不一样的月份的计算结果有误。 比如：2011-03-31，得到的结果是2011-03-03。我们先不追究什么问题，先看如何解决问题。 此时，想起PHP中有一个mktime函数，于是自己写了如下代码：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"Y-m-d H:i:s"</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/mktime"><span style="color: #e2392d;">mktime</span></a><span style="color: #ffffff;">(</span><a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"G"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"i"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span>
 <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"s"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"n"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span> <span style="color: #e0882f;">-</span> <span style="color: #1299da;">1</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"j"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"Y"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">当执行时，发现结果和strtotime的结果是一样的。</p>
<p style="text-indent: 2em;">还是基于这个函数，既然无法直接操作月，那么我们从天入手，得到上一个月，然后再使用date拼接数据。如下代码：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #6d9cbe;">$time</span> <span style="color: #e0882f;">=</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/strtotime"><span style="color: #e2392d;">strtotime</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"2011-03-31"</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>

<span style="color: #cccccc; font-style: italic;">/**
 * 计算上一个月的今天
 * @param type $time
 * @return type
 */</span>
<span style="color: #cc7833;">function</span> last_month_today<span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>
     <span style="color: #6d9cbe;">$last_month_time</span> <span style="color: #e0882f;">=</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/mktime"><span style="color: #e2392d;">mktime</span></a><span style="color: #ffffff;">(</span><a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"G"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"i"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span>
                <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"s"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"n"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <span style="color: #e0882f;">-</span> <span style="color: #1299da;">1</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"Y"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
     <span style="color: #ff8400;">return</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"Y-m"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$last_month_time</span><span style="color: #ffffff;">)</span> <span style="color: #e0882f;">.</span> <span style="color: #99ff00;">"-d H:i:s"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span>

<a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> last_month_today<span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">但是此时又有了另一个问题，不存在2011-02-31这样的日期，怎么办？现在的需求是对于这样的日期显示当月最后一天。 如下代码：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"> <span style="color: #6d9cbe;">$time</span> <span style="color: #e0882f;">=</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/strtotime"><span style="color: #e2392d;">strtotime</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"2011-03-31"</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>

<span style="color: #cccccc; font-style: italic;">/**
 * 计算上一个月的今天，如果上个月没有今天，则返回上一个月的最后一天
 * @param type $time
 * @return type
 */</span>
<span style="color: #cc7833;">function</span> last_month_today<span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">{</span>
    <span style="color: #6d9cbe;">$last_month_time</span> <span style="color: #e0882f;">=</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/mktime"><span style="color: #e2392d;">mktime</span></a><span style="color: #ffffff;">(</span><a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"G"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"i"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span>
                <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"s"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"n"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <span style="color: #1299da;">0</span><span style="color: #e0882f;">,</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"Y"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
    <span style="color: #6d9cbe;">$last_month_t</span> <span style="color: #e0882f;">=</span>  <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"t"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$last_month_time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>

    <span style="color: #ff8400;">if</span> <span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$last_month_t</span> <span style="color: #e0882f;">&lt;</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"j"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>
        <span style="color: #ff8400;">return</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"Y-m-t H:i:s"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$last_month_time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
    <span style="color: #ffffff;">}</span>

    <span style="color: #ff8400;">return</span> <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><a style="color: #1299da; text-decoration: none;" href="http://www.php.net/date"><span style="color: #e2392d;">date</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"Y-m"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$last_month_time</span><span style="color: #ffffff;">)</span> <span style="color: #e0882f;">.</span> <span style="color: #99ff00;">"-d"</span><span style="color: #e0882f;">,</span> <span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span>

<a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> last_month_today<span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$time</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">这里需要注意一点： <strong>date(&#8220;Y-m&#8221;, $last_month_time) . &#8220;-d&#8221;</strong>这段代码。在写代码的过程中如果写成了 &#8220;Y-&#8221; . date(&#8220;m&#8221;, $last_month_time) . &#8220;-d&#8221; 则在跨年的时间上有问题。 这点还是在写这篇文章时发现的。</p>
<p style="text-indent: 2em;">除了这种方法，还可以先算出年月日再拼接字符串，这里就是纯粹的字符串操作了。</p>
<p style="text-indent: 2em;">感触：</p>
<ul>
<li>一个月不写代码，会手生。</li>
<li>代码写完后请多次review或重构，即使比较简单的代码。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/06/php-last-month-today/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中的前缀自增(++i) 和后缀自增 (i++)</title>
		<link>https://www.phppan.com/2011/05/pre_inc-and-post_inc-in-php/</link>
		<comments>https://www.phppan.com/2011/05/pre_inc-and-post_inc-in-php/#comments</comments>
		<pubDate>Mon, 16 May 2011 01:28:21 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[自增]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1374</guid>
		<description><![CDATA[当我们学第一门语言时，比如大学课程中的C语言程序设计，也许曾经被前缀自增(++i) 和后缀自增 (i++)纠结 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em;">当我们学第一门语言时，比如大学课程中的C语言程序设计，也许曾经被前缀自增(++i) 和后缀自增 (i++)纠结过。 曾经以为我们懂了：</p>
<ul>
<li>i++ ：先引用后增加，先在i所在的表达式中使用i的当前值，后让i加1</li>
<li>++i ：先增加后引用，让i先加1，然后在i所在的表达式中使用i的新值</li>
</ul>
<p style="text-indent: 2em;">这个表达基本没错，只能说不够精确。在《Expert C Programming》这本书中的附录中，有这样一段说明： ++i表示取i的地址，增加它的内容，然后把值放在寄存器中；i++表示取i的地址，把它的值装入寄存器中，然后增加内存中的i的值。 这里的寄存器存放的就是我们在表达式中使用的值。</p>
<p style="text-indent: 2em;">在PHP中也有++$i和$i++，那么Zend内核是如何实现这两种自增方式的呢？ 看下面一个例子，在不运行这段代码的情况下，你认为会输出什么呢？</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #6d9cbe;">$i</span> <span style="color: #e0882f;">=</span> <span style="color: #1299da;">0</span><span style="color: #e0882f;">;</span>
<span style="color: #6d9cbe;">$i</span> <span style="color: #e0882f;">=</span> <span style="color: #6d9cbe;">$i</span><span style="color: #e0882f;">++;</span>
<a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> <span style="color: #6d9cbe;">$i</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">咱们先不论答案是什么？我们直接从Zend内核查看这种自增操作的实现。</p>
<p style="text-indent: 2em;">使用VLD查看包含了$i++和++$i的PHP代码生成的中间代码：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #6d9cbe;">$i</span> <span style="color: #e0882f;">=</span> <span style="color: #1299da;">0</span><span style="color: #e0882f;">;</span>
<span style="color: #6d9cbe;">$i</span><span style="color: #e0882f;">++;</span>
<span style="color: #e0882f;">++</span><span style="color: #6d9cbe;">$i</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;"><a style="color: #1299da; text-decoration: underline;" href="http://www.phppan.com/2011/05/vld-extension/">使用VLD命令</a>(php -dvld.active=1 -dvld.verbosity=3 t.php)查看详细参数:</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">number of ops:  8
compiled vars:  !0 = $i
line     # *  op                           fetch          ext  return  operands
--------------------------------------------------------------------------------
-
   2     0  &gt;   EXT_STMT                                          RES[  IS_UNUSED  ]         OP1[  IS_UNUSED  ] OP2[  IS_UNUSED  ]
         1      ASSIGN                                                    OP1[IS_CV !0 ] OP2[ ,  IS_CONST (0) 0 ]
   3     2      EXT_STMT                                          RES[  IS_UNUSED  ]         OP1[  IS_UNUSED  ] OP2[  IS_UNUSED  ]
         3      POST_INC                                          RES[  IS_TMP_VAR ~1 ]       OP1[  IS_CV !0 ]
         4      FREE                                                      OP1[IS_TMP_VAR ~1 ]
   4     5      EXT_STMT                                          RES[  IS_UNUSED  ]         OP1[  IS_UNUSED  ] OP2[  IS_UNUSED  ]
         6      PRE_INC                                                   OP1[IS_CV !0 ]
   5     7    &gt; RETURN                                                    OP1[IS_CONST (0) 1 ]

branch: #  0; line:     2-    5; sop:     0; eop:     7
path #1: 0,</pre>
<p style="text-indent: 2em;">从VLD扩展的输出信息可以知道，前缀自增(++$i)对应的opcode为PRE_INC，后缀自增($i++)对应的opcode为POST_INC。 首先我们看前缀自增(++$i)，++$i没有返回值或者说它的返回值为空。 根据中间代码和VLD显示的OP1的参数类型， 我们可以知道++$i的中间代码在执行是最终调用的是Zend/zend_vm_execute.h文件中的ZEND_PRE_INC_SPEC_CV_HANDLER函数。 在ZEND_PRE_INC_SPEC_CV_HANDLER函数中有几个关键点:</p>
<ul>
<li>CV类型变量的获取，它是调用_get_zval_ptr_ptr_cv获取CV类型变量。 这里的CV类型的变量是PHP编译期间的类似于缓存的作用，主要作用是提高某些变量的存储速度。</li>
<li>increment_function函数，不管是实例变量，类变量或者常规的变量，最终都是调用increment_function函数实现变量的增加操作。 在这个函数中，程序会根据变量的类型做出不同的处理，在PHP5.3.1这个版本中，PHP支持IS_LONG、IS_DOUBLE、IS_NULL和IS_STRING四种类型。 如果变量的类型是IS_NULL，程序会将变量的值赋值为1。如果变量类型是字符串，程序会将其转化成整形或浮点型进行计算。</li>
<li>使用RETURN_VALUE_UNUSED宏清除返回结果，这个宏的作用是将result变量的类型设置为EXT_TYPE_UNUSED类型。</li>
</ul>
<p style="text-indent: 2em;">前缀自增(++$i)操作在Zend内核中本质上是操作变量本身，而且在表达式中使用的也是这个变量本身。</p>
<p style="text-indent: 2em;">了解了++$i的实现，我们来看下可能使用得更多的$i++操作的实现。 同样，从中间代码POST_INC和OP1的类型是IS_CV，我们可以在Zend/zend_vm_execute.h文件中找到其实现为ZEND_POST_INC_SPEC_CV_HANDLER。 与前面的ZEND_PRE_INC_SPEC_CV_HANDLER相比，它们都有一个取CV类型变量的过程，也有一个increment_function函数增加变量值的过程， 但是除此之外它多了一个操作，同时也少了一个操作。 它多的一个操作是：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">EX_T<span style="color: #ffffff;">(</span>opline<span style="color: #e0882f;">-&gt;</span>result.<span style="color: #ffffff;">u</span>.<span style="color: #ffffff;">var</span><span style="color: #ffffff;">)</span>.<span style="color: #ffffff;">tmp_var</span> <span style="color: #e0882f;">=</span> <span style="color: #e0882f;">**</span>var_ptr<span style="color: #e0882f;">;</span>
zendi_zval_copy_ctor<span style="color: #ffffff;">(</span>EX_T<span style="color: #ffffff;">(</span>opline<span style="color: #e0882f;">-&gt;</span>result.<span style="color: #ffffff;">u</span>.<span style="color: #ffffff;">var</span><span style="color: #ffffff;">)</span>.<span style="color: #ffffff;">tmp_var</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">这两行代码的作用是初始化返回值到临时变量，并且将原始的$i的值存储在这，这就是我们在前面使用VLD查看生成的中间代码其结果为RES[ IS_TMP_VAR ~1 ]的原因。 在这个初始化完成后，程序会继续执行增加操作，在增加操作完成后，它就结束了，而之前的++$i操作则会将result设置为UNUSED类型，这就是它少的那个操作。</p>
<p style="text-indent: 2em;">后缀自增($i++)在表达式中使用的是存放在临时变量中原先的变量值，而变量本身的值已经增加了。 在PHP中这种变量的分离是通过临时变量+返回值解决。</p>
<p style="text-indent: 2em;">到这里，我们可以回答最开始的问题了，它会输出0。因为在表达式中$i++的返回值是一个临时变量，也就是$i原来的值，也就是0。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/05/pre_inc-and-post_inc-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>数据库抽象层和Doctrine DBAL 源码简单分析</title>
		<link>https://www.phppan.com/2010/12/dbal-source/</link>
		<comments>https://www.phppan.com/2010/12/dbal-source/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 01:08:15 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[DBAL]]></category>
		<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[数据库抽象层]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1205</guid>
		<description><![CDATA[数据库抽象层和Doctrine DBAL 源码简单分析 【概述】 　数据库抽象层，顾名思义，将数据库抽象出来， [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>数据库抽象层和Doctrine DBAL 源码简单分析</p>
<p><strong>【概述】</strong><br />
　数据库抽象层，顾名思义，将数据库抽象出来，作为一个独立的层存在。它存在的作用是当从一个数据库系统向另一个数据库系统迁移时，几乎不用更改太多的程序代码或者只是改一下配置文件，其它的工作都会交给数据库抽象层去做。数据库抽象层会根据使用的数据库自动调整，这样会提高开发效率，但是由于数据库抽象层是在数据库与业务之间增加了一个额外的代码层，从而可能会产生一些性能上的问题。因此，我们在使用一个数据抽象层之前需要按照自己的需求，权衡抽象层带来的性能和效率开销。<br />
<strong>【Doctrine DBAL 简述】</strong><br />
Doctrine DBAL是一个轻量级的类似于PDO的数据库抽象接入层。它是一个面向对象的架构，需求PHP5.3版本的支持，因为它的实现用到了命名空间。除了类似于PDO的操作外，它允许人们定制属于自己的数据库支持。DBAL能够被用于ORM，这在Doctrine ORM项目中有体现。<br />
<strong>【Doctrine DBAL源码综述】</strong><br />
以下是我在阅读完Doctrine DBAL后形成的文字。<br />
整体结构：<br />
<strong>Driver</strong><br />
包括DBAL目录下的Driver.php, DriverManager.php和Driver目录下的所有文件<br />
如果要在DBAL下为一个新的数据库提供支持，在Driver这块需要实现下面的两个接口：<br />
\Doctrine\DBAL\Driver\Driver<br />
\Doctrine\DBAL\Driver\Statement<br />
这两个接口的方法和PDO完全相同。<br />
Driver.php中包含Driver接口，所有的Driver必须实现这个接口。<br />
DriverManager.php是一个工厂类，它会根据不同的driver返回不同的Doctrine\DBAL\Connection实例。当然，它也可以返回我们自定义的Connection类实例。<br />
Driver目录包括各数据库对Driver的实现以及公用的Connection接口，Statement接口等。如果要定制新的数据库支持，我们也需要在这个目录下创建一个新的目录，并在这个目录下实现Connection等接口。<br />
PDOConnection.php文件和PDOStatement.php文件中的类是对于Connection接口及Statement接口的默认实现。</p>
<p>根目录下的Connection类实现了Doctrine\DBAL\Driver\Connection接口，并增加了事件，事务隔离级别，配置，模拟事务嵌套，延迟连接等功能<br />
根目录下的Statement类实现了Doctrine\DBAL\Driver\Statement接口，并增加了日志，DBAL类型映射等功能。<br />
<strong>Platform</strong><br />
Platform抽象了查询生成及不同的数据间的细微的差别。它将会被Schema和Statement等调用。<br />
Platform的实现全部在Platform目录下，它会针对每个数据库支持实现不同的平台支持。它会在通过Driver中的getDatabasePlatform方法创建实例而进行初始化。不同的Driver调用对应的Platform。<br />
<strong>Statement</strong><br />
Statement提供日志及类型的抽象转化功能集成，主要实现在根目录下的Statement.php文件</p>
<p><strong>Schema</strong><br />
Schema抽象了生成表修改SQL的接口，这些修改操作的对象包括表，序列，外键和索引等。<br />
它包括Schema目录下所有文件。<br />
针对索引，表，外链等都有其独立实现，并且对于SchemaManager,各个数据库都有其不同的实现。<br />
<strong>Type</strong><br />
Type抽象了所有数据库的类型，将各数据库的数据类型与DBAL中定义的类型一一对应。在程序调用时针根据选择的数据库映射到对应的类型。<br />
它包括Type目录下的所有文件。所有的类型都继承自Type类。<br />
Type的映射替换操作会在Statement绑定值和绑定参数时进行。<br />
<strong>Log</strong><br />
Logging目录下所有文件<br />
在2.0.0版本中仅包括SQLLogger接口，使用echo/var_dump输出日志的EchoSQLLogger类，包含执行过程中SQL的DebugStack类。<br />
貌似这两个类都还在一个不完善的阶段。</p>
<p><strong>Event</strong><br />
包括：<br />
根目录下的Events.php文件<br />
Event目录下的所有文件<br />
Common目录下的EventArgs.php,EventManager.php,EventSubscriber.php文件<br />
Events.php文件中的Event类是一个final类，它仅仅是一个包含所有事件的容器。在2.0.0版本中仅包含postConnect事件。<br />
EventManager.php中的EventManager类是整个事件机制中非常重要的类，它负责整个事件的注册及事件的执行。对于postContent事件将会在Doctrine\DBAL\Connection的connect()方法中触发。<br />
Event目录下的ConnectionEventArgs类负责与Connection的联系，它类似于一个中转站，在Doctrine\DBAL\Connection创建连接时会创建ConnectionEventArgs类的实例，并将Connection的实例作为构造方法的参数传递给ConnectionEventArgs实例。当事件触发时需要调用平台的数据库操作，则通过这个传递过来的Connection实例执行。Event目录下的Listeners目录是针对各个数据库平台的监听事件实现。</p>
<p><strong>Exception</strong><br />
异常仅有根目录下的DBALException异常类。类中包含了若干静态方法，以显示不同的异常。对于这点，个人认为可以将不同的异常拆分成新的异常类，这比捕获DBALException异常后再调用相关的静态方法的扩展性会好一些。</p>
<p><strong>Cache</strong><br />
缓存，这在每个系统或者每个大型架构中都会存在的模块。<br />
在Common目录下的Cache文件夹包含了所有的缓存操作。这里提供了Apc,Array,Memcache,Xcache四种缓存。</p>
<p><strong>【Doctrine DBAL调用过程】</strong><br />
以初始化一个连接，执行一条查询语句为例：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> \Doctrine\DBAL\Configuration<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$connectionParams</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'dbname'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'mydb'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'user'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'secret'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'host'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'driver'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'pdo_mysql'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$conn</span> <span style="color: #339933;">=</span> DriverManager<span style="color: #339933;">::</span><span style="color: #004000;">getConnection</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$connectionParams</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$statement</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT * FROM user'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$users</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchAll</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>第1~9行，配置并通过一个DriverManager创建一个Connection。这是一个工厂方法，它会依据driver调用不同的Driver类，这里会调用 Doctrine\DBAL\Driver\PDOMySql\Driver类，创建mysql的Driver。它会创建包装器实例，默认情况下是Doctrine\DBAL\Connection，我们可以通过在函数的参数中指定wrapperClass，从而创建自定义的包装器。最后返回一个包装类的实现。<br />
第11行，调用Connection的prepare准备SQL语句，这里它会连接数据库，在连接时会依据Driver的不同，连接不同的数据库，并且会触发定义在connect方法中的Events::postConnect事件。最后，返回一个创建的Statement实例。<br />
第12行，调用Statement的execute方法。在这个方法中会调用Log模块，记录SQL的日志，并且通过包装器中转调用相对应数据库的Statement实例的execute方法。<br />
第13行，取数据。和上面的execute类似，调用对应Satement实例的fetchAll方法返回数据。</p>
<p>&#8211;EOF&#8211;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2010/12/dbal-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中的urlencode，rawurlencode和JS中的encodeURI，encodeURIComponent</title>
		<link>https://www.phppan.com/2010/10/php-urlencode-rawurlencode-js-encodeuri-encodeuricomponent/</link>
		<comments>https://www.phppan.com/2010/10/php-urlencode-rawurlencode-js-encodeuri-encodeuricomponent/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 05:54:00 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP应用]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1074</guid>
		<description><![CDATA[PHP中的urlencode，rawurlencode和JS中的encodeURI，encodeURIComp [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>PHP中的urlencode，rawurlencode和JS中的encodeURI，encodeURIComponent</p>
<p><strong>【PHP中的urlencode和rawurlencode】</strong><br />
urlencode之前有看过其源码实现<a href="http://www.phppan.com/2010/04/php-source-23-urlencode/">PHP 源码阅读笔记二十三 ：urlencode函数</a><br />
二都的区别仅在&#8221; &#8220;空格上，rawurlencode()会把空格编码为%20，而urlencode会把空格编码为+</p>
<p><strong>【JS中的encodeURI和encodeURIComponent】</strong><br />
encodeURI 方法不会对下列字符进行编码：&#8221;:&#8221;、&#8221;/&#8221;、&#8221;;&#8221; 和 &#8220;?&#8221;，而encodeURIComponent会编码这些字符</p>
<p><strong>【urlencode与encodeURI】</strong><br />
首先，我们看下这4种编码方式针对ASCII的127个字符编码后的差别，显示代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * 生成urlencode,rawurlencode,encodeURI,encodeURIComponent的编码结果 2010-10-29 sz
 * @author phppan.p#gmail.com  http://www.phppan.com
 * 哥学社成员（http://www.blog-brother.com/）
 * @package test
 */</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type:text/html;charset=utf-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000cc; font-style: italic;">&lt;&lt;&lt;STYLE
&lt;style type=&quot;text/css&quot;&gt;
    table {
cursor:default;
font-family:Verdana,Helvetica,sans-serif;
font-size:8pt;
}
td {
background:none repeat scroll 0 0 #EFEFEF;
text-align:center;
width:100px;
}
&lt;/style&gt;
STYLE</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;table &gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> _tr<span style="color: #009900;">&#40;</span>_td<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ASCII&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> _td<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;urlenocde&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> _td<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;rawurlencode&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> _td<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;encodeURI&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> _td<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;encodeURIComponent&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">128</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$td</span> <span style="color: #339933;">=</span> _td<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> _td<span style="color: #009900;">&#40;</span><span style="color: #990000;">urlencode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> _td<span style="color: #009900;">&#40;</span><span style="color: #990000;">rawurlencode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$td</span> <span style="color: #339933;">.=</span> _td<span style="color: #009900;">&#40;</span>_encodeURI<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> _td<span style="color: #009900;">&#40;</span>_encodeURIComponent<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> _tr<span style="color: #009900;">&#40;</span><span style="color: #000088;">$td</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;/table&gt;&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>对比urlencode和encodeURI的不同，可以看到#$&#038;+,/:;=?@这些符号编码结果不同，<br />
于是对于需要在PHP中编码后，给js的encodeURI使用的操作可以使用如下函数：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * urlencode适用于js版本 2010-10-29 sz
 * @author phppan.p#gmail.com  http://www.phppan.com
 * 哥学社成员（http://www.blog-brother.com/）
 * @package test
 */</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type:text/html;charset=utf-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> urlencode_js<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$str_len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$new</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$str_len</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;#$&amp;+,/:;=?@&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$new</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ch</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$new</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">urlencode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$new</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$encode_str</span> <span style="color: #339933;">=</span> urlencode_js<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;a汉bc中文 章+aa#$&amp;+,/:;=?@a汉bc中文 章+aa&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000cc; font-style: italic;">&lt;&lt;&lt;HTML
&lt;script type=&quot;text/javascript&quot;&gt;
    document.write(decodeURI(&quot;$encode_str&quot;) + &quot;&lt;br /&gt;&quot;);
 &lt;/script&gt;
HTML</span><span style="color: #339933;">;</span>
<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>【urlencode和urldecode的PHP实现】（折腾一个重复轮子玩）</strong><br />
<strong>以下代码纯属折腾，如有雷同，不胜荣幸</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * urlencode和urldecode的PHP版本 2010-10-29 sz
 * @author phppan.p#gmail.com  http://www.phppan.com
 * 哥学社成员（http://www.blog-brother.com/）
 * @package test
 */</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type:text/html;charset=utf-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;a汉bc中文 章+aa:/;?()'!-.*_~&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * urlencode的PHP实现
 * 纯属折腾 其C实现请参照PHP源码  url.c文件中php_url_encode函数
 * @param &lt;type&gt; $str
 * @return &lt;type&gt;
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> myurlencode<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">' '</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$rs</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'+'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>encodecheck<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$rs</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtoupper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%'</span> <span style="color: #339933;">.</span> <span style="color: #990000;">dechex</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">dechex</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$rs</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ch</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * 判断是否为字符和字线以及_-.
 * 相当于c中的!isalnum(c) &amp;&amp; strchr(&quot;_-.&quot;, c) == NULL（PHP源码）
 * @param &lt;type&gt; $ch
 * @return &lt;type&gt;
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> encodecheck<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$pattern</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/[a-zA-Z0-9_\-\.]/&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pattern</span><span style="color: #339933;">,</span> <span style="color: #990000;">strval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * 判断是否为16进制数
 * @param &lt;type&gt; $ch
 * @return &lt;type&gt;
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> checkhex<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$hexstr</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0123456789ABCDEF&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hexstr</span><span style="color: #339933;">,</span> <span style="color: #990000;">strval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">FALSE</span> ? <span style="color: #009900; font-weight: bold;">FALSE</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * urldecode的PHP实现
 * 纯属折腾
 * @param &lt;type&gt; $str
 * @return &lt;type&gt;
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> myurldecode<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'+'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$rs</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'%'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> checkhex<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> checkhex<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$rs</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">hexdec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$i</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$rs</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ch</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* 测试 */</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">urldecode</span><span style="color: #009900;">&#40;</span>myurlencode<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> myurldecode<span style="color: #009900;">&#40;</span><span style="color: #990000;">urlencode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>以上算是对urlencode和urldecode实现的一次复习吧。</p>
<p>&#8211;EOF&#8211;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2010/10/php-urlencode-rawurlencode-js-encodeuri-encodeuricomponent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP页面仅输出了一部分内容的原因：程序报错</title>
		<link>https://www.phppan.com/2010/07/php-part-program-error/</link>
		<comments>https://www.phppan.com/2010/07/php-part-program-error/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 01:04:31 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[PHP调试]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=831</guid>
		<description><![CDATA[上周，vsgeping跟我讨论一个问题，关于PHP页面在显示时，仅显示了一部分，一开始我以为是缓冲的问题，即内 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>上周，vsgeping跟我讨论一个问题，关于PHP页面在显示时，仅显示了一部分，一开始我以为是缓冲的问题，即内容被写到stdout后，没有输出到浏览器。纠结了许久<br />
然后在周末时，忽然想起前段时间由于json版本的问题也导致了类似情况的出现，于是怀疑是程序在那个点就停止了，或者说是报错了，程序由于关闭了报错，于是就没有了内容。<br />
<strong>有代码，有真相</strong><br />
看如下的一个例子<br />
【PHP报错终止仅显示报错前内容的示例】</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;">错误之前的内容
错误之后的内容</pre></td></tr></table></div>

<p>可以看到程序输出：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;">错误之前的内容
Fatal error<span style="color: #339933;">:</span> Call to undefined <span style="color: #000000; font-weight: bold;">function</span> json<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> in</pre></td></tr></table></div>

<p>上面的程序由于调用了未定义的函数导致报错<br />
如果此时我们去掉error_reporting(E_ALL)<br />
那我们会看到程序仅输出：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;">错误之前的内容</pre></td></tr></table></div>

<p><strong>在此感谢vsgeping</strong></p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2010/07/php-part-program-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>百度招聘的一道题</title>
		<link>https://www.phppan.com/2010/06/baidu-2009/</link>
		<comments>https://www.phppan.com/2010/06/baidu-2009/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 03:52:00 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[PHP面试题]]></category>
		<category><![CDATA[面试题]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=783</guid>
		<description><![CDATA[在烂叶的blog上看到一篇关于百度招聘的一道题 地址：百度招聘的一道试题 有些兴趣，自己实现了下，使用了类蒙地 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>在烂叶的blog上看到一篇关于百度招聘的一道题<br />
地址：<a href=”http://hi.baidu.com/mozhihuidage/blog/item/9d678d2b51ca23f3e7cd4031.html”>百度招聘的一道试题</a></p>
<p>有些兴趣，自己实现了下，使用了类蒙地卡罗方法实现。</p>
<p><strong>【题目】</strong><br />
2009百度实习笔试题<br />
要求用PHP，shell或c完成<br />
输入：N（整数）<br />
输入：数据文件A.txt，不超过6条记录，字符串长度不超过15个字节<br />
文件格式如下：<br />
字符串\t数字\n</p>
<p>说明：<br />
每行为1条记录；字符串中不含有\t。<br />
数字描述的是该字符串的出现概率，小于等于100的整数。<br />
多条记录的出现概率之和为100，如果A.txt不满足该条件，程序则退出；<br />
如果文件格式错误，程序也退出。</p>
<p>要求：<br />
编写一个程序，输入为N（正整数），读入文件A.txt，按照字符串出现概率随机地输出字符串，输出N条记录</p>
<p>例如：<br />
输入文件A.txt<br />
abc20<br />
a30<br />
de50<br />
输入为：10</p>
<p>即 abc有20%的概率输出，a有30%的概率输出，de有50%的概率输出，输出10条记录<br />
以下为一次输出的结果,多次输出的结果可能不相同。<br />
abc<br />
a<br />
de<br />
de<br />
abc<br />
de<br />
a<br />
de<br />
a<br />
de</p>
<p><strong>【算法】</strong><br />
先将数据从文件中取出存放到数组，然后将概率空间分割为所给字符串个数个部分，然后生成N个1-100的随机数，然后看每个随机数落在哪一个区间，就将该区间对应的字符串输出。</p>
<p><strong>【程序】</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;A.txt&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* 数据初始化 读取文件内容，拆分字符串形成数据，
* @param &lt;type&gt; $filename  数据文件名
* @return &lt;type&gt; 如果文件打开错误或文件错误返回FALSE                                                      
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> data_init<span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$lines</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$lines</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$lines</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
       <span style="color: #000088;">$index</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$index</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
       <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
           <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#125;</span>
&nbsp;
       <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #000088;">$index</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> data_init<span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  <span style="color: #666666; font-style: italic;">//  输入文件错误</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Input File Error!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array_sum</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  <span style="color: #666666; font-style: italic;">//  输入数据错误</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Input Data Error!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* 以类蒙地卡罗方法实现 */</span>
<span style="color: #000088;">$map</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$k</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* 概率空间分割 */</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>                                                 
    <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000088;">$map</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$k</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$key</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$k</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* 随机输出 */</span>
<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$count</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$rand_num</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$map</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$rand_num</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>关于蒙特卡洛方法请猛击：<a href=”http://zh.wikipedia.org /zh-cn/蒙地卡羅方法”>蒙特卡洛方法</a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2010/06/baidu-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP5.2.0之前版本使用JSON函数的方法</title>
		<link>https://www.phppan.com/2010/06/php5-2-0-before-json-function-json_decode/</link>
		<comments>https://www.phppan.com/2010/06/php5-2-0-before-json-function-json_decode/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 01:21:25 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP应用]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=775</guid>
		<description><![CDATA[PHP5.2.0之前版本使用JSON函数的方法 我们知道PHP在其版本5.2.0之后才支持 JSON相关函数， [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>PHP5.2.0之前版本使用JSON函数的方法<br />
我们知道PHP在其版本5.2.0之后才支持 JSON相关函数，在此版本之前如果我们要使用JSON函数则需要自己实现<br />
JSON的算法已经有人实现了，其下载地址为：http://pear.php.net/pepr/pepr-proposal-show.php?id=198</p>
<p>但是它是一个类这与我们的使用习惯不同，于是我们需要将它包装下，其代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
* 对象转换成数组 递归函数
* @param &lt;type&gt; $value 需要转换的值                                
* @return &lt;type&gt;
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> object2array<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">is_object</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #b1b100;">return</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000088;">$array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> object2array<span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #b1b100;">return</span> <span style="color: #000088;">$array</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* 替换JSON方法
*/</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;json_encode&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;JSON.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Services_JSON<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #000088;">$json_array</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$json</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #b1b100;">return</span> <span style="color: #000088;">$json_array</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #009933; font-style: italic;">/**
    * 解析JSON数据
    * @param string $json_data 需要解析的JSON数据                                                      
    * @param bool $toarray 是否需要解析成数组                                      
    * @return array 返回解析后的数组
    */</span>
   <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$json_data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$toarray</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Services_JSON<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$json</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$json_data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
       <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$toarray</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//  需要转换成数组</span>
           <span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> object2array<span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#125;</span>
       <span style="color: #b1b100;">return</span> <span style="color: #000088;">$array</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>不过以上的递归实现在效率上有一些慢，它需要遍历这个数组的所有元素，<br />
如果只限于实现二维数组，可以考虑直接使用<strong>循环+类型强制转化</strong>来做<br />
【EOF】</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2010/06/php5-2-0-before-json-function-json_decode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中大整数相乘的2种实现方式</title>
		<link>https://www.phppan.com/2010/05/php-big-number-bcmath-and-array/</link>
		<comments>https://www.phppan.com/2010/05/php-big-number-bcmath-and-array/#comments</comments>
		<pubDate>Sat, 01 May 2010 05:44:25 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[BCMath]]></category>
		<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[大整数相乘]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=667</guid>
		<description><![CDATA[PHP中大整数相乘的2种实现方式 1、【通过调用BCMath实现】 PHP 为任意精度数学计算提供了二进制计算 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>PHP中大整数相乘的2种实现方式<br />
1、【通过调用BCMath实现】<br />
PHP 为任意精度数学计算提供了二进制计算器（Binary Calculator），它支持任意大小和精度的数字，以字符串形式描述。<br />
示例代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?PHP</span>
<span style="color: #000088;">$op_left</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'123456789123456789'</span><span style="color: #339933;">;</span>                                                                                  
<span style="color: #000088;">$op_right</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'123456789123456789'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">bcmul</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$op_left</span><span style="color: #339933;">,</span> <span style="color: #000088;">$op_right</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>2、【通过字符串数组相乘实现】<br />
将乘数和被乘数分别按指定的位数存放到数组中，然后再模拟乘法，将结果加起来，最后在返回的时候针对不够位数的进行补0操作。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?PHP</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DEPTH'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'LEN'</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span>DEPTH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * 格式化数组元素，如果单个元素的值不够LEN的长度，前面补0
 * @param string $input
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> item_format<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$input</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_pad</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #339933;">,</span> LEN<span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #339933;">,</span> STR_PAD_LEFT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * 初始化相乘的字符串，将其转化成数组
 * @param string $input 需要相乘的操作数
 * @return array 已经分好块，并且逆转了的数组
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> init_array<span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$begin_len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">%</span> LEN<span style="color: #339933;">;</span>
    <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$begin_len</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$begin_len</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                                                                         
        <span style="color: #000088;">$input</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #339933;">,</span> <span style="color: #000088;">$begin_len</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #990000;">str_split</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</span><span style="color: #339933;">,</span> LEN<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array_reverse</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009933; font-style: italic;">/**
 * 大整数相乘的数组实现
 * @param string $left_operand  左边的操作数
 * @param string $right_operand 右边的操作数
 * @return string   相乘的结果
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> mul<span style="color: #009900;">&#40;</span><span style="color: #000088;">$left_operand</span><span style="color: #339933;">,</span> <span style="color: #000088;">$right_operand</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$left_operand</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$right_operand</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">/* 初始化相乘的数组 */</span>
    <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> init_array<span style="color: #009900;">&#40;</span><span style="color: #000088;">$left_operand</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> init_array<span style="color: #009900;">&#40;</span><span style="color: #000088;">$right_operand</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$len_a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$len_b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len_a</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len_b</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> DEPTH<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//  进位操作</span>
                <span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$j</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> <span style="color: #990000;">floor</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">/</span> DEPTH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">%=</span> DEPTH<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_reverse</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">array_walk</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'item_format'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">ltrim</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$left_operand</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'123456789123456789'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$right_operand</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'123456789123456789'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> mul<span style="color: #009900;">&#40;</span><span style="color: #000088;">$left_operand</span><span style="color: #339933;">,</span> <span style="color: #000088;">$right_operand</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>EOF</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2010/05/php-big-number-bcmath-and-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中迭代器的简单实现及Yii框架中的迭代器实现</title>
		<link>https://www.phppan.com/2010/04/php-iterator-and-yii-cmapiterator/</link>
		<comments>https://www.phppan.com/2010/04/php-iterator-and-yii-cmapiterator/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 00:54:14 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Iterator]]></category>
		<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[Yii框架]]></category>
		<category><![CDATA[设计模式]]></category>
		<category><![CDATA[迭代器]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=652</guid>
		<description><![CDATA[PHP中迭代器的简单实现及Yii框架中的迭代器实现 在维基百科中我们可以看到其定义如下： 迭代器有时又称光标（ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>PHP中迭代器的简单实现及Yii框架中的迭代器实现<br />
在维基百科中我们可以看到其定义如下：<br />
迭代器有时又称光标（cursor）是程式设计的软件设计模式，可在容器物件（container，例如list或vector）上遍访的接口，设计人员无需关心容器物件的内容。<br />
各种语言实作Iterator的方式皆不尽同，有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中，完美的跟语言整合，我们称之隐式迭代器（implicit iterator），但像是C++语言本身就没有Iterator的特色，但STL仍利用template实作了功能强大的iterator。<br />
Iterator另一方面还可以整合Generator。有些语言将二者视为同一接口，有些语言则将之独立化。<br />
地址：http://zh.wikipedia.org/zh-cn/%E8%BF%AD%E4%BB%A3%E5%99%A8<br />
【Iterator的简单实现】</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
* Iterator模式的简单实现类
*/</span>
<span style="color: #000000; font-weight: bold;">class</span> sample implements Iterator <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_items</span> <span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_items <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_items<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_items<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_items<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">rewind</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_items<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> valid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>                                                                              
        <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/** DEMO */</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sa</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sample<span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$sa</span> <span style="color: #b1b100;">AS</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>在next()方法的实现时有过纠结，一直以为这里需要返回下一个的值，<br />
这是因为一直以为这里的next就是next函数的实现，但是非也<br />
在手册中我们可以看到其定义为<br />
<strong>abstract public void Iterator::next ( void )</strong><br />
其返回值类型为<strong>void</strong><br />
所以这里我们调用next函数就可以了，没有必要返回<br />
另外，以上实现对于如下的数组是存在的问题<br />
$data = array(&#8217;0&#8242; => 11, &#8221; => 22, &#8216;s3&#8242; => 33, 0, 0, &#8221;, false, 0, 1);<br />
运行结果是输出：<br />
0 11<br />
22<br />
s3 33<br />
1 0<br />
2 0<br />
3<br />
false后面的值就没有迭代显示出来了，具体原因还不清楚，留作下回分解<br />
在yii框架中也有实现迭代器，它的实现避免了这个问题。<br />
<br />
【Yii框架中的迭代器实现】<br />
在Yii框架中的我们可以看到其迭代器的实现<br />
在collections目录下的CMapIterator.php文件中，其实现如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> CMapIterator implements Iterator <span style="color: #009900;">&#123;</span>
<span style="color: #009933; font-style: italic;">/**
* @var array the data to be iterated through
*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_d</span><span style="color: #339933;">;</span>
<span style="color: #009933; font-style: italic;">/**
* @var array list of keys in the map
*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_keys</span><span style="color: #339933;">;</span>
<span style="color: #009933; font-style: italic;">/**
* @var mixed current key
*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_key</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Constructor.
* @param array the data to be iterated through
*/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_d<span style="color: #339933;">=&amp;</span><span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #339933;">=</span><span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Rewinds internal array pointer.
* This method is required by the interface Iterator.
*/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">rewind</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>                                                                                 
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_key<span style="color: #339933;">=</span><span style="color: #990000;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Returns the key of the current array element.
* This method is required by the interface Iterator.
* @return mixed the key of the current array element
*/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_key<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Returns the current array element.
* This method is required by the interface Iterator.
* @return mixed the current array element
*/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_d<span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_key<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Moves the internal pointer to the next array element.
* This method is required by the interface Iterator.
*/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_key<span style="color: #339933;">=</span><span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Returns whether there is an element at current position.
* This method is required by the interface Iterator.
* @return boolean
*/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> valid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_key<span style="color: #339933;">!==</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'s1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'s2'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">22</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'s3'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">33</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$it</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CMapIterator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$it</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这与之前的简单实现相比，其位置的变化是通过控制key来实现的，这种实现的作用是为了避免false作为数组值时无法迭代</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2010/04/php-iterator-and-yii-cmapiterator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
