新增 PHP 2 个章节内容。

+YUCHENG HU+



git-svn-id: https://svn.code.sf.net/p/hawebs/svn@524 a2543c7e-f6e9-4f8a-8bff-1ffc34733512
This commit is contained in:
YuCheng Hu
2010-07-20 04:52:15 +00:00
parent 6a03cc721c
commit 83344c4eae
6 changed files with 233 additions and 43 deletions
@@ -31,18 +31,18 @@
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
-->
<map title="Java 编码规范" id="zencart-tutorials">
<map title="PHP 入门指南" id="php_getting_started">
<topicmeta>
<copyright>
<copyryear year="2006, 2010"/>
<copyrholder>HAWEBS信息技术股份有限公司</copyrholder>
</copyright>
<prodinfo>
<prodname>Java 编码规范</prodname>
<prodname>PHP 入门指南</prodname>
<vrmlist>
<vrm version="1.0.0.0"/>
</vrmlist>
<brand>HAWEBS ZEN Java 编码规范</brand>
<brand>HAWEBS PHP 入门指南</brand>
</prodinfo>
</topicmeta>
<reltable>
@@ -61,5 +61,7 @@
<topicref href="tasks/info/apachelicense.dita"/>
<topicref href="tasks/chapter1/chapter1.dita">
<topicref href="tasks/chapter1/chapter1_1.dita"/>
<topicref href="tasks/chapter1/chapter1_2.dita"/>
<topicref href="tasks/chapter1/chapter1_3.dita"/>
</topicref>
</map>
@@ -45,10 +45,16 @@
</metadata>
</prolog>
<conbody>
<p/>
<p>JavaMail API的设计是,为收发信息提供与协议无关的访问。方式是把该API划分成两个部分:<ul>
<li>该API的第一个部分是本课程的重点。基本上是如何发送和接收独立于提供程序/协议的消息。</li>
<li>第二个部分则使用特定的协议语言,如:SMTP、POP、IMAP和NNTP。如果要让JavaMail API与服务器通信,就需要为之提供协议。由于Sun公司对特定协议提供程序有充分的介绍,用户可以免费获取,所以本课程没有介绍创建特定协议提供程序的内容。</li>
</ul></p>
<p>PHP,一个嵌套的缩写名称,是英文“超级文本预处理语言”(PHP:Hypertext Preprocessor)的缩写。
</p>
<p>PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的“嵌入HTML文档的脚本语言”,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。
</p>
<p>它可以比 CGI 或者 Perl 更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的 CGI要高许多;与同样是嵌入HTML文档的脚本语言JavaScript相比,PHP在服务器端执行,成分利用了服务器的性能;PHP执行引擎还会将用户经常访问的PHP程序驻留在内存中,其他用户在一次访问这个程序时就不需要诚信编译程序了,只要直接执行内存中的代码就可以了,这也是PHP高效率的体现之一。</p>
<p>PHP具有非常强大的功能,所有的CGI或者JavaScript的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。</p>
<p>
所以php文件的打开可以使用文本编辑器即可,可以使用dreamweaver,如果其需要执行解释的话,就需要电脑上安装apache或者iis等服务器环境了的。一般情况php是配合mysql和apache一起使用的,他们是web开发的黄金组合,都是免费的软件。</p>
</conbody>
</concept>
@@ -33,47 +33,25 @@
-->
<concept id="chapter1_1" xml:lang="zh">
<title>相关协议</title>
<title>PHP 的优点</title>
<prolog>
<metadata>
<keywords>
<indexterm>Java</indexterm>
<indexterm>Mail</indexterm>
<indexterm>API</indexterm>
<indexterm>HAWEBS</indexterm>
<indexterm>PHP</indexterm>
<indexterm>程序设计</indexterm>
</keywords>
</metadata>
</prolog>
<conbody>
<p>在学习JavaMail API的深层知识之前,让我们回过头来看一看在该API中使用的协议,本质上有4种人们常用的协议:</p>
<p><ul>
<li>SMTP</li>
<li>POP</li>
<li>IMAP</li>
<li>MIME</li>
</ul></p>
<p>您还需要了解NNTP及其他一些协议。理解这些协议的基本原理有助于您理解如何使用JavaMail API。而该API的设计要与协议无关,所以不能克服这些基础协议的限制。如果选用的协议不支持某种功能,那么JavaMail API也无法在其上添加这种功能。(正如您一会儿就会看到的,在操作POP协议时,常常会碰到这种问题)。</p>
<p><ul>
<li>
<p>SMTP</p>
<p>简单邮件传输协议(SMTP)是用于传送电子邮件的机制。在JavaMail API环境中,您的基于JavaMail的程序将与您公司或Internet服务提供商(ISP)的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。</p>
</li>
<li>
<p>POP</p>
<p>POP的含义是邮局协议,当前的版本为3,也称作POP3,该协议是在RFC 1939中定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或Microsoft Outlook之类的邮件程序中,能为您记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用JavaMail API时,如果想获取这类信息,将需要由自己进行计算。</p>
</li>
<li>
<p>IMAP</p>
<p>IMAP是用于接收消息的更加高级的协议,它是在RFC 2060中定义的。IMAP的含义是“Internet消息访问协议”,当前版本是第4版,也称作IMAP4。使用IMAP时,您的邮件服务器必须支持该协议。您不能只是简单地把程序转变为支持IMAP,而不是支持POP,就指望能支持IMAP中的一切。假定您的邮件服务器支持IMAP,那么基于JavaMail的程序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的功能。
由于IMAP协议具有更高级的功能,您也许会想IMAP应该被每一个人使用,但事实不是这样。因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭受损失。而使用POP协议时,已保存消息可以解除服务器的重负。</p>
</li>
<li>
<p>MIME</p>
<p>MIME的含义是“多用途的网际邮件扩充协议”。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC 822、RFC 2045、RFC 2046和RFC 2047。作为JavaMail API的用户,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。</p>
</li>
<li>
<p>NNP和其他协议</p>
<p>由于JavaMail API分开了提供程序和其他部分,所以您可以轻松地为附加协议添加支持。Sun公司提供第3方提供程序清单,这些提供程序要利用 Sun公司不支持的少见的协议。在这份清单中,您将会看到对NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。</p>
</li>
</ul></p>
<p><ol>
<li>跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP (Linux/Apache/Mysql/PHP)或者FAMP(FreeBSD/Apache/Mysql/PHP)结合,或者数据应用够大可以考虑换 PostgreSQL或者Oracle,支持N种数据库。(N &gt;= 10</li>
<li>语法简单,如果有学习C和Perl的很容易上手,并且跟ASP有部分类似。有成熟的开发工具,比如NuPHPed,或者Zend Studio等等,再Linux平台下可以使用Eclipse等等。</li>
<li>目前主流技术都支持,比如WebService、Ajax、XML等等,足够应用。</li>
<li>有比较完整的支持,比如使用ADODB或者PEAR::DB做数据库抽象层,用Smarty或者smart template做模板层,如果是PHP 5.1的话,还能够使用PDOPHP Data Object)来访问数据库。</li>
<li>有很成熟的框架,比支持MVC的框架:phpMVC,支持类似ASP.net的事件驱动的框架:Prado,支持类似Ruby On Rails的快速开发的框架:Cake等等,足够满足你的应用需求。 PHP6. P</li>
<li>有成熟的社区来支持PHP的开发,比如国内的CSDN,喜悦国际村等等。 </li>
<li>目前已经很多大型应用都是使用PHP,比如淘宝网、Yahoo、163、Sina等等大型门户,很多选用PHP来作为他们的开发语言,所以大型门户都能够选用它,我想足够能够你的使用了。</li>
</ol></p>
</conbody>
</concept>
@@ -0,0 +1,62 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd" []>
<!--
**
* Copyright (C) 2006-2010 YUCHENG HU
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
* HA WEBSYSTEMS
* http://www.hawebs.net
* http://www.tcivis.com
*
* Contact
* huyuchengus@gmail.com / yuchenghu@hawebs.net
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
* GNU GENERAL PUBLIC LICENSE
* APACHE LICENSE, VERSION 2.0
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
-->
<concept id="chapter1_2" xml:lang="zh">
<title>PHP5 与 PHP4的不同点</title>
<prolog>
<metadata>
<keywords>
<indexterm>HAWEBS</indexterm>
<indexterm>PHP</indexterm>
<indexterm>程序设计</indexterm>
</keywords>
</metadata>
</prolog>
<conbody>
<p>PHP5提供了更加完善的面向对象的程序设计(OOP)</p>
<p>构造函数和析构函数<ul>
<li>在PHP4中,当函数与对象同名时,这个函数将成为该对象的构造函数,并且在PHP$中没有析构函数的概念。</li>
<li>在PHP5中,构造函数被统一命名为 __construct,并且引入了析构函数的概念,被统一命名为 __destruct。</li>
</ul></p>
<p>在 PHP4中,传递变量给一个函数或方法,实际是把这个变量做了一次复制,也就意味着你传给函数或方法的是这个变量的一个副本,除非你使用了引用符号 “&amp;” 来声明是要做一个引用,而不是一个 Copy。在PHP5中,对象总是以引用的形式存在的,对象中的赋值操作同样也都是一个引用操作。</p>
<p>PHP4中,一个对象的所有方法和变量都是公共的,这意味着你可以在一个对象的外部操作其中的任意一个变量和方法。</p>
<p>PHP5引入了三种新的用来控制这种存取权限的模式,它们是:公共的(Public)、受保护的(Protected)及私有的(Private)。<ul>
<li>公共模式(Public):允许在对象外部进行操作控制。</li>
<li>私有模式(Private):只允许本对象内的方法对其进行操作控制。</li>
<li>受保护模式(Protected):允许本对象及其父对象对其进行操作控制。</li>
</ul></p>
<p>接口 (Interfaces)</p>
<p>PHP4 中的对象支持继承,要使一个对象成为另一个对象的派生类,你需要使用类似 “class foo extends parent” 的代码来控制。PHP4和PHP5中,一个对象都仅能继承一次,多重继承是不被支持的。不过,在PHP5中产生了一个新的名词:接口,接口是一个没有具体处理代码的特殊对象,它仅仅定义了一些方法的名称及参数,此后的对象就可以方便的使用 &apos;implement&apos; 关键字把需要的接口整合起来,然后再加入具体的执行代码。</p>
</conbody>
</concept>
@@ -0,0 +1,58 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd" []>
<!--
**
* Copyright (C) 2006-2010 YUCHENG HU
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
* HA WEBSYSTEMS
* http://www.hawebs.net
* http://www.tcivis.com
*
* Contact
* huyuchengus@gmail.com / yuchenghu@hawebs.net
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
* GNU GENERAL PUBLIC LICENSE
* APACHE LICENSE, VERSION 2.0
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
-->
<concept id="chapter1_3" xml:lang="zh">
<title>PHP 环境配置</title>
<prolog>
<metadata>
<keywords>
<indexterm>HAWEBS</indexterm>
<indexterm>PHP</indexterm>
<indexterm>程序设计</indexterm>
</keywords>
</metadata>
</prolog>
<conbody>
<p>php最经典的组合当然是LAMP(Linux+Apache+MySQL+PHP)了,如果你我没有条件和精力弄Linux,你可以用 Windows 代替Linux。</p>
<p>如果你为你的公司或者个人部署,建议是用 Linux 的服务器,在服务器领域 Linux/Unix 还是要比 Windows 稳定很多。</p>
<p>一般情况下,各种开发环境是可以共存的。</p>
<p>唯一不同的是,你需要为你的环境指定不同的端口。</p>
<p>如果你的计算机中已经装了 Tomcat 或者 IIS, 你的80 端口很有可能会这些服务器占用。</p>
<p>一般来说,如果不做 Asp.net 的开发,我一般停止 IIS 的服务。</p>
<p>Tomcat 我一般指定为 8080 端口。</p>
<p>如果你IIS也需要,那么你可以为你的 IIS 指定 81 或者其他端口。</p>
<p>这样各种 Web 服务器一般都是可以在你机器上共存的。</p>
<p>需要注意的是,80 端口为 http 的默认端口,给 Apache 80 端口是因为我有很多应用是通过 http 直接访问的,我不希望我的用户还需要输入端口,同时你也可以为你的 Apache 部署大量的静态页,Apache 比较稳定,在处理静态页面的效率也非常高。</p>
</conbody>
</concept>
@@ -0,0 +1,84 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd" []>
<!--
**
* Copyright (C) 2006-2010 YUCHENG HU
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
* HA WEBSYSTEMS
* http://www.hawebs.net
* http://www.tcivis.com
*
* Contact
* huyuchengus@gmail.com / yuchenghu@hawebs.net
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
* GNU GENERAL PUBLIC LICENSE
* APACHE LICENSE, VERSION 2.0
*
* +++++++++++++++++++++++++++++++++++++++++++++++++
-->
<concept id="chapter1_3" xml:lang="zh">
<title>PHP 小技巧</title>
<prolog>
<metadata>
<keywords>
<indexterm>HAWEBS</indexterm>
<indexterm>PHP</indexterm>
<indexterm>程序设计</indexterm>
</keywords>
</metadata>
</prolog>
<conbody>
<p><ul>
<li>
<p>PHP 对utf-8 编码文件的标记BOM导致的页面空行</p>
<p>这个问题以前在学习xhtml+css的时候遇到过,那时候是因为文档声明类型前面加别的代码了或者没有写文档声明类型xhtml1.0却用w3c的标准做页面导致的,起初我以为也是把require写在文档声明前面出的问题呢,后来反复调试发现不是这么简单,后来上搜索了很多关于require引起空行的问题,有一个牛人提到了要在dreamweaver里面ctrl+j把utf-8编码的BOM去掉,当时也不懂BOM是啥,说去掉就去掉吧,确实解决问题了,这算是把这一关过去了,不过后面还有utf-8的问题呢,也是跟这个有关系。</p>
<p>在UCS 编码中有一个叫做&quot;ZERO WIDTH NO-BREAK SPACE&quot;的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;又被称作BOM。</p>
<p>UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。</p>
<p>Windows就是使用BOM来标记文本文件的编码方式的。</p>
<p>下面是一篇来自网络上的文章,有人也遇到了和我们差不多的情况。</p>
<p>我这里摘录过来了,供大家参考下。</p>
<p>在调测一个UTF8编码的中文Zen Cart网站时遇到一件怪事,网页显示文字正常,用IE的察看源文件(记事本打开)却发现乱码,firefox没有这个问题。经在网上多方查证和多次测试,解决了这个问题,其实是UTF-8文件的Unicode签名BOM(Byte Order Mark)问题。</p>
<p>BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。</p>
<p>微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。</p>
<p>也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。</p>
<p><ol>
<li>用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF。</li>
<li>用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。</li>
<li>用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。</li>
</ol></p>
<p>我找到Zen Cart的模版文件中的html_header.php,发现文件果然不带BOM,用UltraEdit-32另存为的方式加上BOM后,再上传 html_header.php,一切正常。</p>
<p>注意用Convertz把gb2312文件转换成UTF-8文件时,默认设置是不带BOM的。不带BOM可能出现上述乱码问题,但是带 BOM,对于php的include文件要小心,会在php字节流前面多出EF BB BF,提前输出到显示器有可能会带来程序错误。一个解决方案是凡是被include的文件都保存为ANSI,主文件可以是UTF-8。要想把一个文件去掉 BOM,使用UlterEdit打开, 切换到十六进制编辑模式,把最前面三个字节(就是那该死的 EF BB BF)替换为20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了。</p>
<p>另外还学到一些编码的小知识:所谓的unicode保存的文件实际上是utf-16,只不过恰好跟unicode的码相同而已,但在概念上 unicode与utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。非unicode官方的utf编码还有utf-7,主要用于邮件传输。utf-8的单字节部分是和iso-8859-1兼容的,这主要是一些旧的系统和库函数不能正确处理utf-16而被迫出来的,而且对英语字符来说,也节省保存的文件空间(以非英语字符浪费空间为代价)。在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它字符的时候,utf-8会使用两个或三个字节。 </p>
</li>
<li>
<p>php下checkbox的取值问题</p>
<p>这是 php 一个不方便的地方,不像asp那样,所有同名的checkbox的值存成一个集合,php 只能取同名里最后一个checkbox的值,在做多数据where in (aa,bb,cc,dd)查询的时候很不方便,只能用 JS 加一个hidden input的方法实现,虽然有点小麻烦,不过不是大问题,很容易就解决了,上网查了一下也确实只有这么才能解决!</p>
</li>
<li>
<p>PHP 连接 MySQL 数据库的问题</p>
<p>毕竟数据库已经设计好了,再在PHPMyAdmin中建一次表也很麻烦,索性找个软件来直接转库,还不错让我找到各爆好用的软件,不过全英文界面,库很轻松的转过来了,但是我手很贱,看到MySQL里面的data文件夹下有和我建的数据库一样名字的文件夹,我以为有这个文件夹就不用建库倒库了,一时兴起把没用的都删掉了。</p>
<p>问题来了PHPMyAdmin连不上库了,这个倒是好解决,重装了一次MySQL解决问题,可是我没备份就换回ASP环境,再换回来的时候MySQL出大问题了,重装都不管用了,牛人给了答案“把 libmysql.dll和php5ts.dll考到system32下”。</p>
<p>Mysql 的动态库执行需要依赖一些其他的动态库。</p>
<p>为了方便,我一半将 PHP 根目录下面的动态库拷贝的 Apache 的bin 文件夹下面,这样能够避免动态库的丢失。</p>
<p>你也可以拷贝到 System32 这个目录下,但是这样容易干扰系统库,不建议这样的方式。</p>
<p>如果拷贝到 Apache 的bin 目录下不能解决问题,那也请拷贝到 System32目录下。</p>
</li>
</ul></p>
</conbody>
</concept>