﻿
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>好易阁-品味互联网人生 &#187; WEB编程</title>
	<atom:link href="http://www.helloyi.cn/index.php/category/web-lg/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.helloyi.cn</link>
	<description>春色三分,二分尘土,一分流水</description>
	<lastBuildDate>Fri, 30 Sep 2011 08:46:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Secret Socks for Mac OSX 翻墙工具</title>
		<link>http://www.helloyi.cn/index.php/2011/08/26/secret-socks-for-mac-osx-%e7%bf%bb%e5%a2%99%e5%b7%a5%e5%85%b7/</link>
		<comments>http://www.helloyi.cn/index.php/2011/08/26/secret-socks-for-mac-osx-%e7%bf%bb%e5%a2%99%e5%b7%a5%e5%85%b7/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 07:38:54 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[网页设计]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3377</guid>
		<description><![CDATA[Secret Socks 是mac osx 下的一款翻墙工具类似于windows下面的MyEnTunnel工具，通一个SSH帐号设置就可以进行完成翻墙 可以是全局性的，你也可以通过firefox下面的AoutoProy插件进行浏览器翻墙，其它网络不影响。 如果需要取消SSH翻墙上网，关闭Secret Socks 连接同时需要到-》打开网络偏号设置-》高级-》代理-》中取消SOCKS才行 下载 ：http://socks.nihilex.com/SecretSocks-1.0.2.dmg]]></description>
			<content:encoded><![CDATA[<p>Secret Socks 是mac osx 下的一款翻墙工具类似于windows下面的MyEnTunnel工具，通一个SSH帐号设置就可以进行完成翻墙</p>
<p>可以是全局性的，你也可以通过firefox下面的AoutoProy插件进行浏览器翻墙，其它网络不影响。</p>
<p>如果需要取消SSH翻墙上网，关闭Secret Socks 连接同时需要到-》打开网络偏号设置-》高级-》代理-》中取消SOCKS才行</p>
<p><span id="more-3377"></span></p>
<p>下载 ：http://socks.nihilex.com/SecretSocks-1.0.2.dmg</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2011/08/26/secret-socks-for-mac-osx-%e7%bf%bb%e5%a2%99%e5%b7%a5%e5%85%b7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web编程基础知识-之HTTP状态码复习篇</title>
		<link>http://www.helloyi.cn/index.php/2011/04/04/web-programme-base-http-status-code/</link>
		<comments>http://www.helloyi.cn/index.php/2011/04/04/web-programme-base-http-status-code/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 14:16:51 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB编程]]></category>
		<category><![CDATA[http协议]]></category>
		<category><![CDATA[HTTP状态码]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3339</guid>
		<description><![CDATA[对于从事Web编程人员来说，熟悉了解HTTP协议的状态码是很有必要的，很多时侯可能根据HTTP协议的状态码很快就能定位到错误信息！今天整理复习了一下所有HTTP状态码. HTTP状态码:（HTTP Status Code）是用以表示网页服务器HTTP响应状态的3位数字代码。它由RFC 2616规范定义的，并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。（&#8212;&#8212;wikipedia解释) HTTP/1.1定义的状态码值和对应的原因短语（Reason-Phrase）的例子. lXX表示:客户端错误 &#8220;100&#8243; : Continue  客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收，且仍未被拒绝。客户端应当继续发送请求的剩余部分. &#8220;101&#8243; : witching Protocols 服务器已经理解了客户端的请求，并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后，服务器将会切换到在Upgrade消息头中定义的那些协议。: 只有在切换新的协议更有好处的时候才应该采取类似措施. &#8220;102&#8243;: Processing  由WebDAV（RFC 2518）扩展的状态码，代表处理将被继续执行。 2XX表示:成功 &#8220;200&#8243; : OK &#8220;201&#8243; : Created 已创建 &#8220;202&#8243; : Accepted 接收 &#8220;203&#8243; : Non-Authoritative Information 非认证信息 &#8220;204&#8243; : No Content 无内容 &#8220;205&#8243; : Reset Content 重置内容 &#8220;206&#8243; : [...]]]></description>
			<content:encoded><![CDATA[<p>对于从事Web编程人员来说，熟悉了解HTTP协议的状态码是很有必要的，很多时侯可能根据HTTP协议的状态码很快就能定位到错误信息！今天整理复习了一下所有HTTP状态码.</p>
<p><strong> HTTP状态码:</strong>（HTTP Status Code）是用以表示<a href="http://zh.wikipedia.org/wiki/%E7%B6%B2%E9%A0%81%E4%BC%BA%E6%9C%8D%E5%99%A8">网页服务器</a><a title="HTTP" href="http://zh.wikipedia.org/wiki/HTTP">HTTP</a>响应状态的3位数字代码。它由<a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a>规范定义的，并得到<a href="http://tools.ietf.org/html/rfc2518">RFC 2518</a>、<a href="http://tools.ietf.org/html/rfc2817">RFC 2817</a>、<a href="http://tools.ietf.org/html/rfc2295">RFC 2295</a>、<a href="http://tools.ietf.org/html/rfc2774">RFC 2774</a>、<a href="http://tools.ietf.org/html/rfc4918">RFC 4918</a>等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。（&#8212;&#8212;wikipedia解释)<span id="more-3339"></span><br />
HTTP/1.1定义的状态码值和对应的原因短语（Reason-Phrase）的例子.</p>
<p>lXX表示:客户端错误</p>
<p>&#8220;100&#8243; : Continue  客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收，且仍未被拒绝。客户端应当继续发送请求的剩余部分.</p>
<p>&#8220;101&#8243; : witching Protocols 服务器已经理解了客户端的请求，并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后，服务器将会切换到在Upgrade消息头中定义的那些协议。: 只有在切换新的协议更有好处的时候才应该采取类似措施.</p>
<p>&#8220;102&#8243;: Processing  由WebDAV（RFC 2518）扩展的状态码，代表处理将被继续执行。</p>
<p>2XX表示:成功</p>
<p>&#8220;200&#8243; : OK</p>
<p>&#8220;201&#8243; : Created 已创建</p>
<p>&#8220;202&#8243; : Accepted 接收</p>
<p>&#8220;203&#8243; : Non-Authoritative Information 非认证信息</p>
<p>&#8220;204&#8243; : No Content 无内容</p>
<p>&#8220;205&#8243; : Reset Content 重置内容</p>
<p>&#8220;206&#8243; : Partial Content 服务器已经成功处理了部分GET请求。类似于<a title="FlashGet" href="http://zh.wikipedia.org/wiki/FlashGet">FlashGet</a>或者<a href="http://zh.wikipedia.org/wiki/%E8%BF%85%E9%9B%B7">迅雷</a>这类的HTTP <a title="Category:下载工具" href="http://zh.wikipedia.org/wiki/Category:%E4%B8%8B%E8%BC%89%E5%B7%A5%E5%85%B7">下载工具</a>都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。</p>
<p>&#8220;207&#8243;: Multi-Status<br />
由WebDAV(RFC 2518)扩展的状态码，代表之后的消息体将是一个XML消息，并且可能依照之前子请求数量的不同，包含一系列独立的响应代码.<br />
3XX表示: 重定向</p>
<p>&#8220;300&#8243; : Multiple Choices 多路选择</p>
<p>&#8220;301&#8243; : Moved Permanently  永久转移</p>
<p>&#8220;302&#8243; : Found 暂时转移</p>
<p>&#8220;303&#8243; : See Other 参见其它</p>
<p>&#8220;304&#8243; : Not Modified 未修改</p>
<p>&#8220;305&#8243; : Use Proxy 使用代理</p>
<dl>
<dt>&#8220;306&#8243;: Switch Proxy  在最新版的规范中，306状态码已经不再被使用。</dt>
</dl>
<p>&#8220;307&#8243; : Temporary Redirect 请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的，客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下，这个响应才是可缓存的。</p>
<p>4XX表示: 客户端错误</p>
<p>&#8220;400&#8243; : Bad Request 错误请求</p>
<p>&#8220;401&#8243; : Unauthorized 未认证</p>
<p>&#8220;402&#8243; : Payment Required 需要付费</p>
<p>&#8220;403&#8243; : Forbidden 禁止</p>
<p>&#8220;404&#8243; : Not Found  请求失败，请求所希望得到的资源未被在服务器上发现</p>
<p>&#8220;405&#8243; : Method Not Allowed 方法不允许</p>
<p>&#8220;406&#8243; : Not Acceptable 不接受</p>
<p>&#8220;407&#8243; : Proxy Authentication Required 需要代理认证</p>
<p>&#8220;408&#8243; : Request Time-out 请求超时</p>
<p>&#8220;409&#8243; : Conflict 冲突</p>
<p>&#8220;410&#8243; : Gone 失败</p>
<p>&#8220;411&#8243; : Length Required 需要长度</p>
<p>&#8220;412&#8243; : Precondition Failed 条件失败</p>
<p>&#8220;413&#8243; : Request Entity Too Large 请求实体太大</p>
<p>&#8220;414&#8243; : Request-URI Too Large 请求URI太长</p>
<p>&#8220;415&#8243; : Unsupported Media Type 不支持媒体类型</p>
<p>&#8220;416&#8243; : Requested range not satisfiable 如果请求中包含了Range请求头，并且Range中指定的任何数据范围都与当前资源的可用范围不重合，同时请求中又没有定义If-Range请求头，那么服务器就应当返回416状态码。<br />
&#8220;417&#8243; : Expectation Failed 在请求头Expect中指定的预期内容无法被服务器满足</p>
<p>&#8220;421 &#8220;:There are too many connections from your internet address<br />
从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常，这里的IP地址指的是从服务器上看到的客户端地址.<br />
&#8220;422&#8243;: Unprocessable Entity<br />
请求格式正确，但是由于含有语义错误，无法响应。（RFC 4918 WebDAV）<br />
&#8220;423&#8243;: Locked<br />
当前资源被锁定。（RFC 4918 WebDAV）<br />
&#8220;424&#8243;: Failed Dependency<br />
由于之前的某个请求发生的错误，导致当前请求失败，例如PROPPATCH。（RFC 4918 WebDAV）<br />
&#8220;425&#8243;: Unordered Collection<br />
在WebDav Advanced Collections草案中定义，但是未出现在《WebDAV顺序集协议》（RFC 3658）中。<br />
&#8220;426&#8243;:Upgrade Required<br />
客户端应当切换到TLS/1.0。（RFC 2817）<br />
&#8220;449&#8243;: Retry With<br />
由微软扩展，代表请求应当在执行完适当的操作后进行重试。</p>
<p>5XX表示: 服务器错误</p>
<p>&#8220;500&#8243; : Internal Server Error  服务器遇到了一个未曾预料的状况，导致了它无法完成对请求的处理。一般来说，这个问题都会在服务器的程序码出错时出现</p>
<p>&#8220;501&#8243; : Not Implemented 未实现</p>
<p>&#8220;502&#8243; : Bad Gateway  作为<a href="http://zh.wikipedia.org/wiki/%E7%BD%91%E5%85%B3">网关</a>或者<a title="代理服务器" href="http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8">代理</a>工作的服务器尝试执行请求时，从上游服务器接收到无效的响应</p>
<p>&#8220;503&#8243; : Service Unavailable 由于临时的服务器维护或者<a title="过载" href="http://zh.wikipedia.org/w/index.php?title=%E8%BF%87%E8%BD%BD&amp;action=edit&amp;redlink=1">过载</a>，服务器当前无法处理请求。这个状况是临时的，并且将在一段时间以后恢复。<br />
&#8220;504&#8243; : Gateway Time-out 网关超时</p>
<p>&#8220;505&#8243; : HTTP Version not supported  服务器不支持，或者拒绝支持在请求中使用的HTTP版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。</p>
<dl>
<dt>506 Variant Also Negotiates</dt>
<dd>由《透明内容协商协议》（<a href="http://tools.ietf.org/html/rfc2295">RFC 2295</a>）扩展，代表服务器存在内部配置错误：被请求的协商变元资源被配置为在透明内容协商中使用自己，因此在一个协商处理中不是一个合适的重点。</dd>
<dt>507 Insufficient Storage</dt>
<dd>服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV（<a href="http://tools.ietf.org/html/rfc4918">RFC 4918</a>）</dd>
<dt>509 Bandwidth Limit Exceeded</dt>
<dd>服务器达到<a href="http://zh.wikipedia.org/wiki/%E5%B8%A6%E5%AE%BD">带宽</a>限制。这不是一个官方的状态码，但是仍被广泛使用。</dd>
<dt>510 Not Extended</dt>
<dd>获取资源所需要的策略并没有没满足。（<a href="http://tools.ietf.org/html/rfc2774">RFC 2774</a>）</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2011/04/04/web-programme-base-http-status-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>细说javaScript-document对象</title>
		<link>http://www.helloyi.cn/index.php/2010/11/10/javascript-document-2/</link>
		<comments>http://www.helloyi.cn/index.php/2010/11/10/javascript-document-2/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 12:01:04 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB前端]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3318</guid>
		<description><![CDATA[Document对象内容集合 document 文挡对象 &#8211; JavaScript脚本语言描述 注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写 否则会提示你一个错误信息 “引用的元素为空或者不是对象\\\\\” 对象属性 document.title //设置文档标题等价于HTML的title标签 document.bgColor //设置页面背景色 document.fgColor //设置前景色(文本颜色) document.linkColor //未点击过的链接颜色 document.alinkColor //激活链接(焦点在此链接上)的颜色 document.vlinkColor //已点击过的链接颜色 document.URL //设置URL属性从而在同一窗口打开另一网页 document.fileCreatedDate //文件建立日期，只读属性 document.fileModifiedDate //文件修改日期，只读属性 document.fileSize //文件大小，只读属性 document.cookie //设置和读出cookie document.charset //设置字符集 简体中文:gb2312 ——————————————————————— 常用对象方法 document.write() //动态向页面写入内容 document.createElement(Tag) //创建一个html标签对象 document.getElementById(ID) //获得指定ID值的对象 document.getElementsByName(Name) //获得指定Name值的对象 document.body.appendChild(oTag) ——————————————————————— body-主体子对象 document.body //指定文档主体的开始和结束等价于body&#62;/body&#62; document.body.bgColor //设置或获取对象后面的背景颜色 document.body.link //未点击过的链接颜色 document.body.alink //激活链接(焦点在此链接上)的颜色 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff; font-size: large;">Document对象内容集合</span></p>
<div>
<p>document 文挡对象 &#8211; JavaScript脚本语言描述<br />
注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写<br />
否则会提示你一个错误信息 “引用的元素为空或者不是对象\\\\\”</p>
<p><span id="more-3318"></span>对象属性<br />
document.title //设置文档标题等价于HTML的title标签<br />
document.bgColor //设置页面背景色<br />
document.fgColor //设置前景色(文本颜色)<br />
document.linkColor //未点击过的链接颜色<br />
document.alinkColor //激活链接(焦点在此链接上)的颜色<br />
document.vlinkColor //已点击过的链接颜色<br />
document.URL //设置URL属性从而在同一窗口打开另一网页<br />
document.fileCreatedDate //文件建立日期，只读属性<br />
document.fileModifiedDate //文件修改日期，只读属性<br />
document.fileSize //文件大小，只读属性<br />
document.cookie //设置和读出cookie<br />
document.charset //设置字符集 简体中文:gb2312<br />
———————————————————————<br />
常用对象方法<br />
document.write() //动态向页面写入内容<br />
document.createElement(Tag) //创建一个html标签对象<br />
document.getElementById(ID) //获得指定ID值的对象<br />
document.getElementsByName(Name) //获得指定Name值的对象<br />
document.body.appendChild(oTag)<br />
———————————————————————</p>
<p><span id="more-80"> </span></p>
<p>body-主体子对象<br />
document.body //指定文档主体的开始和结束等价于body&gt;/body&gt;<br />
document.body.bgColor //设置或获取对象后面的背景颜色<br />
document.body.link //未点击过的链接颜色<br />
document.body.alink //激活链接(焦点在此链接上)的颜色<br />
document.body.vlink //已点击过的链接颜色<br />
document.body.text //文本色<br />
document.body.innerText //设置body&gt;…/body&gt;之间的文本<br />
document.body.innerHTML //设置body&gt;…/body&gt;之间的HTML代码<br />
document.body.topMargin //页面上边距<br />
document.body.leftMargin //页面左边距<br />
document.body.rightMargin //页面右边距<br />
document.body.bottomMargin //页面下边距<br />
document.body.background //背景图片</p>
<p>document.body.appendChild(oTag) //动态生成一个HTML对象</p>
<p>常用对象事件<br />
document.body.onclick=”func()” //鼠标指针单击对象是触发<br />
document.body.onmouseover=”func()” //鼠标指针移到对象时触发<br />
document.body.onmouseout=”func()” //鼠标指针移出对象时触发<br />
———————————————————————<br />
location-位置子对象</p>
<p>document.location.hash // #号后的部分<br />
document.location.host // 域名+端口号<br />
document.location.hostname // 域名<br />
document.location.href // 完整URL<br />
document.location.pathname // 目录部分<br />
document.location.port // 端口号<br />
document.location.protocol // 网络协议(http:)<br />
document.location.search // ?号后的部分</p>
<p>documeny.location.reload() //刷新网页<br />
document.location.reload(URL) //打开新的网页<br />
document.location.assign(URL) //打开新的网页<br />
document.location.replace(URL) //打开新的网页<br />
———————————————————————<br />
selection-选区子对象<br />
document.selection</p>
<p>images集合(页面中的图象)</p>
<p>a)通过集合引用<br />
document.images //对应页面上的img标签<br />
document.images.length //对应页面上img标签的个数<br />
document.images[0] //第1个img标签<br />
document.images[i] //第i-1个img标签</p>
<p>b)通过nane属性直接引用<br />
img name=”oImage”<br />
document.images.oImage //document.images.name属性</p>
<p>c)引用图片的src属性<br />
document.images.oImage.src //document.images.name属性.src</p>
<p>d)创建一个图象<br />
var oImage<br />
oImage = new Image()<br />
document.images.oImage.src=”1.jpg”<br />
同时在页面上建立一个img /标签与之对应就可以显示</p>
<p>———————————————————————-</p>
<p>forms集合(页面中的表单)</p>
<p>a)通过集合引用<br />
document.forms //对应页面上的form标签<br />
document.forms.length //对应页面上/formform标签的个数<br />
document.forms[0] //第1个/formform标签<br />
document.forms[i] //第i-1个/formform标签<br />
document.forms[i].length //第i-1个/formform中的控件数<br />
document.forms[i].elements[j] //第i-1个/formform中第j-1个控件</p>
<p>b)通过标签name属性直接引用<br />
/formform name=”Myform”&gt;input name=”myctrl”/&gt;/form<br />
document.Myform.myctrl //document.表单名.控件名</p>
<p>c)访问表单的属性<br />
document.forms[i].name //对应form name&gt;属性<br />
document.forms[i].action //对应/formform action&gt;属性<br />
document.forms[i].encoding //对应/formform enctype&gt;属性<br />
document.forms[i].target //对应/formform target&gt;属性</p>
<p>document.forms[i].appendChild(oTag) //动态插入一个控件<br />
document.all.oDiv //引用图层oDiv<br />
document.all.oDiv.style.display=” //图层设置为可视<br />
document.all.oDiv.style.display=”none” //图层设置为隐藏<br />
document.getElementId(”oDiv”) //通过getElementId引用对象<br />
document.getElementId(”oDiv”).style=”<br />
document.getElementId(”oDiv”).display=”none”<br />
/*document.all表示document中所有对象的集合<br />
只有ie支持此属性，因此也用来判断浏览器的种类*/</p>
<p>图层对象的4个属性<br />
document.getElementById(”ID”).innerText //动态输出文本<br />
document.getElementById(”ID”).innerHTML //动态输出HTML<br />
document.getElementById(”ID”).outerText //同innerText<br />
document.getElementById(”ID”).outerHTML //同innerHTML</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/11/10/javascript-document-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>常用的PHP正则表达式收集整理</title>
		<link>http://www.helloyi.cn/index.php/2010/10/14/common-php-preg/</link>
		<comments>http://www.helloyi.cn/index.php/2010/10/14/common-php-preg/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 02:25:50 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB编程]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3306</guid>
		<description><![CDATA[$str = preg_replace(&#8220;/(&#60;a.*?&#62;)(.*?)(&#60;\/a&#62;)/&#8221;, &#8216;\1&#60;span&#62;\2&#60;/span&#62;\3&#8242;, $str); 其中用了三个子模式（每个圆括号中内容为一个子模式），第一个是链接开始标签，第二个是链接文本，第三个是&#60;/a&#62; 然后第二个参数中\1、\2、\3就表示这三个部分，要替换成什么样子还不简单？ 获取页面中的所有链接地址的PHP函数 下面这个用PHP写的函数,可以获取任意的字符串$string中的所有链接地址($string可以是从一个HTML页面文件直接读取出来的字符串),结果保存在一个数组中返回.该函数自动把电子邮件地址排除在外,而且返回的数组中不会有重复元素. 复制代码 代码如下: function GetAllLink($string) { $string = str_replace(&#8220;\r&#8221;,&#8221;",$string); $string = str_replace(&#8220;\n&#8221;,&#8221;",$string); $regex[url] = &#8220;((http&#124;https&#124;ftp&#124;telnet&#124;news):\/\/)?([a-z0-9_\-\/\.]+\.[][a-z0-9:;&#38;#@=_~%\?\/\.\,\+\-]+)&#8221;; $regex[email] = &#8220;([a-z0-9_\-]+)@([a-z0-9_\-]+\.[a-z0-9\-\._\-]+)&#8221;; //去掉标签之间的文字 $string = eregi_replace(&#8220;&#62;[^&#60;&#62;]+&#60;&#8221;,&#8221;&#62;&#60;&#8221;, $string); //去掉JAVASCRIPT代码 $string = eregi_replace(&#8220;&#60;!&#8211;.*//&#8211;&#62;&#8221;,&#8221;", $string); //去掉非&#60;a&#62;的HTML标签 $string = eregi_replace(&#8220;&#60;[^a][^&#60;&#62;]*&#62;&#8221;,&#8221;", $string); //去掉EMAIL链接 $string = eregi_replace(&#8220;&#60;a([ ]+)href=([\"']*)mailto:($regex[email])([\"']*)[^&#62;]*&#62;&#8221;,&#8221;", $string); //替换需要的网页链接 $string = eregi_replace(&#8220;&#60;a([ ]+)href=([\"']*)($regex[url])([\"']*)[^&#62;]*&#62;&#8221;,&#8221;\\3\t&#8221;, $string); $output[0] = [...]]]></description>
			<content:encoded><![CDATA[<p>$str = preg_replace(&#8220;/(&lt;a.*?&gt;)(.*?)(&lt;\/a&gt;)/&#8221;, &#8216;\1&lt;span&gt;\2&lt;/span&gt;\3&#8242;, $str);<br />
其中用了三个子模式（每个圆括号中内容为一个子模式），第一个是链接开始标签，第二个是链接文本，第三个是&lt;/a&gt;</p>
<p>然后第二个参数中\1、\2、\3就表示这三个部分，要替换成什么样子还不简单？</p>
<p><span id="more-3306"></span></p>
<p>获取页面中的所有链接地址的PHP函数</p>
<p>下面这个用PHP写的函数,可以获取任意的字符串$string中的所有链接地址($string可以是从一个HTML页面文件直接读取出来的字符串),结果保存在一个数组中返回.该函数自动把电子邮件地址排除在外,而且返回的数组中不会有重复元素.</p>
<p>复制代码 代码如下:<br />
function GetAllLink($string)<br />
{<br />
$string = str_replace(&#8220;\r&#8221;,&#8221;",$string);<br />
$string = str_replace(&#8220;\n&#8221;,&#8221;",$string);</p>
<p>$regex[url] = &#8220;((http|https|ftp|telnet|news):\/\/)?([a-z0-9_\-\/\.]+\.[][a-z0-9:;&amp;#@=_~%\?\/\.\,\+\-]+)&#8221;;<br />
$regex[email] = &#8220;([a-z0-9_\-]+)@([a-z0-9_\-]+\.[a-z0-9\-\._\-]+)&#8221;;</p>
<p>//去掉标签之间的文字<br />
$string = eregi_replace(&#8220;&gt;[^&lt;&gt;]+&lt;&#8221;,&#8221;&gt;&lt;&#8221;, $string);</p>
<p>//去掉JAVASCRIPT代码<br />
$string = eregi_replace(&#8220;&lt;!&#8211;.*//&#8211;&gt;&#8221;,&#8221;", $string);</p>
<p>//去掉非&lt;a&gt;的HTML标签<br />
$string = eregi_replace(&#8220;&lt;[^a][^&lt;&gt;]*&gt;&#8221;,&#8221;", $string);</p>
<p>//去掉EMAIL链接<br />
$string = eregi_replace(&#8220;&lt;a([ ]+)href=([\"']*)mailto:($regex[email])([\"']*)[^&gt;]*&gt;&#8221;,&#8221;", $string);</p>
<p>//替换需要的网页链接<br />
$string = eregi_replace(&#8220;&lt;a([ ]+)href=([\"']*)($regex[url])([\"']*)[^&gt;]*&gt;&#8221;,&#8221;\\3\t&#8221;, $string);</p>
<p>$output[0] = strtok($string, &#8220;\t&#8221;);<br />
while(($temp = strtok(&#8220;\t&#8221;)))<br />
{<br />
if($temp &amp;&amp; !in_array($temp, $output))<br />
$output[++$i] = $temp;<br />
}</p>
<p>return $output;<br />
}</p>
<p>以下是以PHP的语法所写的示例<br />
验证字符串是否只含数字与英文，字符串长度并在4~16个字符之间<br />
复制代码 代码如下:<br />
&lt;?php<br />
$str = &#8216;a1234&#8242;;<br />
if (preg_match(&#8220;^[a-zA-Z0-9]{4,16}$&#8221;, $str)) {<br />
echo &#8220;验证成功&#8221;;} else {<br />
echo &#8220;验证失敗&#8221;;}?&gt;</p>
<p>简易的台湾身分证字号验证<br />
复制代码 代码如下:<br />
&lt;?php<br />
$str = &#8216;a1234&#8242;;<br />
if (preg_match(&#8220;^(?:\d{15}|\d{18})$&#8221;, $str)) {<br />
echo &#8220;验证成功&#8221;;<br />
} else {<br />
echo &#8220;验证失敗&#8221;;}<br />
?&gt;</p>
<p>下面的代码实现文字中的代码块，功能就如你在脚本之家看到的代码一样。<br />
复制代码 代码如下:<br />
function codedisp($code) {<br />
global $discuzcodes;<br />
$discuzcodes['pcodecount']++;<br />
$code = htmlspecialchars(str_replace(&#8216;\\&#8221;&#8216;, &#8216;&#8221;&#8216;, preg_replace(&#8220;/^[\n\r]*(.+?)[\n\r]*$/is&#8221;, &#8220;\\1&#8243;, $code)));<br />
$discuzcodes['codehtml'][$discuzcodes['pcodecount']] = &#8220;&lt;br&gt;&lt;div class=\&#8221;msgheader\&#8221;&gt;&lt;div class=\&#8221;right\&#8221;&gt;&lt;a href=\&#8221;###\&#8221; class=\&#8221;smalltxt\&#8221; onclick=\&#8221;copycode($(&#8216;phpcode$discuzcodes[codecount]&#8216;));\&#8221;&gt;[复制此代码]&lt;/a&gt;&lt;/div&gt;代码如下:&lt;/div&gt;&lt;div class=\&#8221;msgborder\&#8221; id=\&#8221;phpcode$discuzcodes[codecount]\&#8221;&gt;&#8221;.fhtml2($code).&#8221;&lt;/div&gt;&lt;br&gt;&#8221;;<br />
$discuzcodes['codecount']++;<br />
return &#8220;[\tDISCUZ_CODE_$discuzcodes[pcodecount]\t]&#8221;;<br />
}<br />
$message = preg_replace(&#8220;/\s*\[code\](.+?)\[\/code\]\s*/ies", "codedisp('\\1')", $message);<br />
$message = preg_replace("/\s*\[html\](.+?)\[\/html\]\s*/ies", "htmldisp('\\1')", $message);</p>
<p>匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br />
评注：匹配中文还真是个头疼的事，有了这个表达式就好办了<br />
匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />
评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br />
匹配空白行的正则表达式：\n\s*\r<br />
评注：可以用来删除空白行<br />
匹配HTML标记的正则表达式：&lt;(\S*?)[^&gt;]*&gt;.*?&lt;/\1&gt;|&lt;.*? /&gt;<br />
评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力<br />
匹配首尾空白字符的正则表达式：^\s*|\s*$<br />
评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式<br />
匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />
评注：表单验证时很实用<br />
匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*<br />
评注：网上流传的版本功能很有限，上面这个基本可以满足需求<br />
匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />
评注：表单验证时很实用<br />
匹配国内电话号码：\d{3}-\d{8}|\d{4}-\d{7}<br />
评注：匹配形式如 0511-4405222 或 021-87888822<br />
匹配腾讯QQ号：[1-9][0-9]{4,}<br />
评注：腾讯QQ号从10000开始<br />
匹配中国邮政编码：[1-9]\d{5}(?!\d)<br />
评注：中国邮政编码为6位数字<br />
匹配身份证：\d{15}|\d{18}<br />
评注：中国的身份证为15位或18位<br />
匹配ip地址：\d+\.\d+\.\d+\.\d+<br />
评注：提取ip地址时有用<br />
匹配特定数字：<br />
^[1-9]\d*$　 　 //匹配正整数<br />
^-[1-9]\d*$ 　 //匹配负整数<br />
^-?[1-9]\d*$　　 //匹配整数<br />
^[1-9]\d*|0$　 //匹配非负整数（正整数 + 0）<br />
^-[1-9]\d*|0$　　 //匹配非正整数（负整数 + 0）<br />
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　 //匹配正浮点数<br />
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　 //匹配负浮点数<br />
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　 //匹配浮点数<br />
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　 //匹配非负浮点数（正浮点数 + 0）<br />
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数 + 0）<br />
评注：处理大量数据时有用，具体应用时注意修正<br />
匹配特定字符串：<br />
^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br />
^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br />
^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br />
^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br />
^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串</p>
<p>下面是一些特殊字符：<br />
正则表达式中的特殊字符： （学习参考书－＜＜精通正则表达式＞＞）<br />
字符<br />
意义：对于字符，通常表示按字面意义，指出接着的字符为特殊字符，不作解释。<br />
例如：/b/匹配字符'b',通过在b 前面加一个反斜杠，也就是/b/，则该字符变成特殊字符，表示<br />
匹配一个单词的分界线。<br />
或者：<br />
对于几个字符，通常说明是特殊的，指出紧接着的字符不是特殊的，而应该按字面解释。<br />
例如：*是一个特殊字符，匹配任意个字符(包括0个字符)；例如：/a*/意味匹配0个或多个a。<br />
为了匹配字面上的*，在a前面加一个反斜杠；例如：/a*/匹配'a*'。</p>
<p>字符^<br />
意义：表示匹配的字符必须在最前边。<br />
例如：/^A/不匹配"an A,"中的'A'，但匹配"An A."中最前面的'A'。</p>
<p>字符$<br />
意义：与^类似，匹配最末的字符。<br />
例如：/t$/不匹配"eater"中的't'，但匹配"eat"中的't'。</p>
<p>字符*<br />
意义：匹配*前面的字符0次或n次。<br />
例如:/bo*/匹配"A ghost booooed"中的'boooo'或"A bird warbled"中的'b'，但不匹配"A goat g<br />
runted"中的任何字符。</p>
<p>字符+<br />
意义：匹配+号前面的字符1次或n次。等价于{1,}。<br />
例如：/a+/匹配"candy"中的'a'和"caaaaaaandy."中的所有'a'。</p>
<p>字符?<br />
意义：匹配?前面的字符0次或1次。<br />
例如：/e?le?/匹配"angel"中的'el'和"angle."中的'le'。</p>
<p>字符.<br />
意义：(小数点)匹配除换行符外的所有单个的字符。<br />
例如：/.n/匹配"nay, an apple is on the tree"中的'an'和'on'，但不匹配'nay'。</p>
<p>字符(x)<br />
意义：匹配'x'并记录匹配的值。<br />
例如：/(foo)/匹配和记录"foo bar."中的'foo'。匹配子串能被结果数组中的素[1], ..., [n] 返<br />
回，或被RegExp对象的属性$1, ..., $9返回。</p>
<p>字符x|y<br />
意义：匹配'x'或者'y'。<br />
例如：/green|red/匹配"green apple"中的'green'和"red apple."中的'red'。</p>
<p>字符{n}<br />
意义：这里的n是一个正整数。匹配前面的n个字符。<br />
例如：/a{2}/不匹配"candy,"中的'a'，但匹配"caandy," 中的所有'a'和"caaandy."中前面的两个<br />
'a'。</p>
<p>字符{n,}<br />
意义：这里的n是一个正整数。匹配至少n个前面的字符。<br />
例如：/a{2,}不匹配"candy"中的'a'，但匹配"caandy"中的所有'a'和"caaaaaaandy."中的所有'a'</p>
<p>字符{n,m}<br />
意义：这里的n和m都是正整数。匹配至少n个最多m个前面的字符。<br />
例如：/a{1,3}/不匹配"cndy"中的任何字符，但匹配 "candy,"中的'a'，"caandy," 中的前面两个<br />
'a'和"caaaaaaandy"中前面的三个'a'，注意：即使"caaaaaaandy" 中有很多个'a'，但只匹配前面的三<br />
个'a'即"aaa"。</p>
<p>字符[xyz]<br />
意义：一字符列表，匹配列出中的任一字符。你可以通过连字符-指出一个字符范围。<br />
例如：[abcd]跟[a-c]一样。它们匹配"brisket"中的'b'和"ache"中的'c'。</p>
<p>字符[^xyz]<br />
意义：一字符补集，也就是说，它匹配除了列出的字符外的所有东西。 你可以使用连字符-指出一<br />
字符范围。<br />
例如：[^abc]和[^a-c]等价，它们最早匹配"brisket"中的'r'和"chop."中的'h'。</p>
<p>字符<br />
意义：匹配一个空格(不要与b混淆)</p>
<p>字符b<br />
意义：匹配一个单词的分界线，比如一个空格(不要与混淆)<br />
例如：/bnw/匹配"noonday"中的'no'，/wyb/匹配"possibly yesterday."中的'ly'。</p>
<p>字符B<br />
意义：匹配一个单词的非分界线<br />
例如：/wBn/匹配"noonday"中的'on'，/yBw/匹配"possibly yesterday."中的'ye'。</p>
<p>字符cX<br />
意义：这里的X是一个控制字符。匹配一个字符串的控制字符。<br />
例如：/cM/匹配一个字符串中的control-M。</p>
<p>字符d<br />
意义：匹配一个数字，等价于[0-9]。<br />
例如：/d/或/[0-9]/匹配"B2 is the suite number."中的'2'。</p>
<p>字符D<br />
意义：匹配任何的非数字，等价于[^0-9]。<br />
例如：/D/或/[^0-9]/匹配"B2 is the suite number."中的'B'。</p>
<p>字符f<br />
意义：匹配一个表单符</p>
<p>字符n<br />
意义：匹配一个换行符</p>
<p>字符r<br />
意义：匹配一个回车符</p>
<p>字符s<br />
意义：匹配一个单个white空格符，包括空格，tab，form feed，换行符，等价于[ fnrtv]。<br />
例如：/sw*/匹配"foo bar."中的' bar'。</p>
<p>字符S<br />
意义：匹配除white空格符以外的一个单个的字符，等价于[^ fnrtv]。<br />
例如：/S/w*匹配"foo bar."中的'foo'。</p>
<p>字符t<br />
意义：匹配一个制表符</p>
<p>字符v<br />
意义：匹配一个顶头制表符</p>
<p>字符w<br />
意义：匹配所有的数字和字母以及下划线，等价于[A-Za-z0-9_]。<br />
例如：/w/匹配"apple,"中的'a'，"$5.28,"中的'5'和"3D."中的'3'。</p>
<p>字符W<br />
意义：匹配除数字、字母外及下划线外的其它字符，等价于[^A-Za-z0-9_]。<br />
例如：/W/或者/[^$A-Za-z0-9_]/匹配"50%."中的'%'。</p>
<p>字符n<br />
意义：这里的n是一个正整数。匹配一个正则表达式的最后一个子串的n的值(计数左圆括号)。</p>
<p>例如：/apple(,)sorange1/匹配"apple, orange, cherry, peach."中的'apple, orange'，下面<br />
有一个更加完整的例子。<br />
注意：如果左圆括号中的数字比n指定的数字还小，则n取下一行的八进制escape作为描述。</p>
<p>字符ooctal和xhex<br />
意义：这里的ooctal是一个八进制的escape值，而xhex是一个十六进制的escape值，允许在一个正则表达式中嵌入ASCII码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/10/14/common-php-preg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>12款在线网站速度和性能测试工具</title>
		<link>http://www.helloyi.cn/index.php/2010/10/03/12_online_speed_tester/</link>
		<comments>http://www.helloyi.cn/index.php/2010/10/03/12_online_speed_tester/#comments</comments>
		<pubDate>Sun, 03 Oct 2010 02:30:41 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[网页设计]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3290</guid>
		<description><![CDATA[网站的访问速度对于一个网站非常重要，没有一个人会喜欢速度慢的网站。下面是12款在线测试网站的访问速度和性能的工具，在优化网站的时候很有用。Pingdom:测试网站每个元素的加载速度，比如html、图片、JS文件等等。 GTmetrix GTmetrix集合了Yslow和Google Page Speed的功能，Yslow和Google Page Speed是两款FireFox的插件，但是这个在线应用可以使用任何的浏览器。它会给出你网站的评分并指出哪些是需要改进的。 Light Speed Now 测试网站的速度，然后把报告发送到你的邮箱。 Load Impact Load Impact可以说是一个负载测试，看看你的网站能够扛得住多少的流量。免费的用户只能模拟50个用户同时测试，升级到付费的用户可以模拟不限用户的负载测试。 Site Perf Site Perf可以模拟浏览器进行测试，可以测试各个元素的下载速度。还可以测试每个需要解析的主机的连接时间。 WebWait 测试访问速度。 Gomez Networks Gomez Networks测试网站外部元素的加载时间，比如CSS、图片、JS等。 Octa Gate Octa Gate测试每个元素的加载时间。 Webslug 对比两个网站的加载速度。 WebToolHub 测试不同网络连接下的网站的加载速度。 iWebTools iWebTools可以最多同时测试10个页面的大小和加载速度。 SearchMetrics 测试网站的外部元素的加载速度，还可以测试在不同的网络带宽下的连接速度。 转载自：http://www.ezloo.com/2010/09/12_online_speed_tester.html]]></description>
			<content:encoded><![CDATA[<p>网站的访问速度对于一个网站非常重要，没有一个人会喜欢速度慢的网站。下面是12款在线测试网站的访问速度和性能的工具，在优化网站的时候很有用。<strong><a href="http://tools.pingdom.com/">Pingdom</a>:</strong>测试网站每个元素的加载速度，比如html、图片、JS文件等等。</p>
<p><span id="more-3290"></span></p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/pingdom.jpg" rel="lightbox[3290]"><img title="pingdom" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/pingdom_thumb.jpg" border="0" alt="pingdom" width="504" height="266" /></a></p>
<p><a href="http://gtmetrix.com/"></a></p>
<div id="more">
<p><a href="http://gtmetrix.com/"><strong>GTmetrix</strong></a></p>
<p>GTmetrix集合了Yslow和Google Page Speed的功能，Yslow和Google Page  Speed是两款FireFox的插件，但是这个在线应用可以使用任何的浏览器。它会给出你网站的评分并指出哪些是需要改进的。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/GTmetrix.jpg" rel="lightbox[3290]"><img title="GTmetrix" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/GTmetrix_thumb.jpg" border="0" alt="GTmetrix" width="504" height="262" /></a></p>
<p><a href="http://lightspeednow.com/"><strong>Light Speed Now</strong></a></p>
<p>测试网站的速度，然后把报告发送到你的邮箱。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/lightspeednow.jpg" rel="lightbox[3290]"><img title="lightspeednow" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/lightspeednow_thumb.jpg" border="0" alt="lightspeednow" width="504" height="366" /></a></p>
<p><a href="http://loadimpact.com/"><strong>Load Impact</strong></a></p>
<p>Load  Impact可以说是一个负载测试，看看你的网站能够扛得住多少的流量。免费的用户只能模拟50个用户同时测试，升级到付费的用户可以模拟不限用户的负载测试。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/loadimpact.jpg" rel="lightbox[3290]"><img title="loadimpact" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/loadimpact_thumb.jpg" border="0" alt="loadimpact" width="504" height="346" /></a></p>
<p><a href="http://site-perf.com/"><strong>Site Perf</strong></a></p>
<p>Site Perf可以模拟浏览器进行测试，可以测试各个元素的下载速度。还可以测试每个需要解析的主机的连接时间。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/siteperf.jpg" rel="lightbox[3290]"><img title="site-perf" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/siteperf_thumb.jpg" border="0" alt="site-perf" width="504" height="244" /></a></p>
<p><a href="http://webwait.com/"><strong>WebWait</strong></a></p>
<p>测试访问速度。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/webwait.jpg" rel="lightbox[3290]"><img title="webwait" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/webwait_thumb.jpg" border="0" alt="webwait" width="504" height="333" /></a></p>
<p><a href="http://www.gomeznetworks.com/custom/instant_test.html"><strong>Gomez  Networks</strong></a></p>
<p>Gomez Networks测试网站外部元素的加载时间，比如CSS、图片、JS等。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/gomez.jpg" rel="lightbox[3290]"><img title="gomez" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/gomez_thumb.jpg" border="0" alt="gomez" width="504" height="678" /></a></p>
<p><a href="http://www.octagate.com/service/SiteTimer/"><strong>Octa  Gate</strong></a></p>
<p>Octa Gate测试每个元素的加载时间。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/octagate.jpg" rel="lightbox[3290]"><img title="octa-gate" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/octagate_thumb.jpg" border="0" alt="octa-gate" width="504" height="308" /></a></p>
<p><a href="http://www.webslug.info/"><strong>Webslug</strong></a></p>
<p>对比两个网站的加载速度。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/webslug.jpg" rel="lightbox[3290]"><img title="webslug" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/webslug_thumb.jpg" border="0" alt="webslug" width="504" height="321" /></a></p>
<p><a href="http://www.webtoolhub.com/tn561353-website-speed-test.aspx"><strong>WebToolHub</strong></a></p>
<p>测试不同网络连接下的网站的加载速度。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/webtoolhub.jpg" rel="lightbox[3290]"><img title="webtoolhub" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/webtoolhub_thumb.jpg" border="0" alt="webtoolhub" width="504" height="271" /></a></p>
<p><a href="http://www.iwebtool.com/"><strong>iWebTools</strong></a></p>
<p>iWebTools可以最多同时测试10个页面的大小和加载速度。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/iwebtools.jpg" rel="lightbox[3290]"><img title="iwebtools" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/iwebtools_thumb.jpg" border="0" alt="iwebtools" width="504" height="540" /></a></p>
<p><a href="http://rapid.searchmetrics.com/en/seo-tools/site-analysis/website-speed-test,46.html"><strong>SearchMetrics</strong></a></p>
<p>测试网站的外部元素的加载速度，还可以测试在不同的网络带宽下的连接速度。</p>
<p><a href="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/searchmetrics.jpg" rel="lightbox[3290]"><img title="searchmetrics" src="http://img.ezloo.com/2010/blog/edf00b3c0318_11164/searchmetrics_thumb.jpg" border="0" alt="searchmetrics" width="504" height="321" /></a></p>
<p>转载自：<a href="http://www.ezloo.com/2010/09/12_online_speed_tester.html" target="_blank">http://www.ezloo.com/2010/09/12_online_speed_tester.html</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/10/03/12_online_speed_tester/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>10 款网页设计师必知的免费 Android 应用</title>
		<link>http://www.helloyi.cn/index.php/2010/08/20/10-android-app-web-designer/</link>
		<comments>http://www.helloyi.cn/index.php/2010/08/20/10-android-app-web-designer/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 11:00:00 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB前端]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3285</guid>
		<description><![CDATA[近几年苹果的 iPhone 一直占据主导地位，Google Android 系统貌似一直受它的阴影所茏罩。然而，这仅仅是因为 iPhone 发布时间比 Android 手机要早。不过，Android 越来越受欢迎（增长速度相当惊人），应用程序数量也上了一个台阶. 现在为大家介绍 10 款网页设计师必需知道的 Android 应用，以方便他们在找不到电脑的情况下进行生产，当然特指使用 Android 手机的网页设计师。 1.AndFTP   是否需要在 Android  手机上访问您的 WEB 服务器呢？AndFTP 是一款 JAVA 应用程序，可通过手机连接 web 服务器。支持 FTP, SFTP 及 FTPS。使用 AndFTP 可上传及下载文件，支持重命名、删除、创建文件/文件夹等命令，界面友好，易于操作。该应用免费。 2. SilverEdit   一款轻量级的源代码编辑程序，它能编写 HTML, CSS, PHP 文件并保存到手机或发送到您的邮箱帐户。配合上文提及的 AndFTP，您可以使用 Android 手机建立并上传网站！目前在某些 Android 手机上仍然有一些问题，不过一直在修复（开发中的 3 版比较稳定）。 3. Photoshop Adobe 把日益流行的 Photoshop 带到了 [...]]]></description>
			<content:encoded><![CDATA[<p>近几年苹果的 iPhone 一直占据主导地位，Google Android 系统貌似一直受它的阴影所茏罩。然而，这仅仅是因为 iPhone 发布时间比 Android 手机要早。不过，Android 越来越受欢迎（增长速度相当惊人），应用程序数量也上了一个台阶. 现在为大家介绍 10 款网页设计师必需知道的 Android 应用，以方便他们在找不到电脑的情况下进行生产，当然特指使用 Android 手机的网页设计师。<br />
<span id="more-3285"></span>1.<a href="http://anzhiba.com/andftp-download/" target="_blank">AndFTP</a></p>
<p><img title="178ef7b1-597e-313b-8a51-87a4605a2b6f" src="http://www.helloyi.cn/wp-content/uploads/2010/08/178ef7b1-597e-313b-8a51-87a4605a2b6f.jpg" alt="178ef7b1-597e-313b-8a51-87a4605a2b6f" width="550" height="202" /><br />
 <br />
是否需要在 Android  手机上访问您的 WEB 服务器呢？AndFTP 是一款 JAVA 应用程序，可通过手机连接 web 服务器。支持 FTP, SFTP 及 FTPS。使用 AndFTP 可上传及下载文件，支持重命名、删除、创建文件/文件夹等命令，界面友好，易于操作。该应用免费。</p>
<p>2.<a href="http://anzhiba.com/silveredit-download/" target="_blank"> SilverEdit</a></p>
<p><img class="alignnone size-full wp-image-3287" title="664a2824-c47b-3be7-b5d9-bdca325a045a" src="http://www.helloyi.cn/wp-content/uploads/2010/08/664a2824-c47b-3be7-b5d9-bdca325a045a.jpg" alt="664a2824-c47b-3be7-b5d9-bdca325a045a" width="550" height="405" /></p>
<div style="TEXT-ALIGN: center"> </div>
<p>一款轻量级的源代码编辑程序，它能编写 HTML, CSS, PHP 文件并保存到手机或发送到您的邮箱帐户。配合上文提及的 AndFTP，您可以使用 Android 手机建立并上传网站！目前在某些 Android 手机上仍然有一些问题，不过一直在修复（开发中的 3 版比较稳定）。</p>
<p>3. Photoshop</p>
<p><img class="alignnone size-full wp-image-3288" title="bbea92e5-d615-3930-9cb0-522a608a6583" src="http://www.helloyi.cn/wp-content/uploads/2010/08/bbea92e5-d615-3930-9cb0-522a608a6583.jpg" alt="bbea92e5-d615-3930-9cb0-522a608a6583" width="550" height="271" /></p>
<p>Adobe 把日益流行的 Photoshop 带到了 Android 平台。但不幸的是，我们可以预料到，和台式机相比，它具有有限的功能。不过包含了基本的图像处理功能，如裁剪、旋转、调整颜色等。并且用户可使用免费的 photoshop.com 帐户上传和分享照片。</p>
<p>4. View Web Source</p>
<p>如果你正在浏览一个移动网站，想学习该网站的一些内容，View Web Source 能查看并下载该网站的源代码到它的文本编辑器。同时支持编辑和操作代码，评论并保存到您的手机（或发送到您的 email 帐户）。</p>
<p>5. Mobile GA</p>
<p>最靠谱的统计分析 —— Google Analytics 发有 Android 应用了。 Google Analytics 是最好的网站免费统计分析服务。Mobile GA (Google Analytics) 使用无需通过第三方，直接使用 Google Analytics API 传递数据，以维护您的隐私及数据安全。</p>
<p>6. Dropbox<br />
一款适用于网页设计师及其他创作者的流行应用， Dropbox 是基于云的文件备份工具，可以让你使用 Android 手机访问存储在 Dropbox 的远程文件夹。只需要在一台电脑上保存了文件，就能在其他电脑或手机上远程访问。该应用可访问您的 Dropbox 帐户。需要在多台电脑或设备上共享文件或文档的话，该应用是相当方便的。</p>
<p>7. WordPress Mobile<br />
如果您的博客使用 WordPress 架设的话，通过该应用可以发布新文章、编辑内容、管理评论等。该应用开源而且免费。</p>
<p>8. Thinking Space</p>
<div style="TEXT-ALIGN: center">作为一个网页设计者，你不能丢失创造力，而且不论身处何地你总是酝酿站点设计创意。 Thinking Space 是一款记录你想法的 Android 程序。它能上传你的数据到 Google App Engine。</div>
<div style="TEXT-ALIGN: center">9. Typography Junkies</div>
<div style="TEXT-ALIGN: center">每一个设计师都有一个好的排版灵感，网页排版在设计中也显得异常重要。使用 Typography Junkies for Android 应用，你能能过视频、图片、社会化媒体等获取最新的字体新闻。</div>
<p>10. HTML Test</p>
<div style="TEXT-ALIGN: center">需要复习 HTML 功课么？HTML Test 是一款优秀的 Android 应用，可以让您轻松的复习 HTML。该应用以选择题的形式测试您的 HTML 知识，当然您需要在规定时间内做完。</div>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/08/20/10-android-app-web-designer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>百万级PHP网站Poppen.de的架构分享</title>
		<link>http://www.helloyi.cn/index.php/2010/07/23/poppen/</link>
		<comments>http://www.helloyi.cn/index.php/2010/07/23/poppen/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 08:33:52 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB编程]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3278</guid>
		<description><![CDATA[Poppen.de是德国的一家婚姻中介网站，对于该网站的统计数字有：1）200万的用户数，2）2万的并发用户数，3）每天产生30万的私信，4）25万的日登录用户数。这样的网站也就是个中型规模的网站，下面看看这个网站在技术应用及经验方面带来的东西。   Poppen.de目前有200万注册用户数，而项目团队有11个开发人员，两个设计，两个系统管理员。该站点的商业模式采用免费增值模式，用户可以使用搜索用户、给好友发送消息、上载图片和视频等功能。 　　如果用户想享受不受限制发送消息和上载图片，那么就得根据需要支付不同类型的会员服务，视频聊天及网站其他服务也采用同样的策略。 Nginx 　　Poppen.de使用nginx作为web server，包括静态请求和动态请求。特别的，Poppen.de通过nginx来直接从memcache中获取缓存的动态页面内容而不需要经过PHP，一个例子就是请求用户信息页。对于缓存整个动态请求页面内容，这是一种方法，更常见的是使用squid、varnish来做。在请求用户上传图片的处理方面，Poppen.de是将图片上传到统一的文件服务器，而前端的nginx在请求时会做本机的cache处理（不知道它的请求是如何落到nginx上的，如果是随机的，多台nginx本机cache的数据就重复了，有些浪费，但也最简单），对于图片量不大的情况倒是简单的处理方法。 　　PHP-FPM 　　Poppen.de使用了PHP 5.3.x、APC和PHP-FPM，PHP-FPM是启用了100个进程，也是个标配。使用APC使得PHP能减少30%的CPU和内存消耗。Poppen.de竟然使用了symfony作为开发框架，出发点自然是希望快速开发，但从我的使用经验来说，symfony还是太重的一个框架，无论是使用上还是性能上都不是最优的PHP框架。当然，它也提到，框架是有性能损失的，但还可以接受。就PHP框架来说，尽管开源的框架一筐一筐，但没一个真正流行的，而重复的轮子却不停的出现，此种现象很耐人寻味。Poppen.de还使用了Facebook出品的XHProf来分析PHP程序的性能问题。 　　Mysql 　　Poppen.de的数据存在Mysql中，主要就是主从模式。由于现在的数据量并不大，并没有做数据分区处理，当数据量上来时，像垂直和水平分区自然是扩展性能的简单方式。稍显意外的是，Poppen.de使用由4台机器构成的NDB cluster来存储写频繁的数据，比如某个用户页都被谁访问过这样的统计信息。如果NDB cluster能被一些大型应用证明其稳定性，对于解决写频繁的应用（比如Social game？）来说是个不错的选择。Poppen.de的表大多是MyISAM，自然不是很好的选择，不过他们竟然有计划转向XtraDB（自然是经过测试比较后的结果），真是够有个性的。尽管XtraDB很优秀，但官方的innodb显然会更成熟，并且新版也在吸收如XtraDB等存储引擎的优点，选择一个不明前途的第三方引擎还是有些风险的。 　　Memcached 　　cache为王，Poppen.de有45GB、51个结点的cache数据。并且还做了一个系统，当一个表数据变化时，自动作废cache数据，好处自然是减少了应用处理。当然，也可以做一个穿透的数据访问中间件来做cache填充与失效的事情（就像DAL）。Poppen.de似乎也在考虑使用Redis或MongoDB等来将cache操作和数据操作自然的绑在一起。 　　RabbitMQ 　　Poppen.de使用了RabbitMQ来做一些异步job处理。特别有趣的是，它使用了PHP-FPM的一个专有特性，即fastcgi_finish_request() 函数，能够在请求结束前，在把结果返回到客户端后，异步的做诸如连接关闭、发送消息的处理。在消费消息方面，Poppen.de使用了最简单的山寨方法，就是同时运行多个PHP脚本，每个脚本在消费250个job后退出，然后由监控脚本再新起一个消费脚本。当处理不过来时，或者多加脚本或者多加机器来解决。 　　其他 　　Poppen.de使用CouchDB来存储log而是代替人工直接分析日志文件，这个对于单机的日志分析或许会更快更方便些，并且他们有计划将日志可视化，但他们想必现在还没打算做分布式的日志存储与分析的工作。Poppen.de使用了叫做Red5的东西来存储视频（我是不了解了）。Poppen.de还使用Graphite来做数据监控，包括如Memcached的命中率、RabbitMQ状态监控、各机器的负载监控等。当一个网站有一定规模后，这种监控是必不可少的，而通常也是拿现成的工具使用，在必要时做些功能上的扩展。Poppen.de还使用Tsung来做基准测试，比如HTTP请求及各Mysql存储引擎方面的测试。 　　经验 　　1、背靠大树好乘凉，选择技术和工具时要挑成熟、活跃的社区，这样有问题也有途径及时解决。 　　2、了解你所使用的技术的优缺点，发挥它的优点，避开它的缺点。 　　3、扩展工具，让工具更好的满足你。 　　4、敢于尝试。可以看到，越是大公司，在技术选型时越是缩手缩脚，生怕外面的东西不成熟有问题，总相信自己能造成更好的自己能掌控的轮子。而看看Poppen.de上面提到的东西，有多少是你不知道没用过的？再感慨一下，每天都有大量的开源项目出现，一些因为被人关注而众人拾柴，东西就存活下去，一些尽管东西很好但因为无人问津，也就悄无声息的死去。 　　5、度量一切，对网站的各个模块、系统、流量等数字有清晰的认识。 　　6、经验积累、全面把握。不要等到上线时发现新模块的功能不是需要的，不要等到上线时发现模块性能不满足需求。 　　总结 　　Poppen.de还做了些展望，比如将更多的使用erlang产品，这要是个国内的公司，估计很多人会膜拜的。而总结来说，Poppen.de分享的东西真是很实在很实用，是个很开放也很技术流的公司，对中小规模的网站来说是可充分借鉴的。 　　英文原文：Poppen.de Architecture]]></description>
			<content:encoded><![CDATA[<p>Poppen.de是德国的一家婚姻中介网站，对于该网站的统计数字有：1）200万的用户数，2）2万的并发用户数，3）每天产生30万的私信，4）25万的日登录用户数。这样的网站也就是个中型规模的网站，下面看看这个网站在技术应用及经验方面带来的东西。</p>
<p><span id="more-3278"></span>  Poppen.de目前有200万注册用户数，而项目团队有11个开发人员，两个设计，两个系统管理员。该站点的商业模式采用免费增值模式，用户可以使用搜索用户、给好友发送消息、上载图片和视频等功能。</p>
<p>　　如果用户想享受不受限制发送消息和上载图片，那么就得根据需要支付不同类型的会员服务，视频聊天及网站其他服务也采用同样的策略。</p>
<p>Nginx</p>
<p>　　Poppen.de使用nginx作为web server，包括静态请求和动态请求。特别的，Poppen.de通过nginx来直接从memcache中获取缓存的动态页面内容而不需要经过PHP，一个例子就是请求用户信息页。对于缓存整个动态请求页面内容，这是一种方法，更常见的是使用squid、varnish来做。在请求用户上传图片的处理方面，Poppen.de是将图片上传到统一的文件服务器，而前端的nginx在请求时会做本机的cache处理（不知道它的请求是如何落到nginx上的，如果是随机的，多台nginx本机cache的数据就重复了，有些浪费，但也最简单），对于图片量不大的情况倒是简单的处理方法。</p>
<h2>　　PHP-FPM</h2>
<p>　　Poppen.de使用了PHP 5.3.x、APC和PHP-FPM，PHP-FPM是启用了100个进程，也是个标配。使用APC使得PHP能减少30%的CPU和内存消耗。Poppen.de竟然使用了symfony作为开发框架，出发点自然是希望快速开发，但从我的使用经验来说，symfony还是太重的一个框架，无论是使用上还是性能上都不是最优的PHP框架。当然，它也提到，框架是有性能损失的，但还可以接受。就PHP框架来说，尽管开源的框架一筐一筐，但没一个真正流行的，而重复的轮子却不停的出现，此种现象很耐人寻味。Poppen.de还使用了Facebook出品的XHProf来分析PHP程序的性能问题。</p>
<h2>　　Mysql</h2>
<p>　　Poppen.de的数据存在Mysql中，主要就是主从模式。由于现在的数据量并不大，并没有做数据分区处理，当数据量上来时，像垂直和水平分区自然是扩展性能的简单方式。稍显意外的是，Poppen.de使用由4台机器构成的NDB cluster来存储写频繁的数据，比如某个用户页都被谁访问过这样的统计信息。如果NDB cluster能被一些大型应用证明其稳定性，对于解决写频繁的应用（比如Social game？）来说是个不错的选择。Poppen.de的表大多是MyISAM，自然不是很好的选择，不过他们竟然有计划转向XtraDB（自然是经过测试比较后的结果），真是够有个性的。尽管XtraDB很优秀，但官方的innodb显然会更成熟，并且新版也在吸收如XtraDB等存储引擎的优点，选择一个不明前途的第三方引擎还是有些风险的。</p>
<h2>　　Memcached</h2>
<p>　　cache为王，Poppen.de有45GB、51个结点的cache数据。并且还做了一个系统，当一个表数据变化时，自动作废cache数据，好处自然是减少了应用处理。当然，也可以做一个穿透的数据访问中间件来做cache填充与失效的事情（就像DAL）。Poppen.de似乎也在考虑使用Redis或MongoDB等来将cache操作和数据操作自然的绑在一起。</p>
<h2>　　RabbitMQ</h2>
<p>　　Poppen.de使用了RabbitMQ来做一些异步job处理。特别有趣的是，它使用了PHP-FPM的一个专有特性，即fastcgi_finish_request() 函数，能够在请求结束前，在把结果返回到客户端后，异步的做诸如连接关闭、发送消息的处理。在消费消息方面，Poppen.de使用了最简单的山寨方法，就是同时运行多个PHP脚本，每个脚本在消费250个job后退出，然后由监控脚本再新起一个消费脚本。当处理不过来时，或者多加脚本或者多加机器来解决。</p>
<h2>　　其他</h2>
<p>　　Poppen.de使用CouchDB来存储log而是代替人工直接分析日志文件，这个对于单机的日志分析或许会更快更方便些，并且他们有计划将日志可视化，但他们想必现在还没打算做分布式的日志存储与分析的工作。Poppen.de使用了叫做Red5的东西来存储视频（我是不了解了）。Poppen.de还使用Graphite来做数据监控，包括如Memcached的命中率、RabbitMQ状态监控、各机器的负载监控等。当一个网站有一定规模后，这种监控是必不可少的，而通常也是拿现成的工具使用，在必要时做些功能上的扩展。Poppen.de还使用Tsung来做基准测试，比如HTTP请求及各Mysql存储引擎方面的测试。</p>
<h2>　　经验</h2>
<p>　　1、背靠大树好乘凉，选择技术和工具时要挑成熟、活跃的社区，这样有问题也有途径及时解决。<br />
　　2、了解你所使用的技术的优缺点，发挥它的优点，避开它的缺点。<br />
　　3、扩展工具，让工具更好的满足你。<br />
　　4、敢于尝试。可以看到，越是大公司，在技术选型时越是缩手缩脚，生怕外面的东西不成熟有问题，总相信自己能造成更好的自己能掌控的轮子。而看看Poppen.de上面提到的东西，有多少是你不知道没用过的？再感慨一下，每天都有大量的开源项目出现，一些因为被人关注而众人拾柴，东西就存活下去，一些尽管东西很好但因为无人问津，也就悄无声息的死去。<br />
　　5、度量一切，对网站的各个模块、系统、流量等数字有清晰的认识。<br />
　　6、经验积累、全面把握。不要等到上线时发现新模块的功能不是需要的，不要等到上线时发现模块性能不满足需求。</p>
<h2>　　总结</h2>
<p>　　Poppen.de还做了些展望，比如将更多的使用erlang产品，这要是个国内的公司，估计很多人会膜拜的。而总结来说，Poppen.de分享的东西真是很实在很实用，是个很开放也很技术流的公司，对中小规模的网站来说是可充分借鉴的。</p>
<p>　　英文原文：<a href="http://highscalability.com/blog/2010/4/12/poppende-architecture.html">Poppen.de Architecture</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/07/23/poppen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web开发者必备的十大资源网站</title>
		<link>http://www.helloyi.cn/index.php/2010/05/31/10-must-have-resources-for-web-developers/</link>
		<comments>http://www.helloyi.cn/index.php/2010/05/31/10-must-have-resources-for-web-developers/#comments</comments>
		<pubDate>Mon, 31 May 2010 06:41:45 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB编程]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3269</guid>
		<description><![CDATA[要成为一名优秀的Web开发者，并没有捷径可走，只能通过自己一步一步的努力去实现，但如果你拥有一些优秀的开发工具，则可以大大提高你的开发效率。本文将从中挑选出十个最佳工具，供大家选择使用。 　1、MySQL Format Date 　　网址：http://www.mysqlformatdate.com/ 　　MySQL Format Date可以帮助开发者使用MySQLDATE_FORMAT函数来规范化自己的日期数值。开发者只需选择一个通用日期格式，然后对其进行修改来满足自己的需求。页面底部将自动生成MySQLDATE_FORMAT代码，开发者可以直接将它们拷贝粘贴到自己的代码中。 　　2、Script Src 　　网址：http://scriptsrc.net 　　为了及时发现自己所喜爱的Javascript代码库是否有最新版本，Web开发者可能需要不断定期在网络上搜索，这无疑会令人疲倦。ScriptSrc.net则已经把jQuery、Mootools、Prototype和更多内容汇集到一个网页中，Web开发者只需要点击一下，就能把相关最新版链接地址复制到自己浏览器的剪贴板中。 　　3、Em Chart 　　网址：http://aloestudios.com/tools/emchart/ 　　我从来不喜欢在CSS文件中使用ems来定义文本尺寸，但有时候却又不得不使用它。这时Em Chart可以帮助你省时省力，它能够把ems转化为像素值。 　　4、Twitter API Explorer 　　网址：http://twitapi.com/explore/ 　　如果你在自己创建的站点中使用了Twitter API，你一定会喜欢Twitter API Explorer网站，它可以让你通过Twitter API进行搜索。更绝的是，它可以生成立即可用的代码片段。你和你的客户能够实现即时获取。 　　5、Browser Sandbox 　　网址：http://spoon.net/browsers 　　毫无疑问，跨浏览器兼容性是Web开发者在日常工作中不得不面对的最大问题之一。Browser Sandbox让开发者可以从网络上运行任何Windows浏览器。唯一的缺点是，你必须使用Windows系统，该应用不能运行在苹果Mac和GNU/Linux系统之上。 　　6、PHP Forms 　　网址：http://www.phpform.org/ 　　Web表单是网站最重要的部分之一，但创建它们也是一件非常耗时的工作。不过，PHP Forms网站可以免费加速你的表单开发工作，它能够让你创建满足多数网站需求的高级表单。 　　7、.htaccess editor 　　网址：http://www.htaccesseditor.com/en.shtml 　　对任何网站来说，.htaccess文件是必用的。不过即使你还不知道怎么编写一个.htaccess文件，也不用感到担忧，该网站通过一个向导来帮助你创建.htaccess文件。虽然它不支持非常高级的处理工作，但对于你创建的95%网站来说，它可以满足需要。 　　8、Smush it! 　　网址：http://developer.yahoo.com/yslow/smushit/ 　　就信息表达来说，一个图片的价值可能胜过一千句话。但图片也以带宽杀手而闻名。通过使用Photoshop等软件，可以把图片优化以适应Web；但是如果你没有这样的软件或不会使用它，Smushit也可以满足你的需要。这个在线工具的开发者是雅虎开发者网络，它可以在不降低图片质量的前提下降低图片大小。 　　9、CSS Compressor 　　网址：http://www.csscompressor.com/ 　　假如一个网站拥有许多不同的页面布局，其CSS文件往往会变得非常庞大，并且占用大量服务器带宽。CSS Compressor可以通过移除注释、缩减和更多信息，来降低任何CSS文件的体积。另外，你还可以通过该工具配置压缩等级来满足自己的需要。 　　10、Test everything 　　网址：http://tester.jonasjohn.de/ 　　该网站是你必须收藏的精品网站之一。从其名称可以看出，它能够让你测试许多事情，诸如XHTML和CSS标记、PageRank和反向链接等。  原文：10 must [...]]]></description>
			<content:encoded><![CDATA[<p>要成为一名优秀的Web开发者，并没有捷径可走，只能通过自己一步一步的努力去实现，但如果你拥有一些优秀的开发工具，则可以大大提高你的开发效率。本文将从中挑选出十个最佳工具，供大家选择使用。</p>
<p><span id="more-3269"></span><strong>　1、MySQL Format Date</strong></p>
<p>　　网址：<a href="http://www.mysqlformatdate.com/" target="_blank"><span style="color: #0000ff;">http://www.mysqlformatdate.com/</span></a></p>
<p>　　MySQL Format Date可以帮助开发者使用MySQLDATE_FORMAT函数来规范化自己的日期数值。开发者只需选择一个通用日期格式，然后对其进行修改来满足自己的需求。页面底部将自动生成MySQLDATE_FORMAT代码，开发者可以直接将它们拷贝粘贴到自己的代码中。</p>
<p><strong>　　2、Script Src</strong></p>
<p>　　网址：<a href="http://scriptsrc.net/" target="_blank"><span style="color: #0000ff;">http://scriptsrc.net</span></a></p>
<p>　　为了及时发现自己所喜爱的Javascript代码库是否有最新版本，Web开发者可能需要不断定期在网络上搜索，这无疑会令人疲倦。ScriptSrc.net则已经把jQuery、Mootools、Prototype和更多内容汇集到一个网页中，Web开发者只需要点击一下，就能把相关最新版链接地址复制到自己浏览器的剪贴板中。</p>
<p><strong>　　3、Em Chart</strong></p>
<p>　　网址：<a href="http://aloestudios.com/tools/emchart/" target="_blank"><span style="color: #0000ff;">http://aloestudios.com/tools/emchart/</span></a></p>
<p>　　我从来不喜欢在CSS文件中使用ems来定义文本尺寸，但有时候却又不得不使用它。这时Em Chart可以帮助你省时省力，它能够把ems转化为像素值。</p>
<p><strong>　　4、Twitter API Explorer</strong></p>
<p>　　网址：<a href="http://twitapi.com/explore/" target="_blank"><span style="color: #0000ff;">http://twitapi.com/explore/</span></a></p>
<p>　　如果你在自己创建的站点中使用了Twitter API，你一定会喜欢Twitter API Explorer网站，它可以让你通过Twitter API进行搜索。更绝的是，它可以生成立即可用的代码片段。你和你的客户能够实现即时获取。</p>
<p><strong>　　5、Browser Sandbox</strong></p>
<p>　　网址：<a href="http://spoon.net/browsers" target="_blank"><span style="color: #0000ff;">http://spoon.net/browsers</span></a></p>
<p>　　毫无疑问，跨浏览器兼容性是Web开发者在日常工作中不得不面对的最大问题之一。Browser Sandbox让开发者可以从网络上运行任何Windows浏览器。唯一的缺点是，你必须使用Windows系统，该应用不能运行在苹果Mac和GNU/Linux系统之上。</p>
<p><strong>　　6、PHP Forms</strong></p>
<p>　　网址：<a href="http://www.phpform.org/" target="_blank"><span style="color: #0000ff;">http://www.phpform.org/</span></a></p>
<p>　　Web表单是网站最重要的部分之一，但创建它们也是一件非常耗时的工作。不过，PHP Forms网站可以免费加速你的表单开发工作，它能够让你创建满足多数网站需求的高级表单。</p>
<p><strong>　　7、.htaccess editor</strong></p>
<p>　　网址：<a href="http://www.htaccesseditor.com/en.shtml" target="_blank"><span style="color: #0000ff;">http://www.htaccesseditor.com/en.shtml</span></a></p>
<p>　　对任何网站来说，.htaccess文件是必用的。不过即使你还不知道怎么编写一个.htaccess文件，也不用感到担忧，该网站通过一个向导来帮助你创建.htaccess文件。虽然它不支持非常高级的处理工作，但对于你创建的95%网站来说，它可以满足需要。</p>
<p><strong>　　8、Smush it!</strong></p>
<p>　　网址：<a href="http://developer.yahoo.com/yslow/smushit/" target="_blank">htt<span style="color: #0000ff;">p://developer.yahoo.com/yslow/smushit/</span></a></p>
<p>　　就信息表达来说，一个图片的价值可能胜过一千句话。但图片也以带宽杀手而闻名。通过使用Photoshop等软件，可以把图片优化以适应Web；但是如果你没有这样的软件或不会使用它，Smushit也可以满足你的需要。这个在线工具的开发者是雅虎开发者网络，它可以在不降低图片质量的前提下降低图片大小。</p>
<p><strong>　　9、CSS Compressor</strong></p>
<p>　　网址：<a href="http://www.csscompressor.com/" target="_blank"><span style="color: #0000ff;">http://www.csscompressor.com/</span></a></p>
<p>　　假如一个网站拥有许多不同的页面布局，其CSS文件往往会变得非常庞大，并且占用大量服务器带宽。CSS Compressor可以通过移除注释、缩减和更多信息，来降低任何CSS文件的体积。另外，你还可以通过该工具配置压缩等级来满足自己的需要。</p>
<p><strong>　　10、Test everything</strong></p>
<p>　　网址：<a href="http://tester.jonasjohn.de/" target="_blank"><span style="color: #0000ff;">http://tester.jonasjohn.de/</span></a></p>
<p>　　该网站是你必须收藏的精品网站之一。从其名称可以看出，它能够让你测试许多事情，诸如XHTML和CSS标记、PageRank和反向链接等。  原文：<a href="http://variable3.com/blog/2010/05/10-must-have-resources-for-web-developers/" target="_blank">10 must have resources for Web Developers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/05/31/10-must-have-resources-for-web-developers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google免费网页字体</title>
		<link>http://www.helloyi.cn/index.php/2010/05/20/google-font/</link>
		<comments>http://www.helloyi.cn/index.php/2010/05/20/google-font/#comments</comments>
		<pubDate>Thu, 20 May 2010 06:02:10 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[网页设计]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3261</guid>
		<description><![CDATA[Google发布了18款在线免费网页字体服务，但与 Monotype Web Fonts、FontShop 等字体商不同，Google 这次开放的字体与它其他很多服务一样，完全免费。但是使用过发现对中文字体效果无效：需要使用google字体只需要调用google font api即可: 了解Google在线字体的话，请到官方主页http://code.google.com/webfonts 详细使用方法http://code.google.com/apis/webfonts/docs/getting_started.html]]></description>
			<content:encoded><![CDATA[<p>Google发布了18款在线免费网页字体服务，但与 Monotype Web Fonts、FontShop 等字体商不同，Google 这次开放的字体与它其他很多服务一样，完全免费。但是使用过<span style="color: #ff0000;">发现对中文字体效果无效</span>：需要使用google字体只需要调用google font api即可:</p>
<p><span id="more-3261"></span>了解Google在线字体的话，请到官方主页<a href="http://code.google.com/webfonts">http://code.google.com/webfonts</a></p>
<p>详细使用方法<a href="http://code.google.com/apis/webfonts/docs/getting_started.html">http://code.google.com/apis/webfonts/docs/getting_started.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/05/20/google-font/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让PHP开发者事半功倍的十大技巧</title>
		<link>http://www.helloyi.cn/index.php/2010/04/19/php-developer-10-skills/</link>
		<comments>http://www.helloyi.cn/index.php/2010/04/19/php-developer-10-skills/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 11:53:42 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB编程]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3227</guid>
		<description><![CDATA[为何说学习PHP的过程有别于任何其它语言？就其本质而言，如果你掌握了以PHP语言“做事”的方式，那么在使用它时就会得心应手，因此值得你去投入精力去了解这些方式。在PHP中，单纯按照自己思路去解决问题往往会是一种错误的办法。这并不是因为你是一个糟糕的程序员，而是因为如果你想写出好的可维护性强的代码，有些标准技巧是你必须要使用的。下面让我们一起看一下你需要知道的10大技巧。 1、如何正确的创建一个网站的Index页面 创建每一个网站时，建立网站的index页面是首要做的事情之一。如果你是一个PHP新手，在编写index页面时典型的做法是只对index页面所需的内容进行编程，其它链接创建另一个页面。不过，如果想学习一种更高效的方式来实现PHP编程，可以采用“index.php?page=home”模式，许多网站都在采用这种模式。 2、使用Request Global Array抓取数据 实际上我们没有任何理由使用$_GET和$_POST数组来抓取数值。$_REQUEST这个全局数组能够让你获取一个get或form请求。因此，多数情况下解析数据的更高效代码大体如下： $action = isset&#40;$_REQUEST&#91;'action'&#93;&#41; ? $_REQUEST&#91;'action'&#93; : 0; 3、利用var_dump进行PHP代码调试 如果你在寻找php调试技术，我必须说var_dump应该是你要找的目标。在显示php信息方面这个命令可以满足你的所有需要。而调试代码的多数情况与得到PHP中的数值有关。 4、PHP处理代码逻辑，Smarty处理展现层 Smarty是一个使用PHP写出来的模板PHP模板引擎，是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容，提供了一种易于管理和使用的方法，用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲，目的就是要使PHP程序员同前端人员分离，使程序员改变程序的逻辑内容不会影响到前端人员的页面设计，前端人员重新修改页面不会影响到程序的程序逻辑，这在多人合作的项目中显的尤为重要。 5、的确需要使用全局数值时，创建一个Config文件 动辄创建全局数值是一种糟糕的做法，不过有时候实际情况的确又需要这么做。对于数据库表或数据库连接信息使用全局数值是一个不错的想法，但不要在你的PHP代码中频繁使用全局数值。另外，更好的一种做法是把你的全局变量存放在一个config.php文件中。 6、如果未定义，禁止访问！ 如果你正确的创建了页面，那么任何其他人没有理由访问index.php或home.php之外的index.php页面。一旦index.php被访问后，你可以通过获得变量的方式来打开需要的页面。你的index页面应该包含类似的以下代码： define&#40;'yourPage',1&#41;; 然后，其它页面应该包含： if &#40;!defined&#40;'yourPage'&#41;&#41; die&#40;'Access Denied'&#41;; 这么做的目的是防止直接访问你的其它php页面。这样，任何试图不通过index.php访问其它网页的人，将得到“访问被拒绝”的消息。 7、创建一个数据库类 如果你正在进行数据库编程（在PHP中非常常见的任务），一个不错的想法是创建一个数据库类来处理任何数据库管理功能。示例代码如下： public function dbExec&#40;$query&#41; &#123; $result = $this-&#62;db-&#62;exec&#40;$query&#41;; if &#40;PEAR::isError&#40;$result&#41;&#41; errorRedirect&#40;$result-&#62;getMessage&#40;&#41;, true&#41;; else return $result; &#125; 这个函数仅接收一个查询语句并对其执行。它还处理可能出现的任何错误。你还可以在这儿包含审核代码，不过我更喜欢使用一个类似的审核函数： // checks if arguments given are integer values [...]]]></description>
			<content:encoded><![CDATA[<p>为何说学习PHP的过程有别于任何其它语言？就其本质而言，如果你掌握了以PHP语言“做事”的方式，那么在使用它时就会得心应手，因此值得你去投入精力去了解这些方式。在PHP中，单纯按照自己思路去解决问题往往会是一种错误的办法。这并不是因为你是一个糟糕的程序员，而是因为如果你想写出好的可维护性强的代码，有些标准技巧是你必须要使用的。下面让我们一起看一下你需要知道的10大技巧。</p>
<p><span id="more-3227"></span><strong>1、如何正确的创建一个网站的Index页面</strong></p>
<p>创建每一个网站时，建立网站的index页面是首要做的事情之一。如果你是一个PHP新手，在编写index页面时典型的做法是只对index页面所需的内容进行编程，其它链接创建另一个页面。不过，如果想学习一种更高效的方式来实现PHP编程，可以采用“index.php?page=home”模式，许多网站都在采用这种模式。</p>
<p><strong>2、使用Request Global Array抓取数据</strong></p>
<p>实际上我们没有任何理由使用$_GET和$_POST数组来抓取数值。$_REQUEST这个全局数组能够让你获取一个get或form请求。因此，多数情况下解析数据的更高效代码大体如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>3、利用var_dump进行PHP代码调试</strong></p>
<p>如果你在寻找php调试技术，我必须说var_dump应该是你要找的目标。在显示php信息方面这个命令可以满足你的所有需要。而调试代码的多数情况与得到PHP中的数值有关。</p>
<p><strong>4、PHP处理代码逻辑，Smarty处理展现层</strong></p>
<p>Smarty是一个使用PHP写出来的模板PHP模板引擎，是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容，提供了一种易于管理和使用的方法，用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲，目的就是要使PHP程序员同前端人员分离，使程序员改变程序的逻辑内容不会影响到前端人员的页面设计，前端人员重新修改页面不会影响到程序的程序逻辑，这在多人合作的项目中显的尤为重要。</p>
<p><strong>5、的确需要使用全局数值时，创建一个Config文件</strong></p>
<p>动辄创建全局数值是一种糟糕的做法，不过有时候实际情况的确又需要这么做。对于数据库表或数据库连接信息使用全局数值是一个不错的想法，但不要在你的PHP代码中频繁使用全局数值。另外，更好的一种做法是把你的全局变量存放在一个config.php文件中。</p>
<p><strong>6、如果未定义，禁止访问！</strong></p>
<p>如果你正确的创建了页面，那么任何其他人没有理由访问index.php或home.php之外的index.php页面。一旦index.php被访问后，你可以通过获得变量的方式来打开需要的页面。你的index页面应该包含类似的以下代码：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'yourPage'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>然后，其它页面应该包含：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'yourPage'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Access Denied'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>这么做的目的是防止直接访问你的其它php页面。这样，任何试图不通过index.php访问其它网页的人，将得到“访问被拒绝”的消息。</p>
<p><strong>7、创建一个数据库类</strong></p>
<p>如果你正在进行数据库编程（在PHP中非常常见的任务），一个不错的想法是创建一个数据库类来处理任何数据库管理功能。示例代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> dbExec<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>          
  <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>PEAR<span style="color: #339933;">::</span><span style="color: #004000;">isError</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
  errorRedirect<span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>  
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>      
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这个函数仅接收一个查询语句并对其执行。它还处理可能出现的任何错误。你还可以在这儿包含审核代码，不过我更喜欢使用一个类似的审核函数：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// checks if arguments given are integer values not less than 0 - has multiple arguments      function sanitizeInput()  {  </span>
    <span style="color: #000088;">$numargs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">func_num_args</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$arg_list</span> <span style="color: #339933;">=</span> <span style="color: #990000;">func_get_args</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$numargs</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arg_list</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$arg_list</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
  errorRedirect<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Unexpected variable value&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>      
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>8、一个php文件处理输入，一个class.php文件处理具体功能</strong></p>
<p>不让代码变得混乱的一个重要方法是：获取用户输入后，将其重定向到其它函数来进行处理。原理非常简单，php文件获得我们需要的任何输入，然后将其执行重定向到类文件中的一个函数。举例来讲，假设有一个类似“index.php?page=profile&amp;action=display”的URL。由profile.php来检索该网址并得到操作是“display”。然后使用一个简单的switch函数，我们来执行真正的显示函数：
</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> PROJECTROOT<span style="color: #339933;">.</span><span style="color: #0000ff;">'libs/messages.class.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Message<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span>    <span style="color: #009900;">&#123;</span>        
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'display'</span><span style="color: #339933;">:</span>            
<span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
 <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>  
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>如上所示，我使用了一个消息类，然后开始进行switch检查。$message只是被类中的调用函数使用的一个对象。</p>
<p><strong>9、了解你的SQL语句，并总是对其审查（Sanitize）</strong></p>
<p>正如我以前所提到的，任何php网站中最重要的部分有99%的可能是数据库。因此，你需要非常熟悉如何正确的使用sql。学会关联表和更多高级技术。下面我将展示一个使用MySQL的函数示例，并使用本文第7条函数进行审查。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> getSentMessages<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>     
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">util</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sanitizeInput</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000088;">$pm_table</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'config'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'privateMsg'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
   <span style="color: #000088;">$users</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'config'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'users'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
   <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT PM.*, USR.username as name_sender FROM <span style="color: #006699; font-weight: bold;">$pm_table</span> PM, <span style="color: #006699; font-weight: bold;">$users</span> USR WHERE id_sender = '<span style="color: #006699; font-weight: bold;">$id</span>' AND sender_purge = FALSE AND USR.id = PM.id_receiver AND is_read = TRUE  ORDER BY date_sent DESC&quot;</span><span style="color: #339933;">;</span>      
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dbQueryAll</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
 <span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>      
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>首先，我们对用户输入进行检查（通过一个GET变量传递消息id），然后我们执行我们的SQL命令。注意这儿SQL的用法。你需要了解如何使用别名和关联表。</p>
<p><strong>10、当你只需要一个对象时，使用单例模式</strong></p>
<p>在PHP中相当常见的一种情形时，我们只需要创建一个对象一次，然后在我们的整个程序中使用它。一个很好的例子就是smarty变量，一旦被初始化后就可以在任何地方使用。这种情形的一个很好实现方案就是单例模式。示例代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">function</span> smartyObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span> 
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'config'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'SmartyObj'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  
     <span style="color: #000088;">$smarty</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SmartyGame<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'config'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'SmartyObj'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$smarty</span><span style="color: #339933;">;</span> 
   <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000088;">$smarty</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'config'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'SmartyObj'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span> <span style="color: #000088;">$smarty</span><span style="color: #339933;">;</span> 
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>注意，我们拥有一个全局smarty变量（该示例中它在config.php中被初始化），如果它的值为0，我们将创建一个新smarty对象。否则，它意味着该对象已经被创建，我们只需要返回它。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/04/19/php-developer-10-skills/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开源软件-浏览源代码的工具(code-browser)</title>
		<link>http://www.helloyi.cn/index.php/2010/03/08/code-browser/</link>
		<comments>http://www.helloyi.cn/index.php/2010/03/08/code-browser/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 14:16:36 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[网页设计]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3190</guid>
		<description><![CDATA[Code Browser 是一个专门用来浏览源代码的工具，其主要的特色是支持代码折叠和大纲显示。Code Browser是传统的文本编辑器,它显示一个结构化的文本文件，类似浏览器和网络浏览器窗口一样。 下载地址: http://code-browser.sourceforge.net/]]></description>
			<content:encoded><![CDATA[<p>Code Browser 是一个专门用来浏览源代码的工具，其主要的特色是支持代码折叠和大纲显示。Code Browser是传统的文本编辑器,它显示一个结构化的文本文件，类似浏览器和网络浏览器窗口一样。</p>
<p><span id="more-3190"></span></p>
<p><span><strong>下载地址</strong>: </span><span>http://code-browser.sourceforge.net/</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/03/08/code-browser/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>网络上关于PHP类的精选归纳</title>
		<link>http://www.helloyi.cn/index.php/2010/03/07/php-class-induction/</link>
		<comments>http://www.helloyi.cn/index.php/2010/03/07/php-class-induction/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 15:45:58 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[WEB编程]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3173</guid>
		<description><![CDATA[一：结构和调用(实例化)： class className{} ，调用：$obj = new className();当类有构造函数时，还应传入参数。如$obj = new className($v,$v2&#8230;); 二：构造函数和析构函数： 1、构造函数用于初始化：使用__construct()，可带参数。 2、但析构函数不能带参数（用于在销去一个类之前执行一些操作或功能）。析构函数用__destruct()做名称。在脚本执行结束时，PHP会销掉内存中的对象，因此可不用析造函数，但有些比如COOKIE等，就应当要用此函数销掉。 知识点：在PHP4中也提供了构造函数，但使用的是与类同名的类方法，在PHP5仍能兼容这种做法，当一个类中没有包含__construct时，会查找与类同名的方法，如果找到，就认为是构造函数，如下： class test { var $b; function test() {   $this-&#62;b=5; } function addab($c) {   return $this-&#62;b+$c; } } $a = new test();   echo $a-&#62;addab(4); // 返回 9 3、PHP不会自动调用父类的构造函数(不支持构造函数重载)，必须使用parent关键字显式地调用。 class employee{       function __construct()&#8230;. } class Manager extents Employee{      function __construct(){           [...]]]></description>
			<content:encoded><![CDATA[<p><strong>一：结构和调用</strong><strong>(</strong><strong>实例化</strong><strong>)</strong><strong>：</strong><strong><br />
</strong><br />
class className{} ，调用：$obj = new className();当类有构造函数时，还应传入参数。如$obj = new className($v,$v2&#8230;);</p>
<p><strong>二：构造函数和析构函数</strong>：<br />
1、构造函数用于初始化：使用__construct()，可带参数。<br />
2、但析构函数不能带参数（用于在销去一个类之前执行一些操作或功能）。析构函数用__destruct()做名称。在脚本执行结束时，PHP会销掉内存中的对象，因此可不用析造函数，但有些比如COOKIE等，就应当要用此函数销掉。</p>
<p><span id="more-3173"></span>知识点：在PHP4中也提供了构造函数，但使用的是与类同名的类方法，在PHP5仍能兼容这种做法，当一个类中没有包含__construct时，会查找与类同名的方法，如果找到，就认为是构造函数，如下：<br />
class test<br />
{ var $b;<br />
function test() {   $this-&gt;b=5; }<br />
function addab($c) {   return $this-&gt;b+$c; }<br />
}<br />
$a = new test();   echo $a-&gt;addab(4); // 返回 9<br />
3、PHP不会自动调用父类的构造函数(不支持构造函数重载)，必须使用parent关键字显式地调用。<br />
class employee{<br />
      function __construct()&#8230;.<br />
}<br />
class Manager extents Employee{<br />
     function __construct(){<br />
          parent::_construct();<br />
          echo &#8216;这个子类的父类构造函数调用了！&#8217;;<br />
     }<br />
}<br />
当然也可以调用与该实例没有任何关系的其它类的构造函数。只需在__construct()前加上类名即可。如：<br />
otherClassName::__construct();</p>
<p>类的主家庭成员：属性、方法、常量、静态成员</p>
<p><strong>三、类的属性：</strong><br />
有两种方法对类的属性赋值或取值。<br />
1、使用公共作用域public关键词。<br />
2、使用__set()和__get()来分别赋值和取值，前者称为设置方法（setter）或修改方法(mutator)，后者称为访问方法(accessor)或获取方法(getter)。建议使用这种方法：优点：<br />
A、可在__set（）统一进行数据验证。<br />
B、便于统一管理属性。<br />
注意：<br />
第一：__set()和__get()只对私有属性起作用，对于用public定义的属性，它们两个都懒理搭理，如下：<br />
class test{<br />
protected $a=9,$b=2,$c;<br />
   public $d;<br />
    function __set($n,$v) {    $this-&gt;$n = $v+2; }<br />
    function __get($name) { return $this-&gt;$name+2; }<br />
}<br />
$a = new test();<br />
$a-&gt;b =5; echo &#8220;&lt;br /&gt;&#8221;;   echo $a-&gt;b;<br />
实例只对$a,$b,$c的设置会经过__set和__get过滤与返回，对于$d，就不会起作用。如$a-&gt;d=5,再返回还是5。<br />
第二：__set($n,$v)要带两个参数。而__get($n)只能有一个参数。实例：<br />
class test{<br />
      private $a=5,$b=6,$c;<br />
      function __set($n,$v)<br />
     {<br />
        if($n==&#8217;a'&amp;&amp;$n&gt;0)<br />
               $this-&gt;$n = $v;<br />
         else<br />
               $this-&gt;$n = $v+2;    <br />
     }<br />
      function __get($name)<br />
      {<br />
            return $this-&gt;$name; //如果改为return $this-&gt;$name + $this-&gt;addab();   如调用a的值，实际返回的是a+a+b的值。默认为5+5+6=16。<br />
      }<br />
      function addab()<br />
       {         return $this-&gt;a + $this-&gt;b;   }<br />
}<br />
$e=new test();<br />
$e-&gt;a = 11;   //注意写法：类的内部用$this-&gt;$n即变量的写法，但外部实例要用$e-&gt;a的方式。<br />
$e-&gt;b = 12;   //get 14<br />
$e-&gt;k = 22;</p>
<p>类的属性可自由扩展，如上例的k，不管是否用__set，当一个实例建立起来后，可以用$e-&gt;newProperty = xx;直接来创造一个属性，但不建议这么做。</p>
<p><strong>四、类的方法：</strong><br />
理解成类当中的函数即可。<br />
调用：<br />
1、内部调用：可使用$this-&gt;Fanname();或$this-&gt;addab()或test::addab();<br />
2、实例化调用时，用$e-&gt;addab();即可。对于在该方法中没有使用$this关键字的，如上例中的：<br />
function addab() {    return $this-&gt;a+$this-&gt;b;    }<br />
改为： function addab() {    return 25;    }那在在外部实例调用该方法，也可用“$e::addab();”或“test::addab();”</p>
<p><strong>五、类的常量：</strong><strong><br />
</strong>如果类的属性理解成类中的变量，那么类的常量和变量是不一样的，其定义方法为：<br />
class test{<br />
      private $a;<br />
      const PI = &#8217;3.14&#8242;;<br />
      &#8230;..<br />
      //在类中调用上面的常量用两种方法，“$this::PI”,或 “类名::PI”,这里就是test::PI,如下：<br />
      function getvalue(){<br />
            return $this-&gt;a * $this::PI; //或$this-&gt;a * test::PI,用this关键字或类名均可，但都要用双冒号。<br />
     }<br />
}<br />
$e= new test();<br />
$e-&gt;PI =5;   //注意，这里用 -&gt;只是创造了一个也是名为PI的属性，而不是改变类中的PI常量的值。<br />
echo $e::PI; //这个才是调用类的常量。<br />
常量只能用双冒号::来调用。并且不能更改其值。<br />
在类外部实例化后调用类常量同样也有两种方法。方法为：<br />
“$e::PI”   或 “test::PI”，共同点是都要用冒号，不同点是外部不能用this关键字，只能用实例名，但类名::PI是通用的。</p>
<p><strong>六、类的静态成员（静态属性或静态方法）：</strong><strong><br />
</strong>如果需要创建供所有类的实例共享的字段或方法。就得用静态成员。有两个特征：<br />
1、静态成员是共产主义者，它让脚本上的所有该类的实例调用，但不能借助类的特定实例名调用，而是在类的外部，统一使用“类名::$成员名”的方式调用。而类的内部则统一使用 “self::$成员名”来调用。<br />
2、当每一次新创建实例时，静态成员会从上次创建的实例最后值开始重新计算，而不是类中初始的值开始计算。<br />
3、对于用public定义的静态成员，可以在外部更改它的值。private等则不行。<br />
class test{<br />
       public static $v = 0;<br />
    function __construct(){  self::$v++; }<br />
    static function getV(){   return self::$v; }<br />
}<br />
$a = new test();<br />
echo test::getV(); // 返回 1<br />
$b = new test();<br />
echo test::getV();   // 返回 2<br />
test::$v=8;   //由于public定义的成员，改变静态成员的值。<br />
$c = new test();<br />
echo test::getV();   // 返回 9</p>
<p><strong>七、关键字：</strong><br />
（一）this关键字：用于类的内部指代类的本身。来访问属性或方法或常量，如$this-&gt;属性名或方法名。$this::常量名。this还可以用在该类的子类中，来指代本身的属性或方法。<br />
（二）双冒号“::”关键字：用于调用常量、静态成员。<br />
（三）self关键字:在类的内部与双冒号配合调用静态成员，如 self::$staticVar.，在类的内部，不能用$this来调用静态成员。<br />
（四）__toString()：在类中使用__toString()，用于将类转成字串并打印类，用处不大：如：<br />
class test{     public $p;<br />
   public function __toString(){   return var_export($this,TRUE);   }<br />
}<br />
$a=new test();<br />
echo $a; //输出：test::__set_state(array( &#8216;p&#8217; =&gt; NULL, ))，或写成：echo $a-&gt;__toString();<br />
（五）__clone() ：当克隆对象时，这个关键字才会发生作用，用于更改克隆时某些值。<br />
（六）__call()：方法重载，参下面示例：<br />
class cB{<br />
function __call($method,$n){<br />
    if($method==&#8217;showVarType&#8217;){<br />
        if(is_numeric($n[0])){   //不能用$n。要用$n[0];<br />
                $this-&gt;displayNum();<br />
           }else if (is_array($n[0])){<br />
                $this-&gt;displayArr();<br />
         }else{<br />
                $this-&gt;displayOther();<br />
        }<br />
   }<br />
}<br />
function displayNum() {<br />
        echo &#8216;&lt;h3&gt;这是数字!&lt;/h3&gt;&#8217;;<br />
}<br />
function displayArr() {<br />
      echo &#8216;&lt;h3&gt;这是数组!&lt;/h3&gt;&#8217;;<br />
}<br />
function displayOther() {<br />
      echo &#8216;&lt;h3&gt;不是数组也不是数字!&lt;/h3&gt;&#8217;;<br />
}<br />
}</p>
<p>$x=&#8217;a';<br />
$y=array(&#8216;a&#8217;,'b&#8217;);<br />
$b=new cB;<br />
$b-&gt;showVarType($x); //不是数组也不是数字<br />
$b-&gt;showVarType($y); //这是数组<br />
注意，不能在类中定义showVarType（）方法，否则代码不能用。<br />
（七）extends:继承: 如class a{}     class b extends a{} 类b继承了类a<br />
附：记忆：以后统一在调用方法或属性时用 &#8220;-&gt; &#8220;,调用常量则用双冒号“::”，不会搞晕。</p>
<p><strong>八、方法和属性的作用域：</strong><strong><br />
</strong>共有6种：public(默认，可省略，也等同于php6的var声明),private（私有，也不能由子类使用），protected(私有，但可由子类使用) ，abstract(抽象，参下文)，final(阻止在子类中覆盖—也称重载，阻止被继承，用于修饰类名及方法，如final class test{ final function fun(){}} ，但不能用于属性),static(静态)</p>
<p><strong>九：抽象类和抽象方法（</strong><strong>abstract——</strong><strong>注意：没有所谓抽象属性）</strong><strong>:</strong><strong><br />
</strong>抽象可以理解成父类为子类定义了一个模板或基类。作用域abstract只在父类中声明，但在子类中实现。注意事项：<br />
1、抽象类不能被实例化，只能被子类（具体类）继承后实现。<br />
2、抽象类必须在其子类中实现该抽象类的所有抽象方法。否则会出错。<br />
3、在抽象方法中，只是声明，但不能具体实现：如abstract function gettow(){ return $this-&gt;p; }是错的，只能声明这个方法：abstract function gettow();（连方括号{}都不要出现）,抽象方法和抽象类主要用于复杂的类层次关系中。该层次关系需要确保每一个子类都包含并重载了某些特定的方法。这也可以通过接口实现<br />
4、属性不能被命名为抽象属性，如abstract $p = 5是错的。<br />
5、只有声明为抽象的类可以声明抽象方法，但如果方法声明为抽象，就不能具体实现。如：<br />
abstract class Employee<br />
{<br />
    abstract function a(&#8230;);<br />
    abstract function b(&#8230;);<br />
}<br />
以后再对这个父类扩展，组成各种子类（如经理，员工，出纳）。<br />
6、抽象类中，如果要实现具体的方法，不能声明为抽象。这样可能实际意义更大。可以把几个类库中共同的部分提取到抽象类中，其它的类继承抽象类即可。如下：<br />
abstract class BaseShop{<br />
     Const TAX=0.06;    // 在抽象类中定义常量<br />
    public function buy($gid) {     // 如果定义为抽象方法abstract function buy（）就不能在这里实现主体。<br />
         echo(&#8216;你购买了ID为 :&#8217;.$gid.&#8217;的商品&#8217;);<br />
   }<br />
      public function sell($gid) {<br />
      echo(&#8216;你卖了ID为 :&#8217;.$gid.&#8217;的商品&#8217;);<br />
      }<br />
     public function view($gid) {<br />
       echo(&#8216;你查看了ID为 :&#8217;.$gid.&#8217;的商品&#8217;);<br />
     }<br />
}<br />
class BallShop extends BaseShop{<br />
     var $itme_id = null;<br />
     public function __construct()<br />
    {<br />
          $this-&gt;itme_id = 2314;<br />
     }<br />
     public function open()<br />
      {<br />
         $this-&gt;sell($this-&gt;itme_id);<br />
     }<br />
      public function getTax()<br />
     {<br />
              echo printf(&#8216;&lt;h3&gt;平均税率是 %d%%。&lt;/h3&gt;&#8217;,$this::TAX*100);<br />
      }<br />
}<br />
$s = new BallShop;<br />
$s-&gt;open(); //你卖了ID为 :2314的商品<br />
$shop-&gt;getTax();</p>
<p align="left"><strong>十：类型提示：</strong><br />
注意，类型提示功能只能用于参数为对象的提示，而无法用于为整数，字串，浮点等类型提示。有些类的方法需要传入的参数为所期望的对象类型，可以用下面的方法达到强制实施此替则。要达到类型提示，只要在方法的对象型参数前加一个已存在的类的名称，如：function funname(OtherClassName $otherclassINSName,$c&#8230;.)，注意，OtherClassName必须是存在的类。如下：<br />
class em{   var $k=56; }<br />
class test{<br />
function __construct()<br />
{   echo $this-&gt;addab(new em(),2);   }</p>
<p align="left">function addab(em $j,$c)   //这个方法，即可以在内部调用，也可以在外部调用。只要作用域许可。<br />
{    return $j-&gt;k+$c; }<br />
}<br />
$a = new test();<br />
$b = new em();<br />
echo $a-&gt;addab($b,2); //或 $a-&gt;addab(new em(),2);</p>
<p align="left"><strong>十一、类的管理：</strong><br />
1、instanceof关键字：用于分析一个对象是否是某一个类的实例或子类或是实现了某个特定的接口：如下例，但要注意： 类名没有任何引号等定界符，否则会出错。如test不能用&#8217;test&#8217;<br />
class test2{}<br />
class test{}<br />
class testChilern Extends test{}<br />
$a = new test2();<br />
$m = new test();<br />
$i = ($m instanceof test);<br />
if($i)echo &#8216;$m是类test的实例！&lt;br /&gt;&#8217;; // get this value<br />
switch ($a instanceof test){<br />
   case true :<br />
           echo &#8216;YES&lt;br /&gt;&#8217;;<br />
            break;<br />
    case false :<br />
            echo &#8216;No&lt;br /&gt;&#8217;;   //get this value<br />
    break;<br />
}<br />
$d=new testChilern();<br />
if($d instanceof test)echo &#8216;$d是类test的子类！&lt;br /&gt;&#8217;; // get this value<br />
2、确定类是否存在：boolean class_exists(string class_name): class_exists(&#8216;test&#8217;);<br />
3、返回类名：string get_class(object)，成功时返回实例的类名，失败则返回FALSE：<br />
$a = new test2(); echo get_class($a);   //返回 test2<br />
4、了解类的公用属性：array get_class_vars(&#8216;className&#8217;) ,返回关键数组：包含所有定义的public属性名及其相应的值。这个函数不能用实例名做变量<br />
5、返回类方法：get_class_methods(&#8216;test&#8217;); //或： get_class_methods($a);可用实例名做参数，返回包括构造函数在内的所有非私有方法。<br />
6、print_r(get_declared_classes())了解当前PHP版本中所有的类名。PHP5有149个。<br />
7、get_object_vars($a)返回实例中所有公用的属性及其值的关联数组。注意它和get_class_vars()的区别：<br />
/* (1) get_object_vars($a)是用实例名做参数，而get_class_vars(&#8216;test&#8217;)是用类名做参数。<br />
* (2) get_object_vars($a)获得的属性值是实例运行后的值，而get_class_vars(&#8216;test&#8217;)获得的属性值是类中的初始定义。<br />
* (3) 两者均返回关联数组，且均对未赋值的属性返回NULL的值。如类test中有定义了public $q;则返回Array ( [v] =&gt; 5 [q]=&gt;) ,<br />
*/<br />
8、返回父类的名称：get_parent_class($b);//或get_parent_class(&#8216;test2&#8242;); 返回test<br />
9、确定接口是否存在：boolean interface_exists($string interface[,boolean autoload])<br />
10、确定对象类型： boolean is_a($obj,&#8217;className&#8217;)，当$obj属于CLASSNAME类时，或属于其子类时，返回TRUE，如果$obj与class类型无关则返回FALSE。如：is_a($a,&#8217;test&#8217;)<br />
11、确定是否是某类的子对象：当$b是继承自TEST类时，返回TRUE，否则FALSE。boolean is_subclass_of($b,&#8217;test&#8217;);<br />
12、确定类或实例中，是否存在某方法。method_exists($a,&#8217;getv&#8217;) //或用method_exists(&#8216;test&#8217;,'getv&#8217;)，此函数适用于非public定义的作用域的方法。<br />
以上函数实例：<br />
class test{<br />
public $v=2;<br />
private $c=5;<br />
function __construct(){<br />
   $this-&gt;v=5;<br />
}<br />
private function getv(){<br />
   return $this-&gt;v;<br />
}<br />
}<br />
class test2 extends test{}</p>
<p align="left">$a=new test();<br />
$b=new test2();<br />
print_r( get_class_methods(&#8216;test&#8217;)); //或：print_r( get_class_methods($a)); 均返回：Array ( [0] =&gt; __construct [1] =&gt; getv )<br />
echo &#8216;&lt;br /&gt;&#8217;;<br />
print_r( get_class_vars(&#8216;test&#8217;)); //返回：Array ( [v] =&gt; 2 )，和上面不一样，不能用print_r( get_class_methods($a));<br />
echo &#8216;&lt;br /&gt;&#8217;;<br />
echo get_parent_class($b);//或get_parent_class(&#8216;test2&#8242;); 返回test<br />
echo &#8216;&lt;br /&gt;&#8217;;<br />
echo is_a($b,&#8217;test&#8217;);// 返回1<br />
echo &#8216;&lt;br /&gt;&#8217;;<br />
if(is_subclass_of(&#8216;test2&#8242;,&#8217;test&#8217;))echo &#8216;是子类！&#8217;; //或(is_subclass_of($b,&#8217;test&#8217;)),返回1，当参数1为$a时则返回false,<br />
echo &#8216;&lt;br /&gt;&#8217;;<br />
echo method_exists($a,&#8217;getv&#8217;) //或用method_exists(&#8216;test&#8217;,'getv&#8217;)返回1,本函数也适用于用private等定义域的方法。</p>
<p align="left"><strong>十一、自动加载类库文件：</strong><strong><br />
</strong>当类多了以后，比如要在一个文件中载入3个类库文件：a.class.php,b.class.php,c.class.php要用三个require_once(&#8216;classes/a.class.php);<br />
require_once(&#8216;classes/b.class.php);<br />
require_once(&#8216;classes/c.class.php);<br />
可以用PHP5自动加载的功能来处理：在全局应用配置文件中，定义一个特殊的函数__autoload($class)函数（__autoload并不是一个类的方法，只是单独的函数，和类没有关系）：<br />
function __autoload($class){<br />
     require_once(&#8220;classes/$class)<br />
}<br />
该函数放哪没有关系，在创建类实例时，也不必去调用这个autoload函数。PHP会自动完成。但务必注意一点：“在调用页面上创建实例所使用的类名称”、和“被调用的文件名”、以及“该文件中的类的名称”3个必须是一样的。这样就不需要去调用__autoload();如果不一样则必须单独调用__autoload(&#8216;c&#8217;);并给它一个文件名前缀。如：<br />
c.class.php文件的代码是：<br />
&lt;?php<br />
class c{<br />
public $m=7;<br />
}<br />
?&gt;这里代码的类名称是c,而文件名也是c，<br />
现在要在index.php调用：<br />
&lt;?php<br />
function __autoload($class){<br />
require_once &#8220;$class.class.php&#8221;;<br />
}</p>
<p align="left">$m = new c(); //创建实例调用的类也是c<br />
echo $m-&gt;m;<br />
?&gt;<br />
此时PHP会自动调用根目录下的c.class.php中的类C。</p>
<p align="left">但如果c.class.php中的代码是：<br />
&lt;?php<br />
class mm{<br />
public $m=7;<br />
}<br />
?&gt;<br />
而调用页index.php代码是：<br />
&lt;?php<br />
function __autoload($class){<br />
require_once &#8220;$class.class.php&#8221;;<br />
}<br />
# __autoload(&#8216;c&#8217;); //如果不加这一行就会出错。<br />
$m = new mm();<br />
echo $m-&gt;m;<br />
?&gt;<br />
会出错，提示找不到mm.class.php文件。这时可以加一行__autoload(&#8216;c&#8217;);但这样就达不到简化代码的目的。
</p>
<p align="left">类的家族化扩展：类的高级功能：</p>
<p><strong>一、对象克隆：</strong><br />
当克隆一个对象的实例时，其属性初始值继承了被克隆对象的当前值。<br />
class test<br />
{<br />
public $p=5;<br />
function __clone(){    //只在克隆发生时起作用。用于改变在克隆时某些值<br />
         $this-&gt;p=15;  <br />
   }<br />
}<br />
$a=new test();<br />
echo $a-&gt;p;<br />
$a-&gt;p=8; //如果没有__clone()方法影响，$b的P值将为8<br />
$b = clone $a;<br />
echo $b-&gt;p; //15</p>
<p><strong>二、对象继承：</strong></p>
<p>没有被声明为final的类可以被继承，没有被final和private界定的方法也可以继承，没有被private界定的属性也可以继承。当子类继承了父类或超类后，可以直接使用父类或超类（祖父类以及祖父的祖父）的所有允许的方法，属性。<br />
关键：理解构造函数和重载在继承中的特性！<br />
（一）构造函数在继承中的特性：<br />
1、当父类有构造函数而子类没有：则子类会在实例化时会自动执行父类的构造函数。这时如果要创建子类的实例，需要引入父类构造函数中所需的参数，否则出错。即使是“子类的子类”如果没有构造函数，也要在创建实例时输入其父类的父类的构造函数所需参数。PHP会从实例所在的子类会向上搜索合造的构造函数，一旦找到就停止，使用该构造函数。而不会再向上搜索，因此：子类本身如果没有构造函数，则以其最靠近的一个超类并且有构造函数的为准。<br />
class cA{<br />
public $name,$age;<br />
   function __construct($n) { <br />
         $this-&gt;name = $n;<br />
       $this-&gt;age = 25;<br />
}<br />
function __set($n,$v) {<br />
           $this-&gt;$n = $v;<br />
   }<br />
function __get($n) {<br />
      return $this-&gt;$n;<br />
   }<br />
}</p>
<p>class cB extends cA{<br />
   function funB1()   {          echo &#8216;&lt;h3&gt;Class cB execute success!&lt;/h3&gt;&#8217;;   }<br />
}</p>
<p>class cC extends cB {<br />
function funC1() {     echo &#8216;&lt;h3&gt;Class cC FunC1!&lt;/h3&gt;&#8217;; }<br />
}<br />
$b=new cB(&#8216;Jack&#8217;);<br />
$b-&gt;name=&#8217;John&#8217;;<br />
echo &#8220;$b-&gt;name : $b-&gt;age&#8221;;<br />
$b-&gt;funB1();<br />
$c=new cC(); //这里会出错，由于cB也没有构造函数，因此再向上以cA为准，需要一个参数。改为$c=new cC(&#8216;David&#8217;);即可。<br />
echo $c-&gt;name(); //David<br />
2、当子类也有构造函数时：这时，不管父类是否有构造函数，都会执行子类自己的构造函数。<br />
如上：<br />
class cB extends cA{<br />
function __construct() {<br />
   echo &#8216;&lt;h3&gt;this is Class cB \&#8217;s __construct!&lt;/h3&gt;&#8217;;<br />
}<br />
function funB1() {<br />
   echo &#8216;&lt;h3&gt;Class cB execute success!&lt;/h3&gt;&#8217;;<br />
}<br />
}<br />
现在类CB有自己的构造函数时，这时创建实例$b=new cB(&#8216;Jack&#8217;);参数JACK不会起作用，因为父类CA的构造函数没有得到执行。因此$b-&gt;name和$-&gt;age就不会初始化值。需要另外赋值$b-&gt;name=&#8217;Jack&#8217;,$b-&gt;age=25;<br />
如果这时要执行父类CA的构造函数，可以这样：<br />
function __construct($n) {<br />
      parent::__construct($n);   // 或：cA::__construct($n);<br />
      echo &#8216;&lt;h3&gt;this is Class cB \&#8217;s __construct!&lt;/h3&gt;&#8217;;<br />
}<br />
由于parent::__construct($n); 只会向上搜索父类的构造函数，一找到就停止且执行当前找到的构造函数，因此在上面例子中，如果parent::__construct($n)是用在最后一层的类cC中，并且类CB,CA都有构造函数，那么cC的实例只会执行cB的构造函数。不会执行cA。这时，如果CC的实例想都调用CA和CB的构造函数，有两种方法：<br />
A、在CB中也加入parent::__construct($n)<br />
B、在CC中把构造函数改为：<br />
function __construct($n) {<br />
      cA::__construct($n);   //即：类名::构造函数。<br />
     cB::__construct();<br />
echo &#8216;&lt;h3&gt;this is Class cB \&#8217;s __construct!&lt;/h3&gt;&#8217;;<br />
}<br />
（二）在子类中调用父类的属性或方法：<br />
1、调用父类方法：在子类中调用父类的方法，有3种方法：<br />
     $this-&gt;ParentFunction(); 或<br />
   父类名::ParentFunction();    或<br />
     parent::parentFun();<br />
2、调用父类属性：只能用$this-&gt;ParentProperty;<br />
（三）重载：<br />
在子类中，可以定义与父类相同属性或方法，改变父类该属性或方法的值或操作，称做重载。如：<br />
calss ParClass{ function pfun(){ &#8230;.}}<br />
class ChildrenClass extends ParClass{function pfun(){ &#8230;.}}} //重载了父类的pfun的方法。<br />
在子类中重载后，优先执行自己重载后的新定义的方法或属性。<br />
也可以在子类中用parent::parentFun();调用父类的方法，但所得到的值是子类自己输入的参数运算值。而不是该方法在父类中运算的值。</p>
<p><strong>三、接口：</strong></p>
<p>接口：interface，可以理解成一组功能的共同规范，最大意义可能就是在多人协作时，为各自的开发规定一个共同的方法名称。<br />
和抽象类中的抽象方法一样：<br />
1、不能在接口中对方法具体实现进行定义。而是由具体类来实现（而抽象类中的非抽象方法可以不必再定义，只有抽象方法和接口是一样要求要在具体类中实现）。<br />
2、和抽象类一样，可以在接口中定义常量，并由具体类直接继承。<br />
3、具体类必须实现抽象类的所有抽象方法（非抽象方法除外），同样，具体类如通过implements实现了接口后，必须完成接口中的所有方法。</p>
<p>接口实现过程：1、定义接口，2、用..implement X,Y,&#8230;和具体类对接。<br />
interface Info{    //定义接口<br />
     const N=22;<br />
     public function getage();<br />
     public function getname();<br />
}</p>
<p>class age implements Info //如要多个接口 class age （extends emJob） implements Info,interB&#8230;<br />
{<br />
    public $age=15;<br />
     public $name=&#8217;Join&#8217;;<br />
     function getage() {<br />
          echo &#8220;年级是$this-&gt;age&#8221;;<br />
     }<br />
      function getname() {<br />
             echo &#8220;姓名是$this-&gt;name&#8221;;<br />
      }<br />
      function getN(){<br />
             echo &#8216;&lt;h3&gt;在接口中定义的常量N的值是：&#8217;.$this::N.&#8217; &lt;/h3&gt;&#8217;; //直接继承接口中的常量值。<br />
     }<br />
}</p>
<p>$age=new age;<br />
echo $age::N; //22，直接调用接口中的常量值。<br />
$age-&gt;getN();<br />
关于抽象类和接口类的使用区分：何时用接口，何时用抽象？<br />
1、相关性：当创建的模型由一些紧密相关的对象采用时，用抽象。对于不相关对象采用的功能，用接口。<br />
2、多重继承：PHP类可以继承多个接口，但不能扩展多个抽象类。<br />
3、公共行为实现：抽象类可在其中实现公共的方法，但接口不行。</p>
<p><strong>四、命名空间（</strong><strong>PHP6</strong><strong>）</strong></p>
<p>类库脚本A.inc.php和脚本B.inc.php中都一个类的名称为 class CNAME，并且这两个文件要在同一个文件如index.php中被调用。这时要用到命名空间。<br />
步聚：<br />
1、打开上面的A和B两个文件，分别在上面的最前面各加一行：<br />
namespace SPACEA;   和 namespace SPACEB;   名字自定。<br />
2、在index.php中实例化类时，在类的前面添加命名空间和双冒号做为前缀：<br />
include &#8216;a.inc.php&#8217;;<br />
include &#8216;b.inc.php&#8217;;<br />
$a=new SPACEA::CNAME();<br />
$b=new SPACEB::CNAME();<br />
这样就不会冲突了。<br />
但在PHP6正式发布前，这个功能还未定下来。</p>
<p><strong>五、实现迭代器和迭代。</strong><br />
参《PHP圣经》P142；</p>
<p><strong>六、使用</strong><strong>Reflection(</strong><strong>反射</strong><strong>)API </strong><strong>。</strong><br />
简易实例：<br />
class a{ &#8230;. }<br />
$c = new ReflectionClass(&#8216;a&#8217;); //PHP 内置类。<br />
echo &#8216;&lt;pre&gt;&#8217;.$c.&#8217;&lt;/pre&gt;&#8217;;<br />
输出类a的结构和内容。参《PHP圣经》P145;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/03/07/php-class-induction/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

