<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>戒烟如你-&amp;gt;胡兵</title>
		<link>http://www.lakeice.com/</link>
		<description>也许过去我不是一个好孩子，但现在我要做个好爸爸......</description>
		<copyright>Powered by SaBlog-X. Copyright (C) 2003-2010.</copyright>
		<generator>SaBlog-X Version 2.0 Build 20100301</generator>
		<lastBuildDate>Wed, 08 Feb 2012 09:30:54 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=27</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=27</guid>
			<title>PHP SMTP 类（Part 4，内部函数之 get_lines ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里是PHP SMTP类的最后一个函数了， <strong>get_lines</strong> ( ) 是一个私有函数，用于接收SMTP服务器返回的数据，获得服务器状态码。</p>
<p>
	　　string <strong>get_lines</strong> ( )</p>
<pre class="brush:php;">
/**
 * Read in as many lines as possible
 * either before eof or socket timeout occurs on the operation.
 * With SMTP we can tell if we have more lines to read if the
 * 4th character is &#39;-&#39; symbol. If it is a space then we don&#39;t
 * need to read anything else.
 * @access private
 * @return string
 */
function get_lines() {
    $data = &quot;&quot;;
    while($str = @fgets($this-&gt;smtp_conn,515)) {
        if($this-&gt;do_debug &gt;= 4) {
            echo &quot;-------------------&quot; .
            $this-&gt;CRLF;
            echo &quot;SMTP -&gt; get_lines(): \$data was \&quot;$data\&quot;&quot; .
            $this-&gt;CRLF;
            echo &quot;SMTP -&gt; get_lines(): \$str is \&quot;$str\&quot;&quot; .
            $this-&gt;CRLF;
        }
        $data .= $str;
        if($this-&gt;do_debug &gt;= 4) {
            echo &quot;SMTP -&gt; get_lines(): \$data is \&quot;$data\&quot;&quot; . $this-&gt;CRLF;
        }
        // if the 4th character is a space then we are done reading
        // so just break the loop
        if(substr($str,3,1) == &quot; &quot;) { break; }
    }
    return $data;
}</pre>
<p>
	　　如果服务器返回的数据是以三位状态码开头，接着一个空格的格式，该函数只返回第一行。</p>
<p>
	　　至此，这个PHP SMTP类就分析完了，它完整地实现了SMTP协议的功能，除了 TURN 命令之外。所有输入的内容都必须符合 RFC 821 协议，这就需要使用者在调用函数之前对数据进行符合协议的格式化。</p>
<p>
	　　然而，戒烟如你只需要使用SMTP邮件功能，显然这个类有点复杂了，暂时记录在这里，以后再用吧。</p>
<p>
	　　另外，附加一个 RFC 821 协议的中文文本：<a href="http://www.lakeice.com/attachment.php?id=11" title="rfc821.txt&#13;&#13;大小:45.84 K, 下载次数:7" target="_blank">rfc821.txt</a> ，备查。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=27</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Sun, 12 Jul 2009 12:04:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=26</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=26</guid>
			<title>PHP SMTP 类（Part 3.6，SMTP命令函数之 Turn ( ) &amp; Verify ( ) ）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里是PHP SMTP类中SMTP命令函数的最后两个， <strong>Turn</strong> ( ) 和 <strong>Verify</strong> ( )。</p>
<p>
	<strong>　　Turn</strong> ( ) 在这个类里实际上是不支持的，使用它只会返回一个错误，该函数定义在这里只是为了体现这是一个完整的SMTP类。</p>
<pre class="brush:php;">
/**
 * This is an optional command for SMTP that this class does not
 * support. This method is here to make the RFC821 Definition
 * complete for this class and __may__ be implimented in the future
 *
 * Implements from rfc 821: TURN &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE FAILURE: 502
 * SMTP CODE ERROR  : 500, 503
 * @access public
 * @return bool
 */
function Turn() {
    $this-&gt;error = array(&quot;error&quot; =&gt; &quot;This method, TURN, of the SMTP &quot;.
    &quot;is not implemented&quot;);
    if($this-&gt;do_debug &gt;= 1) {
        echo &quot;SMTP -&gt; NOTICE: &quot; . $this-&gt;error[&quot;error&quot;] . $this-&gt;CRLF;
    }
    return false;
}</pre>
<p>
	　　string | bool <strong>Verify</strong> ( string <em>$name</em> )　该函数用于验证给定的用户名 <em>$name</em> 是否为SMTP服务器的用户，如果是，则返回服务器应答的信息，否则返回 <strong>false</strong> 。</p>
<pre class="brush:php;">
/**
 * Verifies that the name is recognized by the server.
 * Returns false if the name could not be verified otherwise
 * the response from the server is returned.
 *
 * Implements rfc 821: VRFY &lt;SP&gt; &lt;string&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250,251
 * SMTP CODE FAILURE: 550,551,553
 * SMTP CODE ERROR  : 500,501,502,421
 * @access public
 * @return int
 */
function Verify($name) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Verify() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;VRFY &quot; . $name . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250 &amp;&amp; $code != 251) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;VRFY failed on name &#39;$name&#39;&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return $rply;
}</pre>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=26</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Sat, 04 Jul 2009 13:48:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=25</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=25</guid>
			<title>PHP SMTP 类（Part 3.5，SMTP命令函数之 Send ( ) &amp; SendAndMail ( ) &amp; SendOrMail ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里介绍PHP SMTP类中的 <strong>Send</strong> ( ) 、 <strong>SendAndMail</strong> ( ) 、 <strong>SendOrMail</strong> ( ) 三个函数，对应SMTP协议中的 <strong>SEND</strong> 、 <strong>SAML</strong> 、 <strong>SOML</strong> 三个命令。</p>
<p>
	<strong>　　Send</strong> ( ) 用于开始一个发送命令，将邮件发送到一个或多个终端上。</p>
<p>
	<strong>　　SendAndMail</strong> ( ) 用于开始一个邮件操作将邮件内容传送到一个或多个终端上，<u><strong>并</strong></u>传送到邮箱中。</p>
<p>
	<strong>　　SendOrMail</strong> ( ) 用于开始一个邮件操作将邮件内容传送到一个或多个终端上，<u><strong>或者</strong></u>传送到邮箱中。</p>
<p>
	　　三个函数传入的参数都是 string <em>$from</em> ，标识回复路径，执行成功返回的标识码都是 <strong>250</strong> 。</p>
<p>
	　　bool <strong>Send</strong> ( string <em>$from</em> )</p>
<pre class="brush:php;">
/**
 * Starts a mail transaction from the email address specified in
 * $from. Returns true if successful or false otherwise. If True
 * the mail transaction is started and then one or more Recipient
 * commands may be called followed by a Data command. This command
 * will send the message to the users terminal if they are logged
 * in.
 *
 * Implements rfc 821: SEND &lt;SP&gt; FROM:&lt;reverse-path&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE SUCCESS: 552,451,452
 * SMTP CODE SUCCESS: 500,501,502,421
 * @access public
 * @return bool
 */
function Send($from) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Send() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;SEND FROM:&quot; . $from . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;SEND not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return true;
}</pre>
<p>
	　　bool <strong>SendAndMail</strong> ( string <em>$from</em> )</p>
<pre class="brush:php;">
/**
 * Starts a mail transaction from the email address specified in
 * $from. Returns true if successful or false otherwise. If True
 * the mail transaction is started and then one or more Recipient
 * commands may be called followed by a Data command. This command
 * will send the message to the users terminal if they are logged
 * in and send them an email.
 *
 * Implements rfc 821: SAML &lt;SP&gt; FROM:&lt;reverse-path&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE SUCCESS: 552,451,452
 * SMTP CODE SUCCESS: 500,501,502,421
 * @access public
 * @return bool
 */
function SendAndMail($from) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called SendAndMail() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;SAML FROM:&quot; . $from . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;SAML not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return true;
}</pre>
<p>
	　　bool <strong>SendOrMail</strong> ( string <em>$from</em> )</p>
<pre class="brush:php;">
/**
 * Starts a mail transaction from the email address specified in
 * $from. Returns true if successful or false otherwise. If True
 * the mail transaction is started and then one or more Recipient
 * commands may be called followed by a Data command. This command
 * will send the message to the users terminal if they are logged
 * in or mail it to them if they are not.
 *
 * Implements rfc 821: SOML &lt;SP&gt; FROM:&lt;reverse-path&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE SUCCESS: 552,451,452
 * SMTP CODE SUCCESS: 500,501,502,421
 * @access public
 * @return bool
 */
function SendOrMail($from) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called SendOrMail() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;SOML FROM:&quot; . $from . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;SOML not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return true;
}</pre>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=25</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Sun, 28 Jun 2009 15:52:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=24</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=24</guid>
			<title>PHP SMTP 类（Part 3.4，SMTP命令函数之 Quit ( ) &amp; Recipient ( ) &amp; Reset ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里介绍PHP SMTP类中的 <strong>Quit</strong> ( ) 、 <strong>Recipient</strong> ( ) 、 <strong>Reset</strong> ( ) 三个函数， <strong>Quit</strong> ( ) 用于终止当前会话， <strong>Recipient</strong> ( ) 用于发送一个收件人， <strong>Reset</strong> ( ) 用于重置会话，取消当前传输。</p>
<p>
	　　这三个函数都不复杂，发送相应的SMTP命令，接受返回的代码，如果是失败代码，将错误信息设置到 <em>$error</em> 中，返回 <strong>false</strong> ，否则返回 <strong>true</strong> 。</p>
<p>
	　　bool <strong>Quit</strong> ( bool <em>$close_on_error = true</em> )</p>
<p>
	　　这里传入的参数 <em>$close_on_error</em> 如果为 <strong>true</strong> ，即使发送 <strong>QUIT</strong> 命令返回失败，也调用 <strong>Close</strong> ( ) 断开与SMTP服务器的连接；如果为 <strong>false</strong> ，<strong>QUIT</strong> 命令成功则调用 <strong>Close</strong> ( ) 断开连接，失败则返回错误信息，不断开连接。</p>
<pre class="brush:php;">
/**
 * Sends the quit command to the server and then closes the socket
 * if there is no error or the $close_on_error argument is true.
 *
 * Implements from rfc 821: QUIT &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 221
 * SMTP CODE ERROR  : 500
 * @access public
 * @return bool
 */
function Quit($close_on_error=true) {
    $this-&gt;error = null; // so there is no confusion

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Quit() without being connected&quot;);
        return false;
    }

    // send the quit command to the server
    fputs($this-&gt;smtp_conn,&quot;quit&quot; . $this-&gt;CRLF);

    // get any good-bye messages
    $byemsg = $this-&gt;get_lines();

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $byemsg;
    }

    $rval = true;
    $e = null;

    $code = substr($byemsg,0,3);
    if($code != 221) {
        // use e as a tmp var cause Close will overwrite $this-&gt;error
        $e = array(&quot;error&quot; =&gt; &quot;SMTP server rejected quit command&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_rply&quot; =&gt; substr($byemsg,4));
        $rval = false;
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $e[&quot;error&quot;] . &quot;: &quot; .
            $byemsg . $this-&gt;CRLF;
        }
    }

    if(empty($e) || $close_on_error) {
        $this-&gt;Close();
    }

    return $rval;
}</pre>
<p>
	　　bool <strong>Recipient</strong> ( string <em>$to</em> )　把收件人 <em>$to</em> 用 <strong>RCPT &lt;SP&gt; TO</strong> 命令发送到SMTP服务器。</p>
<pre class="brush:php;">
/**
 * Sends the command RCPT to the SMTP server with the TO: argument of $to.
 * Returns true if the recipient was accepted false if it was rejected.
 *
 * Implements from rfc 821: RCPT &lt;SP&gt; TO:&lt;forward-path&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250,251
 * SMTP CODE FAILURE: 550,551,552,553,450,451,452
 * SMTP CODE ERROR  : 500,501,503,421
 * @access public
 * @return bool
 */
function Recipient($to) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Recipient() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;RCPT TO:&lt;&quot; . $to . &quot;&gt;&quot; . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250 &amp;&amp; $code != 251) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;RCPT not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return true;
}</pre>
<p>
	　　bool <strong>Reset</strong> ( )　发送 RSET 命令中止当前连接的传输，重置会话。</p>
<pre class="brush:php;">
/**
 * Sends the RSET command to abort and transaction that is
 * currently in progress. Returns true if successful false
 * otherwise.
 *
 * Implements rfc 821: RSET &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE ERROR  : 500,501,504,421
 * @access public
 * @return bool
 */
function Reset() {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Reset() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;RSET&quot; . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;RSET failed&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    return true;
}</pre>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=24</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Sat, 20 Jun 2009 10:33:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=23</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=23</guid>
			<title>PHP SMTP 类（Part 3.3，SMTP命令函数之 Help ( ) &amp; Mail ( ) &amp; Noop ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里介绍PHP SMTP类中的 <strong>Help</strong> ( ) 、 <strong>Mail</strong> ( ) 、 <strong>Noop</strong> ( ) 三个函数， <strong>Help</strong> ( ) 用于查询服务器支持什么命令，返回命令中的信息； <strong>Mail</strong> ( ) 用于在SMTP服务器上初始化一个邮件会话； <strong>Noop</strong> ( ) 用于保持服务器连接。</p>
<p>
	　　bool | string <strong>Help</strong> ( <em>$keyword = &quot;&quot;</em> )</p>
<p>
	　　如果定义了 <em>$keyword</em> ，则获取该命令的帮助信息；如果没有定义，则返回通用帮助，通常包含一个支持的命令列表。该函数将结果返回给用户，由用户自行处理返回的数据。如果有错误发生（即SMTP服务器返回的状态码不是 <strong>211</strong> 或 <strong>214</strong> ），则将错误信息返回到 <em>$error</em> 中。</p>
<pre class="brush:php;">
/**
 * Gets help information on the keyword specified. If the keyword
 * is not specified then returns generic help, ussually contianing
 * A list of keywords that help is available on. This function
 * returns the results back to the user. It is up to the user to
 * handle the returned data. If an error occurs then false is
 * returned with $this-&gt;error set appropiately.
 *
 * Implements rfc 821: HELP [ &lt;SP&gt; &lt;string&gt; ] &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 211,214
 * SMTP CODE ERROR  : 500,501,502,504,421
 * @access public
 * @return string
 */
function Help($keyword=&quot;&quot;) {
    $this-&gt;error = null; // to avoid confusion

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Help() without being connected&quot;);
        return false;
    }

    $extra = &quot;&quot;;
    if(!empty($keyword)) {
        $extra = &quot; &quot; . $keyword;
    }

    fputs($this-&gt;smtp_conn,&quot;HELP&quot; . $extra . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 211 &amp;&amp; $code != 214) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;HELP not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    return $rply;
}</pre>
<p>
	　　bool <strong>Mail</strong> ( string <em>$from</em> )</p>
<p>
	　　以指定的邮件地址 <em>$from</em> 开始一个邮件会话，成功返回 <strong>true</strong> ，失败则返回 <strong>false</strong> 。如果返回 <strong>true</strong> ，邮件会话建立成功，就可以发送一个或多个收件人命令，继而是 <strong>DATA</strong> 命令。</p>
<p>
	　　在 RFC 821 中，该命令为： <strong>MAIL &lt;SP&gt; FROM: &lt;reverse-path&gt; &lt;CRLF&gt;</strong></p>
<pre class="brush:php;">
/**
 * Starts a mail transaction from the email address specified in
 * $from. Returns true if successful or false otherwise. If True
 * the mail transaction is started and then one or more Recipient
 * commands may be called followed by a Data command.
 *
 * Implements rfc 821: MAIL &lt;SP&gt; FROM:&lt;reverse-path&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE SUCCESS: 552,451,452
 * SMTP CODE SUCCESS: 500,501,421
 * @access public
 * @return bool
 */
function Mail($from) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Mail() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;MAIL FROM:&lt;&quot; . $from . &quot;&gt;&quot; . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;MAIL not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return true;
}</pre>
<p>
	　　首先重置 <em>$error</em> 为空，调用 <strong>connected</strong> ( ) 函数检查是否已经与SMTP服务器建立连接，如果没有建立，设置 <em>$error</em> 为&ldquo;<strong>Called Mail() without being connected</strong>&rdquo;，并返回 <strong>false</strong> 。</p>
<p>
	　　如果SMTP服务器对 <strong>MAIL</strong> 命令返回的状态码不是 250 ，则将 <em>$error</em> 设置为&ldquo;<strong>MAIL not accepted from server</strong>&rdquo;，并返回 <strong>false</strong> ；否则返回 <strong>true</strong> 。</p>
<p>
	　　bool <strong>Noop</strong> ( )　这个函数很简单了，就是发送 <strong>NOOP</strong> 命令给SMTP服务器，告诉它目前没有任何操作。代码如下：</p>
<pre class="brush:php;">
/**
 * Sends the command NOOP to the SMTP server.
 *
 * Implements from rfc 821: NOOP &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE ERROR  : 500, 421
 * @access public
 * @return bool
 */
function Noop() {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Noop() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;NOOP&quot; . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;NOOP not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return true;
}</pre>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=23</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Mon, 15 Jun 2009 21:54:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=22</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=22</guid>
			<title>PHP SMTP 类（Part 3.2，SMTP命令函数之 Expand ( ) &amp; Hello ( ) &amp; SendHello ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里先介绍一个并不常用的PHP SMTP函数： <strong>Expand</strong> ( ) ，用于验证给定的邮箱列表是否存在，然后是一个必备的函数了：<strong>Hello</strong> ( ) ，用于向服务器标识用户身份，以及一个私有函数 <strong>SendHello</strong> ( ) 。</p>
<p>
	　　bool | array <strong>Expand</strong> ( string <em>$name</em> )</p>
<p>
	　　该函数发送一个邮箱列表的名称 <em>$name</em> 给SMTP服务器，请求服务器给出该列表中成员。成功的话会返回结果数组，失败则返回 <strong>false</strong> 。返回数组中值的格式为 <strong>[ &lt;full-name&gt; &lt;sp&gt; ] &lt;path&gt;</strong> 。 <strong>&lt;path&gt;</strong> 的定义在 RFC 821 中给定。在 RFC 821 中，该命令为： <strong>EXPN &lt;SP&gt; &lt;string&gt; &lt;CRLF&gt;</strong></p>
<pre class="brush:php;">
/**
 * Expand takes the name and asks the server to list all the
 * people who are members of the _list_. Expand will return
 * back and array of the result or false if an error occurs.
 * Each value in the array returned has the format of:
 *     [ &lt;full-name&gt; &lt;sp&gt; ] &lt;path&gt;
 * The definition of &lt;path&gt; is defined in rfc 821
 *
 * Implements rfc 821: EXPN &lt;SP&gt; &lt;string&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE FAILURE: 550
 * SMTP CODE ERROR  : 500,501,502,504,421
 * @access public
 * @return string array
 */
function Expand($name) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Expand() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;EXPN &quot; . $name . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;EXPN not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    // parse the reply and place in our array to return to user
    $entries = explode($this-&gt;CRLF,$rply);
    while(list(,$l) = @each($entries)) {
        $list[] = substr($l,4);
    }

    return $list;
}</pre>
<p>
	　　首先重置 <em>$error</em> 为空，调用 <strong>connected</strong> ( ) 函数检查是否已经与SMTP服务器建立连接，如果没有建立，设置 <em>$error</em> 为&ldquo;<strong>Called Expand() without being connected</strong>&rdquo;，并返回 <strong>false</strong> 。</p>
<p>
	　　如果服务器返回的状态码不是 <strong>250</strong> ，则将 <em>$error</em> 设置为&ldquo;<strong>EXPN not accepted from server</strong>&rdquo;，并返回 <strong>false</strong> ；否则对返回的数据进行整理，以数组 <em>$list</em> 返回。</p>
<p>
	　　bool <strong>Hello</strong> ( <em>$host = &quot;&quot;</em> )</p>
<p>
	　　向SMTP服务器发送 <strong>HELO</strong> 命令，确认双方都处于一个已知的状态。在 RFC 821 中，该命令为： <strong>HELO &lt;SP&gt; &lt;domain&gt; &lt;CRLF&gt;</strong></p>
<pre class="brush:php;">
/**
 * Sends the HELO command to the smtp server.
 * This makes sure that we and the server are in
 * the same known state.
 *
 * Implements from rfc 821: HELO &lt;SP&gt; &lt;domain&gt; &lt;CRLF&gt;
 *
 * SMTP CODE SUCCESS: 250
 * SMTP CODE ERROR  : 500, 501, 504, 421
 * @access public
 * @return bool
 */
function Hello($host=&quot;&quot;) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Hello() without being connected&quot;);
        return false;
    }

    // if a hostname for the HELO wasn&#39;t specified determine
    // a suitable one to send
    if(empty($host)) {
        # we need to determine some sort of appopiate default
        # to send to the server
        $host = &quot;localhost&quot;;
    }

    // Send extended hello first (RFC 2821)
    if(!$this-&gt;SendHello(&quot;EHLO&quot;, $host))
    {
        if(!$this-&gt;SendHello(&quot;HELO&quot;, $host))
        return false;
    }

    return true;
}</pre>
<p>
	　　先重置 <em>$error</em> 为空，调用 <strong>connected</strong> ( ) 函数检查是否已经与SMTP服务器建立连接，如果没有建立，设置 <em>$error</em> 为&ldquo;<strong>Called Hello() without being connected</strong>&rdquo;，并返回 <strong>false</strong> 。</p>
<p>
	　　如果主机名 <em>$host</em> 为空，则使用默认的&ldquo;<strong>localhost</strong>&rdquo;，依次尝试使用 <strong>EHLO</strong> 和 <strong>HELO</strong> 调用私有函数 <strong>SendHello</strong> ( ) 发送命令，成功则返回 <strong>true</strong> ，失败则返回 <strong>false</strong> 。</p>
<p>
	　　bool <strong>SendHello</strong> ( string <em>$hello</em> , string <em>$host</em> )</p>
<p>
	　　这是一个私有方法，用于发送 <strong>HELO/EHLO</strong> 命令给SMTP服务器。</p>
<pre class="brush:php;">
/**
 * Sends a HELO/EHLO command.
 * @access private
 * @return bool
 */
function SendHello($hello, $host) {
    fputs($this-&gt;smtp_conn, $hello . &quot; &quot; . $host . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER: &quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; $hello . &quot; not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    $this-&gt;helo_rply = $rply;

    return true;
}</pre>
<p>
	　　如果服务器返回的状态码不是 <strong>250</strong> ，则将 <em>$error</em> 设置为&ldquo;<strong>HELO not accepted from server</strong>&rdquo;，并返回 <strong>false</strong> 。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=22</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Thu, 11 Jun 2009 14:08:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=21</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=21</guid>
			<title>PHP SMTP 类（Part 3.1，SMTP命令函数之 Data ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里涉及到PHP SMTP类中的关键部分了，SMTP命令函数，数百行代码，一共有14个公共函数： <strong>Data</strong> ( ) 、 <strong>Expand</strong> ( ) 、 <strong>Hello</strong> ( ) 、 <strong>Help</strong> ( ) 、 <strong>Mail</strong> ( ) 、 <strong>Noop</strong> ( ) 、 <strong>Quit</strong> ( ) 、 <strong>Recipient</strong> ( ) 、 <strong>Reset</strong> ( ) 、 <strong>Send</strong> ( ) 、 <strong>SendAndMail</strong> ( ) 、 <strong>SendOrMail</strong> ( ) 、<strong>Turn</strong> ( ) 、<strong>Verify</strong> ( ) ，一个私有函数 <strong>SendHello</strong> () 。本文从第一个 <strong>Data</strong> ( ) 开始。</p>
<p>
	　　bool <strong>Data</strong> ( string <em>$msg_data</em> )</p>
<p>
	　　发送一个 <strong>DATA</strong> 命令和 <em>$msg_date</em> 到SMTP服务器进行邮件传输。 <em>$msg_date</em> 是一个连同消息头在一起发送的信息。每一个消息头需要由 <strong>&lt;CRLF&gt;</strong> 为结尾的单独一行，消息头和信息体也需要添加 <strong>&lt;CRLF&gt;</strong> 分开。</p>
<pre class="brush:php;">
/**
 * Issues a data command and sends the msg_data to the server
 * finializing the mail transaction. $msg_data is the message
 * that is to be send with the headers. Each header needs to be
 * on a single line followed by a &lt;CRLF&gt; with the message headers
 * and the message body being seperated by and additional &lt;CRLF&gt;.
 *
 * Implements rfc 821: DATA &lt;CRLF&gt;
 *
 * SMTP CODE INTERMEDIATE: 354
 *     [data]
 *     &lt;CRLF&gt;.&lt;CRLF&gt;
 *     SMTP CODE SUCCESS: 250
 *     SMTP CODE FAILURE: 552,554,451,452
 * SMTP CODE FAILURE: 451,554
 * SMTP CODE ERROR  : 500,501,503,421
 * @access public
 * @return bool
 */
function Data($msg_data) {
    $this-&gt;error = null; // so no confusion is caused

    if(!$this-&gt;connected()) {
        $this-&gt;error = array(
        &quot;error&quot; =&gt; &quot;Called Data() without being connected&quot;);
        return false;
    }

    fputs($this-&gt;smtp_conn,&quot;DATA&quot; . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 354) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;DATA command not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    // the server is ready to accept data!
    // according to rfc 821 we should not send more than 1000
    // including the CRLF
    // characters on a single line so we will break the data up
    // into lines by \r and/or \n then if needed we will break
    // each of those into smaller lines to fit within the limit.
    // in addition we will be looking for lines that start with
    // a period &#39;.&#39; and append and additional period &#39;.&#39; to that
    // line. NOTE: this does not count towards are limit.

    // normalize the line breaks so we know the explode works
    $msg_data = str_replace(&quot;\r\n&quot;,&quot;\n&quot;,$msg_data);
    $msg_data = str_replace(&quot;\r&quot;,&quot;\n&quot;,$msg_data);
    $lines = explode(&quot;\n&quot;,$msg_data);

    // we need to find a good way to determine is headers are
    // in the msg_data or if it is a straight msg body
    // currently I&#39;m assuming rfc 822 definitions of msg headers
    // and if the first field of the first line (&#39;:&#39; sperated)
    // does not contain a space then it _should_ be a header
    // and we can process all lines before a blank &quot;&quot; line as
    // headers.
    $field = substr($lines[0],0,strpos($lines[0],&quot;:&quot;));
    $in_headers = false;
    if(!empty($field) &amp;&amp; !strstr($field,&quot; &quot;)) {
        $in_headers = true;
    }

    $max_line_length = 998; // used below; set here for ease in change

    while(list(,$line) = @each($lines)) {
        $lines_out = null;
        if($line == &quot;&quot; &amp;&amp; $in_headers) {
            $in_headers = false;
        }
        // ok we need to break this line up into several
        // smaller lines
        while(strlen($line) &gt; $max_line_length) {
            $pos = strrpos(substr($line,0,$max_line_length),&quot; &quot;);

            // Patch to fix DOS attack
            if(!$pos) {
                $pos = $max_line_length - 1;
            }

            $lines_out[] = substr($line,0,$pos);
            $line = substr($line,$pos + 1);
            // if we are processing headers we need to
            // add a LWSP-char to the front of the new line
            // rfc 822 on long msg headers
            if($in_headers) {
                $line = &quot;\t&quot; . $line;
            }
        }
        $lines_out[] = $line;

        // now send the lines to the server
        while(list(,$line_out) = @each($lines_out)) {
            if(strlen($line_out) &gt; 0)
            {
                if(substr($line_out, 0, 1) == &quot;.&quot;) {
                    $line_out = &quot;.&quot; . $line_out;
                }
            }
            fputs($this-&gt;smtp_conn,$line_out . $this-&gt;CRLF);
        }
    }

    // ok all the message data has been sent so lets get this
    // over with aleady
    fputs($this-&gt;smtp_conn, $this-&gt;CRLF . &quot;.&quot; . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $rply;
    }

    if($code != 250) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;DATA not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }
    return true;
}</pre>
<p>
	　　首先重置 <em>$error</em> 为空，调用 <strong>connected</strong> ( ) 函数检查是否已经与SMTP服务器建立连接，如果没有建立，设置 <em>$error</em> 为&ldquo;<strong>Called Data() without being connected</strong>&rdquo;，并返回 <strong>false</strong> 。</p>
<p>
	　　接着向服务器发送 <strong>DATA</strong> 命令，如果服务器返回的状态码不是 <strong>354</strong> ，则将 <em>$error</em> 设置为&ldquo;<strong>DATA command not accepted from server</strong>&rdquo;，并返回 <strong>false</strong> 。</p>
<p>
	　　现在SMTP服务器已经准备好接收数据了，根据 RFC 821 协议，包括 <em>$CRLF</em> 在内，我们不能在一行内发送超过 1000 个字符，所以如果有必要，我们将使用 <strong>\r</strong> 和（或） <strong>\n</strong> 把每行数据分成符合限制的更小的行。此外，我们要寻找以句号&ldquo;<strong>.</strong>&rdquo;开始的行，并添加一个额外的句号&ldquo;<strong>.</strong>&rdquo;在该行（这不计入字符数限制）。</p>
<p>
	　　把 <em>$msg_data</em> 中的 <strong>\r\n</strong> 和 <strong>\r</strong> 替换为 <strong>\n</strong> ，然后用 <strong>\n</strong> 将 <em>$msg_data</em> 拆分成数组 <em>$lines</em> 。</p>
<p>
	　　我们需要一个好办法来确定 <em>$msg_data</em> 已经包含了消息头还是仅仅是消息体，这里检查第一行的第一部分（以&ldquo;<strong>:</strong>&rdquo;分隔），即冒号&ldquo;<strong>:</strong>&rdquo;之前的部分，其中没有空格，则认为 <em>$msg_data</em> 中包含了消息头。</p>
<p>
	　　下面用 array <strong>each</strong> ( array <em>&amp;$array</em> ) 逐个读取 <em>$lines</em> 中的数据到 <em>$line</em> ，如果 <em>$line</em> 为空且 <em>$msg_data</em> 中包含了消息头，则把包含消息头标识 <em>$in_headers</em> 设置为 <strong>false</strong> 。如果 <em>$line</em> 长度大于设定的长度 <em>$max_line_length</em> ，则按照该设定长度分成多行，如果信息头为多行，则根据 RFC 822 协议在每一行前添加一个制表符（<strong>\t</strong>），然后将分割好的小行输出到数组 <em>$lines_out</em> 中。</p>
<p>
	　　逐个小行发送到SMTP服务器，如果小行以句号&ldquo;<strong>.</strong>&rdquo;开头，则在其前面再加一个句号&ldquo;<strong>.</strong>&rdquo;，因为单个句号&ldquo;<strong>.</strong>&rdquo;开头会被SMTP服务器认为是 <strong>DATA</strong> 结束的标识。</p>
<p>
	　　<strong>DATA</strong> 发送完毕后，发送一个句号&ldquo;<strong>.</strong>&rdquo;，通知SMTP服务器发送完成，如果SMTP服务器返回的状态码不是 <strong>250</strong> ，则将 <em>$error</em> 设置为&ldquo;<strong>DATA not accepted from server</strong>&rdquo;并返回 <strong>false</strong> 。</p>
<p>
	　　发送成功，返回 <strong>true</strong> 。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=21</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Mon, 08 Jun 2009 13:37:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=20</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=20</guid>
			<title>PHP SMTP 类（Part 2.2，连接函数之 Authenticate ( ) &amp; Close ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这里介绍PHP SMTP类中的认证函数 <strong>Authenticate</strong> ( ) 和 <strong>Close</strong> ( ) 。</p>
<p>
	　　bool <strong>Authenticate</strong> ( string <em>$username</em> , string <em>$password</em> )</p>
<p>
	　　该函数用于执行SMTP认证，必须在 <strong>Hello</strong> ( ) 函数后运行，如果身份验证成功，则返回 <strong>true</strong> 。</p>
<pre class="brush:php;">
/**
 * Performs SMTP authentication.  Must be run after running the
 * Hello() method.  Returns true if successfully authenticated.
 * @access public
 * @return bool
 */
function Authenticate($username, $password) {
    // Start authentication
    fputs($this-&gt;smtp_conn,&quot;AUTH LOGIN&quot; . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($code != 334) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;AUTH not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    // Send encoded username
    fputs($this-&gt;smtp_conn, base64_encode($username) . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($code != 334) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;Username not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    // Send encoded password
    fputs($this-&gt;smtp_conn, base64_encode($password) . $this-&gt;CRLF);

    $rply = $this-&gt;get_lines();
    $code = substr($rply,0,3);

    if($code != 235) {
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;Password not accepted from server&quot;,
        &quot;smtp_code&quot; =&gt; $code,
        &quot;smtp_msg&quot; =&gt; substr($rply,4));
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: &quot; . $rply . $this-&gt;CRLF;
        }
        return false;
    }

    return true;
}</pre>
<p>
	　　首先执行 int fputs ( resource <em>$handle</em> , string <em>$string</em> [, int <em>$length</em> ] )，向SMTP服务器发送身份验证请求（<strong>AUTH LOGIN</strong>），如果SMTP服务器返回的状态码不是 <strong>334</strong> ，则将 <em>$error</em> 设置为&ldquo;<strong>AUTH not accepted from server</strong>&rdquo;并返回 <strong>false</strong> 。</p>
<p>
	　　接着发送经过 <strong>base64_encode</strong> ( ) 编码的用户名，如果SMTP服务器返回的状态码不是 <strong>334</strong> ，则将 <em>$error</em> 设置为&ldquo;<strong>Username not accepted from server</strong>&rdquo;并返回 <strong>false</strong> 。</p>
<p>
	　　继续发送经过 <strong>base64_encode</strong> ( ) 编码的密码。如果SMTP服务器返回 <strong>235</strong> ，则说明登录成功，返回 <strong>true</strong> ；否则则将 <em>$error</em> 设置为&ldquo;<strong>Password not accepted from server</strong>&rdquo;并返回 <strong>false</strong> 。</p>
<p>
	　　void <strong>Close</strong> ( )</p>
<p>
	　　该函数关闭socket连接并清理类的状态，如果不首先使用 <strong>Quit</strong> ( )，直接使用该函数并不是一个好主意。</p>
<pre class="brush:php;">
/**
 * Closes the socket and cleans up the state of the class.
 * It is not considered good to use this function without
 * first trying to use QUIT.
 * @access public
 * @return void
 */
function Close() {
    $this-&gt;error = null; // so there is no confusion
    $this-&gt;helo_rply = null;
    if(!empty($this-&gt;smtp_conn)) {
        // close the connection and cleanup
        fclose($this-&gt;smtp_conn);
        $this-&gt;smtp_conn = 0;
    }
}</pre>
<p>
	　　首先清理掉 <em>$error</em> 、 <em>$helo_rply</em> 两个私有属性，判断私有属性 <em>$smtp_conn</em> 是否存在，也就是SMTP是否已经连接，如果连接了，就关闭该连接，将 <em>$smtp_conn</em> 设置为 <strong>0</strong> 。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=20</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Sun, 31 May 2009 10:42:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=19</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=19</guid>
			<title>PHP SMTP 类（Part 2.1，连接函数之 Connect ( ) &amp; Connected ( )）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　这个PHP类的连接函数一共有四个，三个公共函数，一个私有函数。公共函数分别是 <strong>Connect (</strong> ) 、 <strong>Authenticate</strong> ( ) 、 <strong>Close</strong> ( ) ，用于实现连接、认证、断开的功能，私有函数是 <strong>Connected</strong> ( ) ，用于判断是否已经建立了和SMTP服务器的连接。这里是第一个公共函数 <strong>Connect</strong> ( ) 和私有函数 <strong>Connected</strong> ( ) 。</p>
<p>
	　　bool <strong>Connect</strong> ( string <em>$host</em> [, int <em>$port = 0</em> [, int <em>$tval = 30</em> ]] )</p>
<p>
	　　通过指定端口连接到SMTP服务器，如果没有指定端口<em>$port</em>，将使用默认的端口（<em>$SMTP_PORT</em>=25），如果 <em>$tval</em> 被指定，将尝试建立与SMTP服务器连接 <em>$tval</em> 秒，如果没有指定，则默认为30秒。这里支持对Gmail的服务器的连接。</p>
<pre class="brush:php;">
/**
 * Connect to the server specified on the port specified.
 * If the port is not specified use the default SMTP_PORT.
 * If tval is specified then a connection will try and be
 * established with the server for that number of seconds.
 * If tval is not specified the default is 30 seconds to
 * try on the connection.
 *
 * SMTP CODE SUCCESS: 220
 * SMTP CODE FAILURE: 421
 * @access public
 * @return bool
 */
function Connect($host,$port=0,$tval=30) {
    // set the error val to null so there is no confusion
    $this-&gt;error = null;

    // make sure we are __not__ connected
    if($this-&gt;connected()) {
        // ok we are connected! what should we do?
        // for now we will just give an error saying we
        // are already connected
        $this-&gt;error =
        array(&quot;error&quot; =&gt; &quot;Already connected to a server&quot;);
        return false;
    }

    if(empty($port)) {
        $port = $this-&gt;SMTP_PORT;
    }
    //Added for Gmail support CER
    if($this-&gt;Protocol != &#39;&#39;) $host = $this-&gt;Protocol.&quot;://&quot;.$host;

    #connect to the smtp server
    $this-&gt;smtp_conn = @fsockopen($host,    // the host of the server
    $port,    // the port to use
    $errno,   // error number if any
    $errstr,  // error message if any
    $tval);   // give up after ? secs
    // verify we connected properly
    if(empty($this-&gt;smtp_conn)) {
        $this-&gt;error = array(&quot;error&quot; =&gt; &quot;Failed to connect to server $host $port&quot;,
        &quot;errno&quot; =&gt; $errno,
        &quot;errstr&quot; =&gt; $errstr);
        if($this-&gt;do_debug &gt;= 1) {
            echo &quot;SMTP -&gt; ERROR: &quot; . $this-&gt;error[&quot;error&quot;] .
            &quot;: $errstr ($errno)&quot; . $this-&gt;CRLF;
        }
        return false;
    }

    // sometimes the SMTP server takes a little longer to respond
    // so we will give it a longer timeout for the first read
    // Windows still does not have support for this timeout function
    if(substr(PHP_OS, 0, 3) != &quot;WIN&quot;)
    socket_set_timeout($this-&gt;smtp_conn, $tval, 0);

    // get any announcement stuff
    $announce = $this-&gt;get_lines();

    // set the timeout  of any socket functions at 1/10 of a second
    //if(function_exists(&quot;socket_set_timeout&quot;))
    //   socket_set_timeout($this-&gt;smtp_conn, 0, 100000);

    if($this-&gt;do_debug &gt;= 2) {
        echo &quot;SMTP -&gt; FROM SERVER:&quot; . $this-&gt;CRLF . $announce;
    }

    return true;
}</pre>
<p>
	　　该函数首先重置错误信息 <em>$error</em> 为空，然后通过私有函数 <strong>connected</strong> ( ) 检查SMTP服务器的连接是否已经被建立。如果已经建立连接，则将 <em>$error</em> 设置为&ldquo;Already connected to a server&rdquo;，返回 <strong>false</strong> 。</p>
<p>
	　　如果没有指定 <em>$port</em> ，则设置 <em>$port</em> 为 <em>$SMTP_PORT</em> ，即25。</p>
<p>
	　　如果公共属性 <em>$Protocol</em> 被定义，则在主机前加上协议名称，用于建立对Gmail的连接，Gmail协议使用了ssl，也就是说，如果试图连接Gmail邮箱发送邮件，就需要在使用时定义该属性为&ldquo;ssl&rdquo;。</p>
<p>
	　　接着就是最关键的一个东东&mdash;&mdash;连接了，使用的PHP函数是： resource <strong>fsockopen</strong> ( string <em>$hostname</em> [, int <em>$port = -1</em> [, int <em>&amp;$errno</em> [, string <em>&amp;$errstr</em> [, float <em>$timeout = ini_get(&quot;default_socket_timeout&quot;)</em> ]]]] )，用于通过启用一个对 <em>$hostname</em> 的SOCKET连接并返回标识符，并把标识符记录到私有属性 <em>$smtp_conn</em> 中，后面还要继续使用。</p>
<p>
	　　再来验证一下我们建立的连接，如果连接没有成功，<em>$smtp_conn</em> 就是空的，把 <strong>fsockopen</strong> 函数返回的错误 <em>$errno</em> 、<em>$errstr</em> 传递给私有属性 <em>$error</em> ，如果开启了调试功能，则输出错误信息，返回 <strong>false</strong> 。</p>
<p>
	　　有时SMTP服务器需要稍长一点的时间来回应，所以我们给它第一次读取一个较长的超时，但是WINDOWS系统不支持<strong>socket_set_timeout</strong> ( )函数。</p>
<p>
	　　如果开启了调试功能并设置为2级，则输出连接成功的通知。</p>
<p>
	　　返回 <strong>true</strong> 。</p>
<p>
	　　bool <strong>Connected</strong> ( )</p>
<p>
	　　检查是否已经连接到SMTP服务器，如果已连接，返回 <strong>true</strong> ，否则返回 <strong>false</strong> 。</p>
<pre class="brush:php;">
/**
 * Returns true if connected to a server otherwise false
 * @access private
 * @return bool
 */
function Connected() {
    if(!empty($this-&gt;smtp_conn)) {
        $sock_status = socket_get_status($this-&gt;smtp_conn);
        if($sock_status[&quot;eof&quot;]) {
            // hmm this is an odd situation... the socket is
            // valid but we aren&#39;t connected anymore
            if($this-&gt;do_debug &gt;= 1) {
                echo &quot;SMTP -&gt; NOTICE:&quot; . $this-&gt;CRLF .
                &quot;EOF caught while checking if connected&quot;;
            }
            $this-&gt;Close();
            return false;
        }
        return true; // everything looks good
    }
    return false;
}</pre>
<p>
	　　首先检查SMTP连接 <em>$smtp_conn</em> 是否存在，如果不存在，自然返回 <strong>false</strong> ，否则，需要进一步确认连接是否真正建立。</p>
<p>
	　　通过 array <strong>socket_get_status</strong> ( int <em>$fp</em> ) 获取连接的状态。如果其中的 <em>EOF</em> 值为 <strong>false</strong> ，则说明正在连接中，那就返回 <strong>true</strong> ；如果 <em>EOF</em> 值为 <strong>true</strong> ，一个奇怪的现象出现了， socket 连接是有效的，但我们确实没有什么连接了，那就调用公共函数 <strong>Close</strong> ( ) 关闭掉当前连接，返回 <strong>false</strong> 。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=19</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=gmail">gmail</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Fri, 29 May 2009 12:50:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=18</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=18</guid>
			<title>PHP SMTP 类（Part 1，简介、类的属性、构造函数）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　戒烟如你需要用PHP实现一个复杂点的SMTP发送邮件功能，于是在网上找到了一个&ldquo;PHP SMTP Class&rdquo;，文件注释里是这样说的：&ldquo;Define an SMTP class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&rdquo;翻译成中文就是：&ldquo;定义一个SMTP类，用于和任意SMTP服务器连接和通讯，实现了RFC821定义的除TURN外所有SMTP方法。&rdquo;该 类的作者是&ldquo;Chris Ryan&rdquo;，许可方式是&ldquo;LGPL&rdquo;。</p>
<p>
	　　文件原代码：<a href="http://www.lakeice.com/attachment.php?id=10" title="class.smtp.rar&#13;&#13;大小:5.75 K, 下载次数:14" target="_blank">class.smtp.rar</a></p>
<p>
	　　首先来看类的注释：</p>
<pre class="brush:xhtml;">
/**
 * SMTP Class
 * 
 * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
 * commands except TURN which will always return a not implemented
 * error. SMTP also provides some utility methods for sending mail
 * to an SMTP server.
 * 
 * @package classes
 */</pre>
<p>
	　　意思和文件的注释差不多，介绍了什么是SMTP，还有其中的TURN会带来一个无法执行的错误。</p>
<p>
	　　下面我们看一下类的属性：</p>
<pre class="brush:php;">
/**
 *  SMTP server port
 *  @var int
 */
var $SMTP_PORT = 25;

/**
 *  SMTP reply line ending
 *  @var string
 */
var $CRLF = &quot;\r\n&quot;;

/**
 *  Sets whether debugging is turned on
 *  @var bool
 */
var $do_debug;       // the level of debug to perform

/**
 *  Sets protocol to help enable support for gmail
 *  @var string
 *  Added CER
 */
var $Protocol = &#39;&#39;;

/**#@+
 * @access private
 */
var $smtp_conn;      // the socket to the server
var $error;          // error if any on the last call
var $helo_rply;      // the reply the server sent to us for HELO
/**#@-*/</pre>
<p>
	　　<em>$SMTP_PORT</em> ，SMTP服务器端口，通常是25</p>
<p>
	　　<em>$CRLF</em> ，分隔符，用于分行，一个回车一个换行</p>
<p>
	　　<em>$do_debug</em> ，设置是否开启调试功能</p>
<p>
	　　<em>$Protocol</em> ，设置支持Gmail的协议</p>
<p>
	　　上面四个是公共属性，还有三个私有属性：</p>
<p>
	　　<em>$smtp_conn</em> ，SMTP服务器连接</p>
<p>
	　　<em>$error</em> ，最后一个对话（call）的错误</p>
<p>
	　　<em>$helo_rply</em> ，服务器对HELO的回复</p>
<p>
	　　再来看看构造函数：</p>
<pre class="brush:php;">
/**
 * Initialize the class so that the data is in a known state.
 * @access public
 * @return void
 */
function SMTP() {
    $this-&gt;smtp_conn = 0;
    $this-&gt;error = null;
    $this-&gt;helo_rply = null;

    $this-&gt;do_debug = 0;
}</pre>
<p>
	　　这个构造函数比较简单，把三个私有属性设置为默认值，同时将调试功能给关闭了，如果开启调试功能，需要从这里进行修改。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=18</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=smtp">smtp</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Sun, 10 May 2009 19:59:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=17</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=17</guid>
			<title>JavaScript控制iFrame在IE与FireFox中的不同</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>　　一直以来在使用JavaScript控制iFrame时，都是使用document.getElementById(iframename)，戒烟如你昨天发现，在FireFox中是不行的，开始以为是函数调用错误，后来发现函数可以调用，但就是没有相应的结果，今天在网上搜索，找到了原因，原来使用JavaScript控制iFrame时在IE和FireFox中是不同的。</p>
<p>　　根据网上的办法，戒烟如你整理了一段小程序，可以在IE 6.0、Firefox 2.0、Netscape 8.1、Opera 9.24中使用。</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;doiframe()&nbsp;{</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;iframename&nbsp;=&nbsp;</span><span class="string">'oneFrame'</span><span>;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.getElementById)&nbsp;pTar&nbsp;=&nbsp;document.getElementById(iframename);</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;eval(</span><span class="string">'pTar&nbsp;=&nbsp;'</span><span>&nbsp;+&nbsp;iframename&nbsp;+&nbsp;</span><span class="string">';'</span><span>);</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(pTar.src);</span></li>
    <li><span>}</span></li>
</ol>
</div>
<p>　上面的第3、4行其实就是判断在IE中的那个document.getElementById()能不能用，能用最好，不能用就直接将iFrame作为对象赋值给pTar。第5行是戒烟如你加的测试代码，弹出提示框，内容是iFrame的地址。</p>
<p>　　这里面用到了一个戒烟如你不太熟悉的eval()，查了微软的《Microsoft Windows 脚本技术》才看了个差不多，各位需要的话可以自己去查。</p>]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=17</link>
			<category domain="http://www.lakeice.com/?cid=2">网页相关</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=iframe">iframe</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=javascript">javascript</category>
			<comments>http://www.lakeice.com/?action=show&amp;id=17#comments</comments>
			<pubDate>Sat, 18 Apr 2009 15:33:02 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=16</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=16</guid>
			<title>JavaScript修改CSS属性函数</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>　　使用JavaScript可以控制页面大小（见《<a target="_blank" href="http://www.hubing.info/?action=show&amp;id=15">JavaScript判断页面大小的函数</a>》），如果需要根据页面大小来调整某个HTML标签的CSS的属性，比如高或者宽什么的，如果使用ID来控制也可以，戒烟如你觉得有点复杂了，从网上找了一个修改CSS属性的函数。&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;changecss(theClass,element,value)&nbsp;{</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;cssRules;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.all)&nbsp;{</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cssRules&nbsp;=&nbsp;</span><span class="string">'rules'</span><span>;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.getElementById)&nbsp;{</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cssRules&nbsp;=&nbsp;</span><span class="string">'cssRules'</span><span>;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;S&nbsp;=&nbsp;0;&nbsp;S&nbsp;&lt;&nbsp;document.styleSheets.length;&nbsp;S++){</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;R&nbsp;=&nbsp;0;&nbsp;R&nbsp;&lt;&nbsp;document.styleSheets[S][cssRules].length;&nbsp;R++)&nbsp;{</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.styleSheets[S][cssRules][R].selectorText&nbsp;==&nbsp;theClass)&nbsp;{</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.styleSheets[S][cssRules][R].style[element]&nbsp;=&nbsp;value;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li><span>}</span></li>
</ol>
</div>
<p>　　调用函数：changecss('.exampleA','color','red')，三个参数分别是CSS名称、属性名称、参数。需要注意的是如果需要修改的是类，即用class=&quot;ClassName&quot;的，在CSS名称前需要加&ldquo;<strong><font color="#ff0000">.</font></strong>&rdquo;（英文半角句号）；如果需要修改的是ID，即用id=&quot;IDName&quot;的，在CSS名称前需要加&ldquo;<strong><font color="#ff0000">#</font></strong>&rdquo;。</p>]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=16</link>
			<category domain="http://www.lakeice.com/?cid=2">网页相关</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=css">css</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=javascript">javascript</category>
			<pubDate>Sat, 18 Apr 2009 13:25:24 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=15</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=15</guid>
			<title>JavaScript判断页面大小的函数</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>　　不想在页面底部和右边显示滚动条，或者根据窗口大小控制层的大小？这个JavaScript函数或许对你有用！该函数在IE 6.0、Firefox 2.0、Netscape 8.1、Opera 9.24中均测试通过。</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;getPageSize(){</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;xScroll,&nbsp;yScroll;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(window.innerHeight&nbsp;&amp;&amp;&nbsp;window.scrollMaxY)&nbsp;{</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xScroll&nbsp;=&nbsp;document.body.scrollWidth;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yScroll&nbsp;=&nbsp;window.innerHeight&nbsp;+&nbsp;window.scrollMaxY;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.body.scrollHeight&nbsp;&gt;&nbsp;document.body.offsetHeight){</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xScroll&nbsp;=&nbsp;document.body.scrollWidth;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yScroll&nbsp;=&nbsp;document.body.scrollHeight;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xScroll&nbsp;=&nbsp;document.body.offsetWidth;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yScroll&nbsp;=&nbsp;document.body.offsetHeight;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt">&nbsp;</li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;windowWidth,&nbsp;windowHeight;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(self.innerHeight)&nbsp;{</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;windowWidth&nbsp;=&nbsp;self.innerWidth;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;windowHeight&nbsp;=&nbsp;self.innerHeight;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.documentElement&nbsp;&amp;&amp;&nbsp;document.documentElement.clientHeight)&nbsp;{</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;windowWidth&nbsp;=&nbsp;document.documentElement.clientWidth;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;windowHeight&nbsp;=&nbsp;document.documentElement.clientHeight;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.body)&nbsp;{</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;windowWidth&nbsp;=&nbsp;document.body.clientWidth;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;windowHeight&nbsp;=&nbsp;document.body.clientHeight;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li class="alt">&nbsp;</li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(yScroll&nbsp;&lt;&nbsp;windowHeight){</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageHeight&nbsp;=&nbsp;yScroll;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageHeight&nbsp;=&nbsp;windowHeight;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li class="alt">&nbsp;</li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(xScroll&nbsp;&lt;&nbsp;windowWidth){</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageWidth&nbsp;=&nbsp;xScroll;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageWidth&nbsp;=&nbsp;windowWidth;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li class="alt">&nbsp;</li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;arrayPageSize&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Array(pageWidth,pageHeight,windowWidth,windowHeight)</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;arrayPageSize;</span></li>
    <li><span>}</span></li>
</ol>
</div>
<p>　　该函数返回的是一个数组，宽和高各有两个值，可以根据需要取舍。</p>]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=15</link>
			<category domain="http://www.lakeice.com/?cid=2">网页相关</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=javascript">javascript</category>
			<comments>http://www.lakeice.com/?action=show&amp;id=15#comments</comments>
			<pubDate>Fri, 17 Apr 2009 17:15:13 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=14</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=14</guid>
			<title>支持FireFox的JavaScript表格操作函数</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>　　想在表格中添加一行数据，以前用NewRow = TableId.insertRow()和NewCell = NewRow.insertCell()，在IE中没有问题，但在FireFox中却没有结果后来没办法只有放弃了表格，使用div，今天突发奇想，到底要在网上搜索一下能不能使用JavaScript在FireFox中操作表格，居然还被我找到了，原来问题还是出在表格对象的确定上，呵呵~~</p>
<p>　　第一个函数，用来确定对象：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;findObj(theObj,&nbsp;theDoc) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;p,&nbsp;i,&nbsp;foundObj; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!theDoc)&nbsp;theDoc&nbsp;=&nbsp;document; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;(p&nbsp;=&nbsp;theObj.indexOf(</span><span class="string">&quot;?&quot;</span><span>))&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;parent.frames.length) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theDoc&nbsp;=&nbsp;parent.frames[theObj.substring(p+1)].document; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theObj&nbsp;=&nbsp;theObj.substring(0,p); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!(foundObj&nbsp;=&nbsp;theDoc[theObj])&nbsp;&amp;&amp;&nbsp;theDoc.all)&nbsp;foundObj&nbsp;=&nbsp;theDoc.all[theObj]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(i=0;&nbsp;!foundObj&nbsp;&amp;&amp;&nbsp;i&nbsp;&lt;&nbsp;theDoc.forms.length;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foundObj&nbsp;=&nbsp;theDoc.forms[theObj]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(i=0;&nbsp;!foundObj&nbsp;&amp;&amp;&nbsp;theDoc.layers&nbsp;&amp;&amp;&nbsp;i&nbsp;&lt;&nbsp;theDoc.layers.length;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foundObj&nbsp;=&nbsp;findObj(theObj,theDoc.layers.document); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!foundObj&nbsp;&amp;&amp;&nbsp;document.getElementById)&nbsp;foundObj&nbsp;=&nbsp;document.getElementById(theObj); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;foundObj; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>　　第二个函数，插入一行：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;AddSignRow(){ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;获取表格对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;signFrame&nbsp;=&nbsp;findObj(</span><span class="string">&quot;TableName&quot;</span><span>,document); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;添加行 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;newTR&nbsp;=&nbsp;signFrame.insertRow(signFrame.rows.length); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;newTR.id&nbsp;=&nbsp;</span><span class="string">&quot;SignItem&quot;</span><span>;&nbsp;</span><span class="comment">//&nbsp;设置行的ID </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//添加列0 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;newNameTD=newTR.insertCell(0); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//添加列内容 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;newNameTD.innerHTML&nbsp;=&nbsp;</span><span class="string">&quot;第一列内容&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//添加列1 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;newNameTD=newTR.insertCell(1); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//添加列内容 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;newNameTD.innerHTML&nbsp;=&nbsp;</span><span class="string">&quot;第二列内容&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>　　第三个函数，删除指定的行：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;DeleteSignRow(rowid){ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;signFrame&nbsp;=&nbsp;findObj(</span><span class="string">&quot;TableName&quot;</span><span>,document); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;signItem&nbsp;=&nbsp;findObj(rowid,document); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取将要删除的行的Index </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;rowIndex&nbsp;=&nbsp;signItem.rowIndex; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//删除指定Index的行 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;signFrame.deleteRow(rowIndex); &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>　　说来也没有什么新鲜的玩意儿，其实关键还是在于取得表格对象。具体的用法就不详细说了，自己举一反三吧。</p>]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=14</link>
			<category domain="http://www.lakeice.com/?cid=2">网页相关</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=javascript">javascript</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=firefox">firefox</category>
			<pubDate>Wed, 15 Apr 2009 18:03:08 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=13</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=13</guid>
			<title>[转载]愚人萨科奇的愚人节自白</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>　　我是萨科齐，2009年4月1日的伦敦深夜，我来到中国国家主席胡锦涛下榻的酒店，与这位中国最高领导人见面。这让我松了一口气，之前中国总理温家宝和中国采购团都不愿来法国，我虽然嘴上不说，但心里总是焦急的，中国毕竟是法国的大客户，我不愿意看到邻国分享中国订单，而法国只能干瞪眼。<br />
<br />
　　我得感谢G20峰会的主办国英国，他们在4月1日的晚宴上很够意思地把我安排在胡锦涛的旁边，看来我之前说要中途退场的恫吓起到了作用，布朗这个胆小鬼也不得不顺着我的意思办。<br />
<br />
　　胡锦涛在晚宴上对我的态度有些冷淡，这是意料之中的事情，但我肯定他对我并无敌意，甚至他准备好了与我会面&mdash;&mdash;我们的外交部当天中午才与中国外交部发布新闻公报，我顺着中国的意思，拿出一整段的篇幅来阐述法国的西藏立场，并承诺拒绝支持任何形式的&ldquo;西藏独立&rdquo;。<br />
<br />
　　在我看来，支不支持藏独根本只是我与中国交往的一张牌，这事情已经闹腾了好几个月，我也没讨到什么好，也该是结束的时候了。中国一直说要我一个明确表态，既然他给了台阶，那我就顺势往下走，有个评论家说，打开中法僵局全在我一念之间，我很欣赏这种评价。<br />
<br />
　　不管怎么样，是我先走出了这一步，我去求见胡锦涛。他在会晤中强调了中法关系的三点启示，还对我国拒绝支持藏独表示赞赏。我又将坚持一个中国的承诺重申了一遍&mdash;&mdash;这在各式联合公报和新闻发布中已经说得太多了，再说一遍又有何难。<br />
<br />
　　我听说有网友说我终于屈服了，不再做人权斗士了，WHO CARE，今时今日金融危机当头，只要能扶持法国经济，谁管他达赖到底是谁。<br />
<br />
　　我更高兴地是中法恢复了全面战略伙伴关系，重启战略对话。我期待着中国的订单，也许就在这个月吧，嗯，这样的想法真让人愉悦。啊哈，让我畅想一下中国大单滚滚而来之后的法国吧，说不定那时候，我又可以硬起来了。<br />
<br />
　　今天是愚人节，我必须很严肃地说一句，我是法兰西共和国总统萨科齐，我不是愚人，你们等着吧，我还会回来的。</p>]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=13</link>
			<category domain="http://www.lakeice.com/?cid=1">难得糊涂</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=愚人节">愚人节</category>
			<comments>http://www.lakeice.com/?action=show&amp;id=13#comments</comments>
			<pubDate>Wed, 01 Apr 2009 21:48:35 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=12</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=12</guid>
			<title>截取固定长度UTF-8字符串的PHP函数</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　需要用到用PHP截取字符串，以往用的都是substr，突然发现不灵了，因为这次戒烟如你使用了UTF-8编码，经过查资料，原来UTF-8表示汉字是3个字符，而且据说还有两个字符的，没看懂，但想到一个汉字占两位，一个英文占一位，干脆用显示长度来计算吧！</p>
<div class="codeText">
	<div class="codeHead">
		PHP代码</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;iSubStr&nbsp;(</span><span class="vars">$str</span><span>,&nbsp;</span><span class="vars">$len</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$i</span><span>&nbsp;=&nbsp;0; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$tlen</span><span>&nbsp;=&nbsp;0; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$tstr</span><span>&nbsp;=&nbsp;</span><span class="string">&#39;&#39;</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(</span><span class="vars">$tlen</span><span>&nbsp;&lt;&nbsp;</span><span class="vars">$len</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$chr</span><span>&nbsp;=&nbsp;mb_substr(</span><span class="vars">$str</span><span>,&nbsp;</span><span class="vars">$i</span><span>,&nbsp;1,&nbsp;</span><span class="string">&#39;utf8&#39;</span><span>); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$chrLen</span><span>&nbsp;=&nbsp;ord(</span><span class="vars">$chr</span><span>)&nbsp;&gt;&nbsp;127&nbsp;?&nbsp;2&nbsp;:&nbsp;1; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$tlen</span><span>&nbsp;+&nbsp;</span><span class="vars">$chrLen</span><span>&nbsp;&gt;&nbsp;</span><span class="vars">$len</span><span>)&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$tstr</span><span>&nbsp;.=&nbsp;</span><span class="vars">$chr</span><span>; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$tlen</span><span>&nbsp;+=&nbsp;</span><span class="vars">$chrLen</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$i</span><span>&nbsp;++; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$tstr</span><span>&nbsp;!=&nbsp;</span><span class="vars">$str</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$tstr</span><span>&nbsp;.=&nbsp;</span><span class="string">&#39;...&#39;</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$tstr</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>}&nbsp;&nbsp;</span></li>
	</ol>
</div>
<p>
	　　该代码仅适用于UTF-8编码的字符串，输入参数分别是原字符串和长度，输出是截取后的字符串。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=12</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=utf-8">utf-8</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<comments>http://www.lakeice.com/?action=show&amp;id=12#comments</comments>
			<pubDate>Thu, 19 Feb 2009 18:34:00 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=11</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=11</guid>
			<title>FPDF代码研究（Part 5）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <div class="codeText">
	<div class="codeHead">
		AliasNbPages()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;AliasNbPages(</span><span class="vars">$alias</span><span>=</span><span class="string">&#39;{nb}&#39;</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置页面总数的别名</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;AliasNbPages&nbsp;=&nbsp;</span><span class="vars">$alias</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
	</ol>
</div>
<p>
	　　该方法用于设置页面总数的别名，默认该别名是 {nb}，例如你在文档的每个页眉或页脚输出了&ldquo;共&nbsp;{nb} 页&rdquo;，在文档输出的时候该内容会自动替换成页面总数。</p>
<div class="codeText">
	<div class="codeHead">
		Open()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;Open()</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;文档开始</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;state&nbsp;=&nbsp;1;</span></li>
		<li class="alt">
			<span>}</span></li>
	</ol>
</div>
<p>
	　　前面一直在设置PDF文档的一些东西，这里则正式开始一个文档了，把文档状态标记为1。</p>
<div class="codeText">
	<div class="codeHead">
		Close()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;Close()</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">// 结束文档</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;state == 3)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;page == 0)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;AddPage();</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">// 处理页脚，调用方法 Footer()</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InFooter = true;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Footer();</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InFooter = false;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">// 关闭页面，调用方法 _endpage()</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_endpage();</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">// 关闭文档，调用方法 _enddoc()</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_enddoc();</span></li>
		<li>
			<span>}</span></li>
	</ol>
</div>
<p>
	　　关闭文档时将文档状态设置为3，然后检查文档页面数，如果为0，即没有任何页面，则添加一个空白页（ <strong>AddPage</strong>() ），处理页脚，关闭页面和文档。</p>
<div class="codeText">
	<div class="codeHead">
		AddPage()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;AddPage(</span><span class="vars">$orientation</span><span>=</span><span class="string">&#39;&#39;</span><span>,&nbsp;</span><span class="vars">$format</span><span>=</span><span class="string">&#39;&#39;</span><span>) &nbsp;&nbsp;</span></span></li>
		<li>
			<span>{ &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;开始新的一页 </span><span>&nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;state&nbsp;==&nbsp;0) &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Open(); &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$family</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;FontFamily; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$style</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;FontStyle.(</span><span class="vars">$this</span><span>-&gt;underline&nbsp;?&nbsp;</span><span class="string">&#39;U&#39;</span><span>&nbsp;:&nbsp;</span><span class="string">&#39;&#39;</span><span>); &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$size</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;FontSizePt; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$lw</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;LineWidth; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$dc</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;DrawColor; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$fc</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;FillColor; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$tc</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;TextColor; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$cf</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;ColorFlag; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;page&nbsp;&gt;&nbsp;0) &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;处理页脚 </span><span>&nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InFooter&nbsp;=&nbsp;true; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Footer(); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InFooter&nbsp;=&nbsp;false; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;关闭前一页 </span><span>&nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_endpage(); &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;开始新一页 </span><span>&nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_beginpage(</span><span class="vars">$orientation</span><span>,</span><span class="vars">$format</span><span>); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;以长方形设置线条大写样式 </span><span>&nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_out(</span><span class="string">&#39;2&nbsp;J&#39;</span><span>); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置线的粗细 </span><span>&nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;LineWidth&nbsp;=&nbsp;</span><span class="vars">$lw</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_out(sprintf(</span><span class="string">&#39;%.2F&nbsp;w&#39;</span><span>,&nbsp;</span><span class="vars">$lw</span><span>*</span><span class="vars">$this</span><span>-&gt;k)); &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置字体 </span><span>&nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$family</span><span>) &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;SetFont(</span><span class="vars">$family</span><span>,</span><span class="vars">$style</span><span>,</span><span class="vars">$size</span><span>); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置颜色 </span><span>&nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;DrawColor&nbsp;=&nbsp;</span><span class="vars">$dc</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$dc</span><span>&nbsp;!=&nbsp;</span><span class="string">&#39;0&nbsp;G&#39;</span><span>) &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_out(</span><span class="vars">$dc</span><span>); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;FillColor&nbsp;=&nbsp;</span><span class="vars">$fc</span><span>; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$fc</span><span>&nbsp;!=&nbsp;</span><span class="string">&#39;0&nbsp;g&#39;</span><span>) &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_out(</span><span class="vars">$fc</span><span>); &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;TextColor&nbsp;=&nbsp;</span><span class="vars">$tc</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;ColorFlag&nbsp;=&nbsp;</span><span class="vars">$cf</span><span>; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;处理页眉 </span><span>&nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InHeader&nbsp;=&nbsp;true; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Header(); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InHeader&nbsp;=&nbsp;false; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;恢复线条粗细 </span><span>&nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;LineWidth&nbsp;!=&nbsp;</span><span class="vars">$lw</span><span>) &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;LineWidth&nbsp;=&nbsp;</span><span class="vars">$lw</span><span>; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_out(sprintf(</span><span class="string">&#39;%.2F&nbsp;w&#39;</span><span>,</span><span class="vars">$lw</span><span>*</span><span class="vars">$this</span><span>-&gt;k)); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;恢复字体 </span><span>&nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$family</span><span>) &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;SetFont(</span><span class="vars">$family</span><span>,</span><span class="vars">$style</span><span>,</span><span class="vars">$size</span><span>); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;恢复颜色 </span><span>&nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;DrawColor&nbsp;!=&nbsp;</span><span class="vars">$dc</span><span>) &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;DrawColor&nbsp;=&nbsp;</span><span class="vars">$dc</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_out(</span><span class="vars">$dc</span><span>); &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;FillColor&nbsp;!=&nbsp;</span><span class="vars">$fc</span><span>) &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;FillColor&nbsp;=&nbsp;</span><span class="vars">$fc</span><span>; &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_out(</span><span class="vars">$fc</span><span>); &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;TextColor&nbsp;=&nbsp;</span><span class="vars">$tc</span><span>; &nbsp;&nbsp;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;ColorFlag&nbsp;=&nbsp;</span><span class="vars">$cf</span><span>; &nbsp;&nbsp;</span></li>
		<li>
			<span>}&nbsp;&nbsp;</span></li>
	</ol>
</div>
<p>
	　　</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=11</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=fpdf">fpdf</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<comments>http://www.lakeice.com/?action=show&amp;id=11#comments</comments>
			<pubDate>Mon, 16 Feb 2009 11:31:34 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=10</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=10</guid>
			<title>FPDF代码研究（Part 4）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　继续来分析FPDF类，上次看到了 <strong>SetMargins</strong>() 方法，用于设置页面的上、左、右边距，FPDF还提供了三个单独的方法分别设置它们：</p>
<div class="codeText">
	<div class="codeHead">
		SetLeftMargin()、SetTopMargin()、SetRightMargin()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;SetLeftMargin(</span><span class="vars">$margin</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置左边距</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;lMargin&nbsp;=&nbsp;</span><span class="vars">$margin</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;page&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;</span><span class="vars">$this</span><span>-&gt;x&nbsp;&lt;&nbsp;</span><span class="vars">$margin</span><span>)</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;x&nbsp;=&nbsp;</span><span class="vars">$margin</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
		<li>
			&nbsp;</li>
		<li class="alt">
			<span class="keyword">function</span><span>&nbsp;SetTopMargin(</span><span class="vars">$margin</span><span>)</span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置上边距</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;tMargin&nbsp;=&nbsp;</span><span class="vars">$margin</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
		<li>
			&nbsp;</li>
		<li class="alt">
			<span class="keyword">function</span><span>&nbsp;SetRightMargin(</span><span class="vars">$margin</span><span>)</span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置右边距</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;rMargin&nbsp;=&nbsp;</span><span class="vars">$margin</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这三个方法在一起实现的就是 <strong>SetMargins</strong>() 的作用，因为它们可能是在运行过程中设置的，因此在设置左边距的时候特别识别了一下当前横坐标，如果当前横坐标在左边距外，那就调整下从左边距开始。</p>
<div class="codeText">
	<div class="codeHead">
		SetTitle()、SetSubject()、SetAuthor()、SetKeywords()、SetCreator()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;SetTitle(</span><span class="vars">$title</span><span>,&nbsp;</span><span class="vars">$isUTF8</span><span>=false)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;文档标题</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$isUTF8</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$title </span><span>= </span><span class="vars">$this</span><span>-&gt;_UTF8toUTF16(</span><span class="vars">$title</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;title&nbsp;= </span><span class="vars">$title</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
		<li>
			&nbsp;</li>
		<li class="alt">
			<span class="keyword">function</span><span>&nbsp;SetSubject(</span><span class="vars">$subject</span><span>,&nbsp;</span><span class="vars">$isUTF8</span><span>=false)</span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;文档主题</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$isUTF8</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$subject </span><span>= </span><span class="vars">$this</span><span>-&gt;_UTF8toUTF16(</span><span class="vars">$subject</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;subject = </span><span class="vars">$subject</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
		<li>
			&nbsp;</li>
		<li class="alt">
			<span class="keyword">function</span><span>&nbsp;SetAuthor(</span><span class="vars">$author</span><span>,&nbsp;</span><span class="vars">$isUTF8</span><span>=false)</span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;文档作者</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$isUTF8</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$author </span><span>= </span><span class="vars">$this</span><span>-&gt;_UTF8toUTF16(</span><span class="vars">$author</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;author = </span><span class="vars">$author</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
		<li>
			&nbsp;</li>
		<li class="alt">
			<span class="keyword">function</span><span>&nbsp;SetKeywords(</span><span class="vars">$keywords</span><span>,&nbsp;</span><span class="vars">$isUTF8</span><span>=false)</span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;文档关键词</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$isUTF8</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$keywords</span><span>=</span><span class="vars">$this</span><span>-&gt;_UTF8toUTF16(</span><span class="vars">$keywords</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;keywords=</span><span class="vars">$keywords</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
		<li>
			&nbsp;</li>
		<li class="alt">
			<span class="keyword">function</span><span>&nbsp;SetCreator(</span><span class="vars">$creator</span><span>,&nbsp;</span><span class="vars">$isUTF8</span><span>=false)</span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;文档应用程序</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$isUTF8</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$creator </span><span>= </span><span class="vars">$this</span><span>-&gt;_UTF8toUTF16(</span><span class="vars">$creator</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;creator = </span><span class="vars">$creator</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这5个方法是设置PDF文档属性的，也是设置类属性的，只是其中调用了一个 <strong>_UTF8toUTF16</strong> () 内部方法，用于把UTF8编码的文字变成UTF16编码的，注意一下，由于fpdf.php文件本身不是UTF8编码的，所以如果使用GBK编码做PDF的话，需要先将GBK文字变成UTF8编码的，然后在第二个参数设置为 TRUE，否则汉字显示的就是乱码，戒烟如你亲自测试的。</p>
<div class="codeText">
	<div class="codeHead">
		_UTF8toUTF16()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;_UTF8toUTF16(</span><span class="vars">$s</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;把UTF-8编码转换成UTF-16BE编码</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$res</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;\xFE\xFF&quot;</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$nb</span><span>&nbsp;=&nbsp;</span><span class="func">strlen</span><span>(</span><span class="vars">$s</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$i</span><span>&nbsp;=&nbsp;0;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(</span><span class="vars">$i</span><span>&lt;</span><span class="vars">$nb</span><span>)</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$c1</span><span>&nbsp;=&nbsp;ord(</span><span class="vars">$s</span><span>[</span><span class="vars">$i</span><span>++]);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$c1</span><span>&nbsp;&gt;=&nbsp;224)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;3字节字符</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$c2</span><span>&nbsp;=&nbsp;ord(</span><span class="vars">$s</span><span>[</span><span class="vars">$i</span><span>++]);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$c3</span><span>&nbsp;=&nbsp;ord(</span><span class="vars">$s</span><span>[</span><span class="vars">$i</span><span>++]);</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$res</span><span>&nbsp;.=&nbsp;</span><span class="func">chr</span><span>(((</span><span class="vars">$c1</span><span>&nbsp;&amp;&nbsp;0x0F)&lt;&lt;4)&nbsp;+&nbsp;((</span><span class="vars">$c2</span><span>&nbsp;&amp;&nbsp;0x3C)&gt;&gt;2));</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$res</span><span>&nbsp;.=&nbsp;</span><span class="func">chr</span><span>(((</span><span class="vars">$c2</span><span>&nbsp;&amp;&nbsp;0x03)&lt;&lt;6)&nbsp;+&nbsp;(</span><span class="vars">$c3</span><span>&nbsp;&amp;&nbsp;0x3F));</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elseif</span><span>(</span><span class="vars">$c1</span><span>&nbsp;&gt;=&nbsp;192)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;2字节字符</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$c2</span><span>&nbsp;=&nbsp;ord(</span><span class="vars">$s</span><span>[</span><span class="vars">$i</span><span>++]);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$res</span><span>&nbsp;.=&nbsp;</span><span class="func">chr</span><span>((</span><span class="vars">$c1</span><span>&nbsp;&amp;&nbsp;0x1C)&gt;&gt;2);</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$res</span><span>&nbsp;.=&nbsp;</span><span class="func">chr</span><span>(((</span><span class="vars">$c1</span><span>&nbsp;&amp;&nbsp;0x03)&lt;&lt;6)&nbsp;+&nbsp;(</span><span class="vars">$c2</span><span>&nbsp;&amp;&nbsp;0x3F));</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;单字节字符</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$res</span><span>&nbsp;.=&nbsp;</span><span class="string">&quot;\0&quot;</span><span>.</span><span class="func">chr</span><span>(</span><span class="vars">$c1</span><span>);</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$res</span><span>;</span></li>
		<li>
			<span>}</span></li>
	</ol>
</div>
<p>
	　　该方法似乎以后会有用，先留在这里，暂时不研究它了，知道它的作用就OK！</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=10</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=fpdf">fpdf</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<comments>http://www.lakeice.com/?action=show&amp;id=10#comments</comments>
			<pubDate>Sun, 15 Feb 2009 23:00:12 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=9</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=9</guid>
			<title>FPDF代码研究（Part 3）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　上回书说到FPDF的构造函数调用了7个方法，下面来逐一分析它们：</p>
<div class="codeText">
	<div class="codeHead">
		_dochecks()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;_dochecks()</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;检查是否支持&nbsp;%F</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(sprintf(</span><span class="string">&#39;%.1F&#39;</span><span>,&nbsp;1.0)&nbsp;!=&nbsp;</span><span class="string">&#39;1.0&#39;</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Error(</span><span class="string">&#39;This&nbsp;version&nbsp;of&nbsp;PHP&nbsp;is&nbsp;not&nbsp;supported&#39;</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;检查&nbsp;mbstring&nbsp;是否装载</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="func">ini_get</span><span>(</span><span class="string">&#39;mbstring.func_overload&#39;</span><span>)&nbsp;&amp;&nbsp;2)</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Error(</span><span class="string">&#39;mbstring&nbsp;overloading&nbsp;must&nbsp;be&nbsp;disabled&#39;</span><span>);</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;关闭运行时的魔术引号</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(get_magic_quotes_runtime())</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@set_magic_quotes_runtime(0);</span></li>
		<li>
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这里对系统做了一些检查，用到了几个PHP函数：</p>
<p>
	　　string <strong>sprintf</strong>&nbsp; ( string <em>$format</em>&nbsp; [, mixed <em>$args</em>&nbsp; [, mixed <em>$...</em>&nbsp; ]] )，用于将字符串格式化，其中参数里的 F 是从 PHP 4.3.10&nbsp;和 PHP 5.0.3 开始使用的。</p>
<p>
	　　string <strong>ini_get</strong>&nbsp; ( string <em>$varname</em>&nbsp; )，检查php.ini，这里检查是否装载了 mbstring 扩展，这个什么扩展的偶倒从来没用过。</p>
<p>
	　　int <strong>get_magic_quotes_runtime</strong>&nbsp; ( void&nbsp; )，检查运行时魔术引号是否打开，通常这个是不开的，如果开了，可以用 bool <strong>set_magic_quotes_runtime</strong>&nbsp; ( int <em>$new_setting</em>&nbsp; )来关闭它。</p>
<div class="codeText">
	<div class="codeHead">
		_getpageformat()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;_getpageformat(</span><span class="vars">$format</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$format</span><span>　=　</span><span class="func">strtolower</span><span>(</span><span class="vars">$format</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!isset(</span><span class="vars">$this</span><span>-&gt;PageFormats[</span><span class="vars">$format</span><span>]))</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Error(</span><span class="string">&#39;Unknown&nbsp;page&nbsp;format:&nbsp;&#39;</span><span>.</span><span class="vars">$format</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$a</span><span>　=　</span><span class="vars">$this</span><span>-&gt;PageFormats[</span><span class="vars">$format</span><span>];</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">array</span><span>(</span><span class="vars">$a</span><span>[0]　/　</span><span class="vars">$this</span><span>-&gt;k,&nbsp;</span><span class="vars">$a</span><span>[1]　/　</span><span class="vars">$this</span><span>-&gt;k);</span></li>
		<li>
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这里用于根据纸张样式获取纸张大小，参数是纸张样式，比如A4，从类的属性 <em>$PageFormats</em> 中得到对应的长度和宽度，形成一个数组返回。</p>
<div class="codeText">
	<div class="codeHead">
		Error()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;Error(</span><span class="vars">$msg</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;致命错误</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">die</span><span>(</span><span class="string">&#39;&lt;b&gt;FPDF&nbsp;error:&lt;/b&gt;&nbsp;&#39;</span><span>.</span><span class="vars">$msg</span><span>);</span></li>
		<li class="alt">
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这个很简单了，出现致命错误，中断PHP程序，把传递来的错误信息输出。</p>
<div class="codeText">
	<div class="codeHead">
		SetMargins()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;SetMargins(</span><span class="vars">$left</span><span>,&nbsp;</span><span class="vars">$top</span><span>,&nbsp;</span><span class="vars">$right</span><span>=null)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置页面的左、上、右边距</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;lMargin=</span><span class="vars">$left</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;tMargin=</span><span class="vars">$top</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$right</span><span>===null)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$right</span><span>=</span><span class="vars">$left</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;rMargin=</span><span class="vars">$right</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这是遇到的第一个真正被外部使用的方法，虽然被构造函数调用，但只是初步按照默认值（都为 1 cm）设定，该方法可以修改这种设定。如果使用该方法，其前两个参数必须设置，第三个参数如果不设置，默认使用第一个参数，单位是 cm 。</p>
<div class="codeText">
	<div class="codeHead">
		SetAutoPageBreak()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;SetAutoPageBreak(</span><span class="vars">$auto</span><span>,&nbsp;</span><span class="vars">$margin</span><span>=0)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置自动分页模式和触发分页的边距</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;AutoPageBreak&nbsp;=&nbsp;</span><span class="vars">$auto</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;bMargin&nbsp;=&nbsp;</span><span class="vars">$margin</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;PageBreakTrigger&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;h&nbsp;-&nbsp;</span><span class="vars">$margin</span><span>;</span></li>
		<li class="alt">
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这也是一个可以被外部使用的方法，该方法第一个参数 <em>$auto</em> 用于设置是否自动分页，如果为自动分页（TRUE），第二个参数则设置页面的下边距，系统初始化时默认下边距为 2 cm，但该方法的默认值为 0。在该方法中，下边距是通过自动分页的触发值来实现的。</p>
<div class="codeText">
	<div class="codeHead">
		SetDisplayMode()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;SetDisplayMode(</span><span class="vars">$zoom</span><span>,&nbsp;</span><span class="vars">$layout</span><span>=</span><span class="string">&#39;continuous&#39;</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">// 设置显示模式</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$zoom</span><span>==</span><span class="string">&#39;fullpage&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$zoom</span><span>==</span><span class="string">&#39;fullwidth&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$zoom</span><span>==</span><span class="string">&#39;real&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$zoom</span><span>==</span><span class="string">&#39;default&#39;</span><span>&nbsp;||&nbsp;!</span><span class="func">is_string</span><span>(</span><span class="vars">$zoom</span><span>))</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;ZoomMode = </span><span class="vars">$zoom</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Error(</span><span class="string">&#39;Incorrect&nbsp;zoom&nbsp;display&nbsp;mode:&nbsp;&#39;</span><span>.</span><span class="vars">$zoom</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$layout</span><span>==</span><span class="string">&#39;single&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$layout</span><span>==</span><span class="string">&#39;continuous&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$layout</span><span>==</span><span class="string">&#39;two&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$layout</span><span>==</span><span class="string">&#39;default&#39;</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;LayoutMode = </span><span class="vars">$layout</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Error(</span><span class="string">&#39;Incorrect&nbsp;layout&nbsp;display&nbsp;mode:&nbsp;&#39;</span><span>.</span><span class="vars">$layout</span><span>);</span></li>
		<li>
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这个方法用于设置页面的显示模式，前一个参数是缩放模式，后一个参数是分页模式，具体的参数解释在手册里有，这里就不说了。</p>
<div class="codeText">
	<div class="codeHead">
		SetCompression()</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;SetCompression(</span><span class="vars">$compress</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置页面压缩</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(function_exists(</span><span class="string">&#39;gzcompress&#39;</span><span>))</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;compress = </span><span class="vars">$compress</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;compress = false;</span></li>
		<li>
			<span>}</span></li>
	</ol>
</div>
<p>
	　　这个方法是设置页面压缩的，依赖于PHP的Zlib，所以先进行检测是否支持 <strong>gzcompress</strong>() 如果不支持，即使设置为 true，也会设置为 false。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=9</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=fpdf">fpdf</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Fri, 13 Feb 2009 21:20:46 +0000</pubDate>
		</item>
		<item>
			<link>http://www.lakeice.com/?action=show&amp;id=8</link>
			<guid>http://www.lakeice.com/?action=show&amp;id=8</guid>
			<title>FPDF代码研究（Part 2，构造函数）</title>
			<author>(戒烟如你)</author>
			<description><![CDATA[戒烟如你-&gt;胡兵 ( http://www.lakeice.com/ ) : <p>
	　　类需要一个初始化函数，函数名与类名相同，初始化类的时候这个构造函数就开始运行，构造函数可以使用参数，也就是调用类的时候需要的参数。</p>
<p>
	　　下面是FPDF类的构造函数，带了三个参数，分别是页面方向（默认为纵向）、使用的单位（默认为 mm）、页面样式（默认为 A4）。</p>
<div class="codeText">
	<div class="codeHead">
		PHP代码</div>
	<ol class="dp-c">
		<li class="alt">
			<span><span class="keyword">function</span><span>&nbsp;FPDF(</span><span class="vars">$orientation</span><span>=</span><span class="string">&#39;P&#39;</span><span>,&nbsp;</span><span class="vars">$unit</span><span>=</span><span class="string">&#39;mm&#39;</span><span>,&nbsp;</span><span class="vars">$format</span><span>=</span><span class="string">&#39;A4&#39;</span><span>)</span></span></li>
		<li>
			<span>{</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;调用私有方法&nbsp;_dochecks()&nbsp;进行检查</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;_dochecks();</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;属性初始化</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;page = 0;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;n = 2;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;buffer = </span><span class="string">&#39;&#39;</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;pages = </span><span class="keyword">array</span><span>();</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;PageSizes = </span><span class="keyword">array</span><span>();</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;state = 0;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;fonts = </span><span class="keyword">array</span><span>();</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;FontFiles = </span><span class="keyword">array</span><span>();</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;diffs = </span><span class="keyword">array</span><span>();</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;images = </span><span class="keyword">array</span><span>();</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;links = </span><span class="keyword">array</span><span>();</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InHeader = false;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;InFooter = false;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;lasth = 0;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;FontFamily = </span><span class="string">&#39;&#39;</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;FontStyle = </span><span class="string">&#39;&#39;</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;FontSizePt = 12;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;underline = false;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;DrawColor = </span><span class="string">&#39;0&nbsp;G&#39;</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;FillColor = </span><span class="string">&#39;0&nbsp;g&#39;</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;TextColor = </span><span class="string">&#39;0&nbsp;g&#39;</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;ColorFlag = false;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;ws=0;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;标准字体</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;CoreFonts = </span><span class="keyword">array</span><span>(</span><span class="string">&#39;courier&#39;</span><span>=&gt;</span><span class="string">&#39;Courier&#39;</span><span>,&nbsp;</span><span class="string">&#39;courierB&#39;</span><span>=&gt;</span><span class="string">&#39;Courier-Bold&#39;</span><span>,</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&#39;courierI&#39;</span><span>=&gt;</span><span class="string">&#39;Courier-Oblique&#39;</span><span>,&nbsp;</span><span class="string">&#39;courierBI&#39;</span><span>=&gt;</span><span class="string">&#39;Courier-BoldOblique&#39;</span><span>,</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&#39;helvetica&#39;</span><span>=&gt;</span><span class="string">&#39;Helvetica&#39;</span><span>,&nbsp;</span><span class="string">&#39;helveticaB&#39;</span><span>=&gt;</span><span class="string">&#39;Helvetica-Bold&#39;</span><span>,</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span class="string">&#39;helveticaI&#39;</span><span>=&gt;</span><span class="string">&#39;Helvetica-Oblique&#39;</span><span>,</span><span class="string">&#39;helveticaBI&#39;</span><span>=&gt;</span><span class="string">&#39;Helvetica-BoldOblique&#39;</span><span>,</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&#39;times&#39;</span><span>=&gt;</span><span class="string">&#39;Times-Roman&#39;</span><span>,&nbsp;</span><span class="string">&#39;timesB&#39;</span><span>=&gt;</span><span class="string">&#39;Times-Bold&#39;</span><span>,&nbsp;</span><span class="string">&#39;timesI&#39;</span><span>=&gt;</span><span class="string">&#39;Times-Italic&#39;</span><span>,</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span class="string">&#39;timesBI&#39;</span><span>=&gt;</span><span class="string">&#39;Times-BoldItalic&#39;</span><span>,</span><span>&nbsp;</span><span class="string">&#39;symbol&#39;</span><span>=&gt;</span><span class="string">&#39;Symbol&#39;</span><span>,</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span class="string">&#39;zapfdingbats&#39;</span><span>=&gt;</span><span class="string">&#39;ZapfDingbats&#39;</span><span>); &nbsp;&nbsp;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;比例因子</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$unit </span><span>== </span><span class="string">&#39;pt&#39;</span><span>)</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;k = 1;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elseif</span><span>(</span><span class="vars">$unit </span><span>== </span><span class="string">&#39;mm&#39;</span><span>)</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;k = 72/25.4;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elseif</span><span>(</span><span class="vars">$unit </span><span>== </span><span class="string">&#39;cm&#39;</span><span>)</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;k = 72/2.54;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elseif</span><span>(</span><span class="vars">$unit </span><span>== </span><span class="string">&#39;in&#39;</span><span>)</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;k = 72;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Error(</span><span class="string">&#39;Incorrect&nbsp;unit:&nbsp;&#39;</span><span>.</span><span class="vars">$unit</span><span>);</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;页面式样，调用私有方法&nbsp;_getpageformat()</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;PageFormats = </span><span class="keyword">array</span><span>(</span><span class="string">&#39;a3&#39;</span><span>=&gt;</span><span class="keyword">array</span><span>(841.89,1190.55),</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span class="string">&#39;a4&#39;</span><span>=&gt;</span><span class="keyword">array</span><span>(595.28,841.89),&nbsp;</span><span class="string">&#39;a5&#39;</span><span>=&gt;</span><span class="keyword">array</span><span>(420.94,595.28),</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&#39;letter&#39;</span><span>=&gt;</span><span class="keyword">array</span><span>(612,792),&nbsp;</span><span class="string">&#39;legal&#39;</span><span>=&gt;</span><span class="keyword">array</span><span>(612,1008));</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="func">is_string</span><span>(</span><span class="vars">$format</span><span>))</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$format </span><span>= </span><span class="vars">$this</span><span>-&gt;_getpageformat(</span><span class="vars">$format</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;DefPageFormat = </span><span class="vars">$format</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;CurPageFormat = </span><span class="vars">$format</span><span>;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;页面方向</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$orientation </span><span>= </span><span class="func">strtolower</span><span>(</span><span class="vars">$orientation</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$orientation </span><span>== </span><span class="string">&#39;p&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$orientation </span><span>== </span><span class="string">&#39;portrait&#39;</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;{</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;DefOrientation = </span><span class="string">&#39;P&#39;</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;w = </span><span class="vars">$this</span><span>-&gt;DefPageFormat[0];</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;h = </span><span class="vars">$this</span><span>-&gt;DefPageFormat[1];</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elseif</span><span>(</span><span class="vars">$orientation </span><span>== </span><span class="string">&#39;l&#39;</span><span>&nbsp;||&nbsp;</span><span class="vars">$orientation </span><span>== </span><span class="string">&#39;landscape&#39;</span><span>)</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;{</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;DefOrientation = </span><span class="string">&#39;L&#39;</span><span>;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;w = </span><span class="vars">$this</span><span>-&gt;DefPageFormat[1];</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;h = </span><span class="vars">$this</span><span>-&gt;DefPageFormat[0];</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;Error(</span><span class="string">&#39;Incorrect&nbsp;orientation:&nbsp;&#39;</span><span>.</span><span class="vars">$orientation</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;CurOrientation = </span><span class="vars">$this</span><span>-&gt;DefOrientation;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;wPt = </span><span class="vars">$this</span><span>-&gt;w * </span><span class="vars">$this</span><span>-&gt;k;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;hPt = </span><span class="vars">$this</span><span>-&gt;h * </span><span class="vars">$this</span><span>-&gt;k;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;页边距（默认为&nbsp;1&nbsp;cm），调用SetMargins()</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$margin </span><span>= 28.35 / </span><span class="vars">$this</span><span>-&gt;k;</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;SetMargins(</span><span class="vars">$margin</span><span>, </span><span class="vars">$margin</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;内部单元边距（默认为&nbsp;1&nbsp;mm）</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;cMargin = </span><span class="vars">$margin </span><span>/ 10;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;线的粗细（默认为&nbsp;0.2&nbsp;mm）</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;LineWidth = .567 / </span><span class="vars">$this</span><span>-&gt;k;</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;换页边距，即页面下边距（默认为&nbsp;2&nbsp;cm），调用SetAutoPageBreak()</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;SetAutoPageBreak(true, 2*</span><span class="vars">$margin</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;显示模式，默认为窗口最大宽度，连续分页，调用SetDisplayMode()</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;SetDisplayMode(</span><span class="string">&#39;fullwidth&#39;</span><span>);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;使用压缩，调用SetCompression()</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;SetCompression(true);</span></li>
		<li>
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;设置PDF文件版本号，默认为1.3，即4.x以上Adobe&nbsp;Reader可读</span></li>
		<li class="alt">
			<span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;PDFVersion = </span><span class="string">&#39;1.3&#39;</span><span>;</span></li>
		<li>
			<span>}</span></li>
	</ol>
</div>
<p>
	　　构造函数中调用了2个私有方法 _dochecks() 和 _getpageformat()，还有5个公共方法 Error()、SetMargins()、SetAutoPageBreak()、SetDisplayMode() 和 SetCompression()，下一篇逐个分析它们。</p>
]]></description>
			<link>http://www.lakeice.com/?action=show&amp;id=8</link>
			<category domain="http://www.lakeice.com/?cid=16">PHP研究</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=fpdf">fpdf</category>
			<category domain="http://www.lakeice.com/?action=article&amp;tag=php">php</category>
			<pubDate>Fri, 13 Feb 2009 20:22:23 +0000</pubDate>
		</item>
	</channel>
</rss>

