<?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; XML</title>
	<atom:link href="https://blog.gmem.cc/tag/xml/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Fri, 10 Apr 2026 07:50:36 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Dom4j知识集锦</title>
		<link>https://blog.gmem.cc/dom4j-faq</link>
		<comments>https://blog.gmem.cc/dom4j-faq#comments</comments>
		<pubDate>Thu, 17 Feb 2011 06:54:41 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Dom4j]]></category>
		<category><![CDATA[DTD]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XPath]]></category>
		<category><![CDATA[XSD]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1542</guid>
		<description><![CDATA[<p>如何禁止加载XSD和DTD [crayon-69d8c71499517070182589/] DTD验证，无法联网时报错 通过指定本地的DTD文档来解决： [crayon-69d8c7149951e018706658/] 使用JAXP来进行XSD验证 [crayon-69d8c71499521086330486/] Dom4j如何格式化XML输出 [crayon-69d8c71499523668649788/] 如何使用XPath解析带名字空间的XML [crayon-69d8c71499526466100149/] Dom4j访问者模式中，删除节点导致NullPointerException 报错：java.lang.NullPointerException at org.dom4j.tree.AbstractElement.accept(AbstractElement.java:208) 解决：在访问者中记录需要删除的节点，访问结束后一起删除。</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/dom4j-faq">Dom4j知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">如何禁止加载XSD和DTD</span></div>
<pre class="crayon-plain-tag">SAXReader reader = new SAXReader( true );
reader.setFeature( Constants.XERCES_FEATURE_PREFIX + Constants.LOAD_EXTERNAL_DTD_FEATURE, false );</pre>
<div class="blog_h3"><span class="graybg">DTD验证，无法联网时报错</span></div>
通过指定本地的DTD文档来解决：<br />
<pre class="crayon-plain-tag">SAXReader reader = new SAXReader( true );
reader.setEntityResolver( new EntityResolver() {

    public InputSource resolveEntity( String publicId, String systemId )
    {
        if ( publicId.equals( "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ) )
        {
            InputStream in = getClass().getResourceAsStream( "/hibernate-mapping-3.0.dtd" );
            return new InputSource( in );
        }
        return null;
    }
} );</pre>
<div class="blog_h3"><span class="graybg">使用JAXP来进行XSD验证</span></div>
<pre class="crayon-plain-tag">InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( XSD_FILE_PATH );
javax.xml.validation.SchemaFactory factory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
new StreamSource( is ) ).newValidator();
validator.validate( new StreamSource( new StringReader( xml ) ) );</pre>
<div class="blog_h3"><span class="graybg">Dom4j如何格式化XML输出</span></div>
<pre class="crayon-plain-tag">StringWriter sw = new StringWriter();
XMLWriter writer = new XMLWriter( sw, OutputFormat.createPrettyPrint() );
try
{
    writer.write( doc );
}
catch ( IOException e )
{
    // impossible
}</pre>
<div class="blog_h3"><span class="graybg">如何使用XPath解析带名字空间的XML</span></div>
<pre class="crayon-plain-tag">SAXReader reader = new SAXReader();
Map&lt;String, String&gt; nameSpaceMap = new HashMap&lt;String, String&gt;();
nameSpaceMap.put( "beans", "http://www.springframework.org/schema/beans" );
reader.getDocumentFactory().setXPathNamespaceURIs( nameSpaceMap );
Document doc = reader.read( new ClassPathResource( APP_CTX_FILE_NAME ).getInputStream() );
Element e = (Element) doc.getRootElement().selectSingleNode("beans:bean[@id='canaryConfig']/beans:property[@name='baseDir']" );
bd = e.attributeValue( "value" );</pre>
<div class="blog_h3"><span class="graybg">Dom4j访问者模式中，删除节点导致NullPointerException</span></div>
<p>报错：java.lang.NullPointerException at org.dom4j.tree.AbstractElement.accept(AbstractElement.java:208)<br />
解决：在访问者中记录需要删除的节点，访问结束后一起删除。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/dom4j-faq">Dom4j知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/dom4j-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP5学习笔记</title>
		<link>https://blog.gmem.cc/php5-study-note</link>
		<comments>https://blog.gmem.cc/php5-study-note#comments</comments>
		<pubDate>Thu, 15 May 2008 04:11:46 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=872</guid>
		<description><![CDATA[<p>第一部分：语言基础 PHP5注释 C方式：[crayon-69d8c71499dd1110766221-i/] 这是一个C风格的注释 *它可以跨越多行 *直到关闭标记 C++方式：[crayon-69d8c71499dd6231566149-i/] 这是一个C++风格的注释，它在行的末尾结束 Shell方式：[crayon-69d8c71499dd8758625978-i/] 这是一个Shell风格的注释，它在行的末尾结束 PHP5变量 变量不需要声明直接使用，可以自动改变类型，用[crayon-69d8c71499dda174849724-i/] 标志当变量名的前缀 主脚本中定义的变量，若在函数中使用，需要[crayon-69d8c71499ddc959998589-i/] 方式引用 不支持全局变量，除了预定义的超全局变量： 超全局变量 说明 [crayon-69d8c71499dde925472241-i/]  包含所有PHP从客户浏览器接收的GET参数的数组，包括通过URL发送的数据 [crayon-69d8c71499de0856729342-i/]  包含所有PHP从客户浏览器接收的POST参数的数组 [crayon-69d8c71499de2648091300-i/]  包含所有请求参数的数组 [crayon-69d8c71499de4901810041-i/]  包含所有PHP从客户浏览器接收的cookies的数组 [crayon-69d8c71499de7162544289-i/]  <a class="read-more" href="https://blog.gmem.cc/php5-study-note">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/php5-study-note">PHP5学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">第一部分：语言基础</span></div>
<div class="blog_h2"><span class="graybg">PHP5注释</span></div>
<p>C方式：<pre class="crayon-plain-tag">/**/</pre> 这是一个C风格的注释 *它可以跨越多行 *直到关闭标记<br /> C++方式：<pre class="crayon-plain-tag">//</pre> 这是一个C++风格的注释，它在行的末尾结束<br /> Shell方式：<pre class="crayon-plain-tag">#</pre> 这是一个Shell风格的注释，它在行的末尾结束</p>
<div class="blog_h2"><span class="graybg">PHP5变量</span></div>
<div>
<ol>
<li>变量不需要声明直接使用，可以自动改变类型，用<pre class="crayon-plain-tag">$</pre> 标志当变量名的前缀</li>
<li>主脚本中定义的变量，若在函数中使用，需要<pre class="crayon-plain-tag">$GLOBALS[]</pre> 方式引用</li>
<li>不支持全局变量，除了预定义的超全局变量：</li>
</ol>
</div>
<div class="bstab">
<table class="full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">超全局变量</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td><pre class="crayon-plain-tag">$_GET[]</pre> </td>
<td>包含所有PHP从客户浏览器接收的GET参数的数组，包括通过URL发送的数据</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">$_POST[]</pre> </td>
<td>包含所有PHP从客户浏览器接收的POST参数的数组</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">_REQUEST</pre> </td>
<td>包含所有请求参数的数组</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">$_COOKIE[]</pre> </td>
<td>包含所有PHP从客户浏览器接收的cookies的数组</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">$_ENV[]</pre> </td>
<td>包含环境变量的数组</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">$_SERVER[]</pre> </td>
<td>存放服务器变量的数组<br />
<pre class="crayon-plain-tag">$_SERVER['PHP_SELF']	        #返回当前执行脚本的文件名。
$_SERVER['GATEWAY_INTERFACE']	#返回服务器使用的 CGI 规范的版本
$_SERVER['SERVER_ADDR']	        #返回当前运行脚本所在的服务器的IP地址
$_SERVER['SERVER_NAME']	        #返回当前运行脚本所在的服务器的主机名
$_SERVER['SERVER_SOFTWARE']	    #返回服务器标识字符串
$_SERVER['SERVER_PROTOCOL']	    #返回请求页面时通信协议的名称和版本，例如HTTP/1.0
$_SERVER['REQUEST_METHOD']	    #返回访问页面使用的请求方法
$_SERVER['REQUEST_TIME']	    #返回请求开始时的时间戳
$_SERVER['QUERY_STRING']	    #返回查询字符串，如果是通过查询字符串访问此页面。
$_SERVER['HTTP_ACCEPT']	        #返回来自当前请求的请求头
$_SERVER['HTTP_ACCEPT_CHARSET']	#返回来自当前请求的Accept_Charset头
$_SERVER['HTTP_HOST']	        #返回来自当前请求的Host头。
$_SERVER['HTTP_REFERER']	    #返回当前页面的完整URL
$_SERVER['HTTPS']	            #是否通过安全 HTTP 协议查询脚本
$_SERVER['REMOTE_ADDR']	        #返回浏览当前页面的用户的IP地址
$_SERVER['REMOTE_HOST']	        #返回浏览当前页面的用户的主机名。
$_SERVER['REMOTE_PORT']	        #返回用户机器上连接到Web服务器所使用的端口号
$_SERVER['SCRIPT_FILENAME']     #返回当前执行脚本的绝对路径
$_SERVER['SERVER_ADMIN']        #Apache服务器配置文件中的 ERVER_ADMIN参数
$_SERVER['SERVER_PORT']	        #Web服务器使用的端口
$_SERVER['SERVER_SIGNATURE']	#返回服务器版本和虚拟主机名
$_SERVER['PATH_TRANSLATED']     #当前脚本所在文件系统（非文档根目录）的基本路径
$_SERVER['SCRIPT_NAME']	        #返回当前脚本的路径
$_SERVER['SCRIPT_URI']	        #返回当前页面的 URI</pre>
</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">$_SESSION</pre> </td>
<td>存放会话变量的数组</td>
</tr>
</tbody>
</table>
</div>
<div class="blog_h3"><span class="graybg">变量类型提示</span></div>
<p>在PHP5中，允许在声明函数时，为<span style="background-color: #c0c0c0;">对象、接口、数组或者callable类型的入参</span>强制声明类型。对于字符串、整型等标量类型，不支持类型提示：</p>
<pre class="crayon-plain-tag">class Person {}
function sayHello (Person $p, $times) {}</pre>
<div class="blog_h3"><span class="graybg">变量的间接引用</span></div>
<div>
<pre class="crayon-plain-tag">$name = "John"；
$$name = "Registered user";   // $$$var 这样的形式也是可能的
print $John;                  // 打印：Registered user</pre>
</div>
<div class="blog_h3"><span class="graybg">变量管理函数</span></div>
<div>
<pre class="crayon-plain-tag">isset()                        // 用来判断某个变量是否已经被PHP声明。它返回一个布尔型的值
isset($arr["offset"])          // 如果$arr或者$obj["offset"]没有声明，则返回false
isset($obj-&gt;property)          // 如果$obj或者$obj-&gt;property没有声明，则返回false
isset{$varl, $var2, $var3);    // 如果所有变量均声明，则返回true
unset()                        // 可以取消定义之前定义的变量，如没有其他变量在引用它则释放内存
empty()                        // 可以用来检查一个变量是否没被声明或者值是false</pre>
</div>
<div class="blog_h2"><span class="graybg">基础数据类型</span></div>
<div>PHP包含8种数据类型，其中有5种属于数值类型。</div>
<div class="blog_h3"><span class="graybg">整型</span></div>
<div>值范围与C编译器的long值范围一致，支持8/10/16进制：<br />
<pre class="crayon-plain-tag">$x = 5985;
$x = - 345;
$x = 0x8C; // 十六进制数
$x = 047; // 八进制数</pre>
</div>
<div class="blog_h3"><span class="graybg">浮点型</span></div>
<p>值范围与C编译器double类型有关，可以使用科学计数法：</p>
<pre class="crayon-plain-tag">$x = 10.365;
$x = 2.4e3;
$x = 8E-5;</pre>
<div class="blog_h3"><span class="graybg">布尔型</span></div>
<p>表示逻辑的真假，可以取值<pre class="crayon-plain-tag">true</pre> 或者<pre class="crayon-plain-tag">false</pre> 。</p>
<div class="blog_h3"><span class="graybg">布尔转换规则</span></div>
<div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="text-align: center;">数据类型</td>
<td style="text-align: center;">false值</td>
<td style="text-align: center;">true值</td>
</tr>
</thead>
<tbody>
<tr>
<td>整型</td>
<td>0</td>
<td>所有非零值</td>
</tr>
<tr>
<td>浮点型</td>
<td>0.0</td>
<td>所有非零值</td>
</tr>
<tr>
<td>字符串</td>
<td>""、"0"</td>
<td>所有其他字符串</td>
</tr>
<tr>
<td>NULL</td>
<td>总是</td>
<td>总不</td>
</tr>
<tr>
<td>数组</td>
<td>如果不含任何元素</td>
<td>含有一个以上元素</td>
</tr>
<tr>
<td>对象</td>
<td>总不</td>
<td>总是</td>
</tr>
<tr>
<td>资源</td>
<td>总不</td>
<td>总是</td>
</tr>
</tbody>
</table>
</div>
<div class="blog_h3"><span class="graybg">字符串</span></div>
<p>字符序列，自动地用null做结束的组合，与C字符串不一样的是，不需要以null符号计算其长度。字符串有三种表示方式：</p>
<pre class="crayon-plain-tag">#双引号界定的字符串：支持嵌入变量或者表达式，以及转义字符：
$str = "Hello,$user_name.\"";
$str = "The array offset $i contains $arr[$i]";

#单引号界定的字符串：不支持变量嵌入，仅支持'、\这两个字符的转义
$str = 'Hello, World';
$str = 'Today\'s the day';

#定界符界定的字符串：转义和嵌入变量的支持类似于""，但是不需要转义"
$str = &lt;&lt;&lt;DEMINITER
Hello
There
DEMINITER
#访问单个字符，索引从0开始
$c = $str{0};</pre>
<div class="blog_h3"><span class="graybg">数组</span></div>
<p>一个键/值对的集合，索引可以是整数或者字符串，值可以是任意类型：</p>
<pre class="crayon-plain-tag">// 声明关联数组
$arr = array(
    'key1' =&gt; 'val1',
    'key2' =&gt; 'val2',
    'key3' =&gt; 'val3'
);
// 声明索引数组，等价于 array(0 =&gt; 'a', 1 =&gt; 'b')
array(
    'a',
    'b'
);
// 声明索引数组，等价于 array(1 =&gt; "ONE", 2 =&gt; "TWO", 3 =&gt; "THREE" )
array(
    1 =&gt; "ONE",
    "TWO",
    "THREE"
);

// 访问数组元素
$arr[key];
// 获得数组长度
$c = count($arr);

// 通过数字索引遍历数组
$cars = array(
    "Volvo",
    "BMW"
);
$arrlength = count($cars);
for ($x = 0; $x &lt; $arrlength; $x ++) {
    echo $cars[$x];
}
// 通过foreach遍历数组: foreach($array as [$key =&gt; ] [&amp;] $value) {}
// 举例：
$user = array(
    "Bill" =&gt; "35",
    "Steve" =&gt; "37",
    "Peter" =&gt; "43"
);
foreach ($user as $name =&gt; $age) {
    echo "User " . $name . "'s age is " . $age;
}


$nums = [0, 1, 2];
$ass = array(
    'k0' =&gt; 0,
    'k1' =&gt; 1,
    'k2' =&gt; 2
);
# 可以把关联数组转换为索引数组
print_r(array_values($ass));

# 删除一个元素，但是不改变剩余元素的索引
unset($nums[1]);    # [ 0, 2 ]
unset($ass['k1']);  # { k0 =&gt; 0, k2 = &gt; 2 }


$nums = [1, 2, 3, 4, 5, 6];

# 切片操作，获得一个子数组
$sub = array_slice($nums, 1, 3); # [2, 3, 4]，源数组不变
# diff操作，根据值过滤，生成一个新数组，所有元素索引不变
$sub = array_diff($nums, [3, 4]);  # [1, 2, 4=&gt;5, 5=&gt;6]
# differ操作，根据key过滤，生成一个新数组，所有元素索引不变
# 注意第二个参数：key可以写为字符串，自动转换为索引数字；value则随意
$sub = array_diff_key($nums, [3 =&gt; null, '4' =&gt; null]); # [1, 2, 3, 5=&gt;6]


# 删除若干元素，并且reindex
array_splice($nums, 1, 3);  # 返回值也是 [2, 3, 4]，但是源数组也被修改：[1, 5, 6]</pre>
<p>索引为整数的数组，也称为<span style="background-color: #c0c0c0;">索引数组</span>；索引为字符串的数组，也称为<span style="background-color: #c0c0c0;">关联数组</span>。</p>
<div class="blog_h3"><span class="graybg">空值</span></div>
<p>这一特殊类型用于表示变量“没有值”，<pre class="crayon-plain-tag">null</pre> 是该类型唯一的有效值。</p>
<div class="blog_h3"><span class="graybg">常量</span></div>
<p>一经定义，全局可用，不能在新的函数、PHP文件中重新声明他们，声明语法：</p>
<pre class="crayon-plain-tag">define("CONSTANT_NAME", value [, case-sensitivity]);</pre>
<div class="blog_h2"><span class="graybg">PHP5运算符（按优先级高低降序排列）</span></div>
<div class="bstab">
<table class=" full-width fixed-word-wrap" style="width: 100%;">
<thead>
<tr>
<td style="width: 130px; text-align: center;">运算符</td>
<td style="width: 100px; text-align: center;">名称</td>
<td style="width: 80px; text-align: center;">结合性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>new</td>
<td>创建对象</td>
<td>无</td>
<td>创建新的对象</td>
</tr>
<tr>
<td>[]</td>
<td>数组元素操控</td>
<td>右</td>
<td>读写数组的元素</td>
</tr>
<tr>
<td>!</td>
<td>逻辑否</td>
<td>右</td>
<td>后续表达式为true，则整个表达式为false</td>
</tr>
<tr>
<td>~</td>
<td>按位否</td>
<td>右</td>
<td>如果是数字操作数，得到的是操作数 按位非的结果（浮点值会被先转变为 整型值）如果是字符串，将得到相同长度并且每个字符都是原来字符接位非的新的字符串</td>
</tr>
<tr>
<td>++</td>
<td>递增</td>
<td>右</td>
<td>将变量的值增加1，包括$var++  ++$var两种</td>
</tr>
<tr>
<td>--</td>
<td>递减</td>
<td>右</td>
<td>将变量的值减小1 ，包括$var--   --$var两种</td>
</tr>
<tr>
<td>(type)</td>
<td>强制转型</td>
<td>右</td>
<td>包括： (int) (integer) (float) (real) (double)(string) (bool) (Boolean) (array) (object)</td>
</tr>
<tr>
<td>@</td>
<td>错误抑制</td>
<td>右</td>
<td>把表达式求值过程中的错误忽略掉</td>
</tr>
<tr>
<td>*    /    %    +    -</td>
<td>算术运算符</td>
<td>左</td>
<td>%为取模：两个操作数都被转变成整型，结果是第一个操作数 除第二个操作数余数</td>
</tr>
<tr>
<td>.</td>
<td>字符串连接</td>
<td>左</td>
<td>处理字符串的连接，非字符串会自动转换</td>
</tr>
<tr>
<td>&lt;&lt;</td>
<td>按位左移</td>
<td>左</td>
<td>按位左移，移出的丢弃，右侧补0</td>
</tr>
<tr>
<td>&gt;&gt;</td>
<td>按位右移</td>
<td>左</td>
<td>按位右移，移出的丢弃，左侧补0</td>
</tr>
<tr>
<td>&lt;   &lt;=</td>
<td>小于(等于)</td>
<td>无</td>
<td rowspan="4">逻辑运算，返回布尔值，字符串按字典序比较</td>
</tr>
<tr>
<td>&gt;   &gt;=</td>
<td>大于(等于)</td>
<td>无</td>
</tr>
<tr>
<td>==</td>
<td>等于</td>
<td>无</td>
</tr>
<tr>
<td>!=   &lt;&gt;</td>
<td>不等于</td>
<td>无</td>
</tr>
<tr>
<td>===</td>
<td>全等于</td>
<td>无</td>
<td rowspan="2">===与==相似，但是操作的数据类型必须匹配。不执行自动转换类型：例如1===”1″返回 false</td>
</tr>
<tr>
<td>!==</td>
<td>不全等于</td>
<td>无</td>
</tr>
<tr>
<td>&amp;</td>
<td>按位与</td>
<td>左</td>
<td>除非两个给定的参数都是字符串，否则参数将被转换到相应的整型数，然后再执行按位与运算</td>
</tr>
<tr>
<td>^</td>
<td>按位异或</td>
<td>左</td>
<td>除非两个给定的参数都是字符串，否则参数将被转换到相应的整型数，然后再执行按位异或运算</td>
</tr>
<tr>
<td>|</td>
<td>按位或</td>
<td>左</td>
<td>除非两个给定的参数都是字符串，否则参教将被转换到相应的整型数，然后再执行按位或运算</td>
</tr>
<tr>
<td>&amp;&amp;</td>
<td>逻辑与</td>
<td>左</td>
<td>短路，如果操作数1为false</td>
</tr>
<tr>
<td>||</td>
<td>逻辑或</td>
<td>左</td>
<td>短路，如果操作数1为true</td>
</tr>
<tr>
<td>?:</td>
<td>三目运算符</td>
<td>左</td>
<td> </td>
</tr>
<tr>
<td>=</td>
<td>赋值</td>
<td>左</td>
<td>将右操作数的值赋给左边的变量</td>
</tr>
<tr>
<td>=&amp;</td>
<td>引用赋值</td>
<td>左</td>
<td>相当于别名</td>
</tr>
<tr>
<td>+=   -=  *=  /=  .=%=  &amp;=  |=  ^=  ~=&lt;&lt;=  &gt;&gt;=</td>
<td>带操作的赋值</td>
<td>左</td>
<td>先执行指定的计算，在把计算结果赋给左值</td>
</tr>
<tr>
<td>and</td>
<td>逻辑与</td>
<td>左</td>
<td rowspan="3">类似上面的逻辑运算符，只是优先级更低</td>
</tr>
<tr>
<td>xor</td>
<td>逻辑异或</td>
<td>左</td>
</tr>
<tr>
<td>or</td>
<td>逻辑或</td>
<td>左</td>
</tr>
<tr>
<td>,</td>
<td>列表操作符</td>
<td>左</td>
<td> </td>
</tr>
</tbody>
</table>
</div>
<div class="blog_h2"><span class="graybg">PHP5程序控制结构</span></div>
<div class="blog_h3"><span class="graybg">条件控制结构</span></div>
<div>
<pre class="crayon-plain-tag">#C风格语法
if (expr)
    statement
elseif (expr)
    statement
elseif (expr)
    statement
else
    statement

#Pascal风格语法
if (expr)：
    statement list 
elseif (expr): 
    statement list 
else if (expr):
    statement list
else:
    statement list
endif;
#举例
<!--?php if ($num < 0): ?-->
    $num is negative<!--注意:HTML不会替换变量-->
<!--?php elseif{$num == 0): ?-->
    $num is zero
<!--?php elseif{$num --> 0): ?&gt;
    $num is positive
<!--?php endif; ?--></pre><br />
<pre class="crayon-plain-tag">#C风格语法
switch (expr){ 
    case expr:
        statement list 
    case expr:
        statement list
    default:
        statement list
}
#Pascal风格语法
switch (expr): 
    case expr:
        statement list
        break;#可以使用break跳出switch结构
    case expr:
        statement list
    default:
        statement list 
endswitch;
#举例
switch ($answer) { 
    case 'y': 
    case 'Y':
        print "The answer was yes\n";
        break;
    case 'n':
    case 'N':
        print "The answer was no\n";
        break;
    default: #如果没有匹配的，default语句被执行
        print "Error: $answer is not a valid answer\n";
        break;
}</pre>
</div>
<div class="blog_h3"><span class="graybg">循环控制结构</span></div>
<div>
<pre class="crayon-plain-tag">#C风格的while循环
while(expr)
    statement
#Pascal风格的while循环
while(expr):
    statementlist
endwhile;
#举例
$result = 1;
while ($n &gt; 0) {
    $result *= $n--;
    break;#用于跳出循环，break 1和break同义，表示跳出一层循环，类推，switch纳入计算
}
print "The result is $result";

#do-while循环
do{
    statement
}while(expr);

#C风格的for循环
for (expr, expr,…; expr,expr, …; expr,expr,…)
    statement
#Pascal风格的for循环
for (expr, expr,…; expr,expr, …; expr,expr,…):
    statementlist
endfor;</pre>
</div>
<div class="blog_h3"><span class="graybg">代码包含控制结构</span></div>
<div>include语句可以有返回值，被包含文件的作用域和主文件一致</div>
<div>
<pre class="crayon-plain-tag">#error_code.php
&lt;?php
    $OK = 0;
    $ERROR = 1;
?&gt;
#test.php
&lt;?php
    include "error_code.php";
    print("$OK");
    #include支持相对、绝对路径，动态合成绝对路径：
    include $_SERVER [ "DOCUMENT_ROOT"]."/script.php";
    #include遇到文件不存在的情况，会继续执行，要终止执行，可以使用require
    require "import.php";
?&gt;
#include_once、require_once保证只会包含进来一次</pre>
</div>
<div class="blog_h2"><span class="graybg">PHP5函数</span></div>
<p>函数作用域：默认情况下，<span style="background-color: #c0c0c0;">函数外部定义的变量，不能在函数内部访问</span>，使用<pre class="crayon-plain-tag">$GLOBALS[var_name]</pre> 可以提取并访问全局作用域的变量。<pre class="crayon-plain-tag">global</pre> 关键字可以引入全局变量到函数内部：</p>
<pre class="crayon-plain-tag">#函数声明语法
function function_name (argl, arg2, arg3,…){
    statement list
}
#声明函数时，函数名加&amp;前缀，则按引用方式传递返回值
function &amp;ret_by_ref ($n){
}
#声明函数时，参数名加&amp;前缀，则按引用方式传递参数
function &amp;arg_by_ref (&amp;$n,$default = 0){    #支持设置参数的默认值
    static times = 0;#支持静态函数变量
}
#函数调用语法
function_name (argl, arg2, arg3,…);

#global用法示例
global $varl, $var2,...;
function func{)
    global $var;
    $var = 2;
}
$var = 1;func();
print $var;#打印2</pre>
<div class="blog_h1"><span class="graybg">第二部分：面向对象特性</span></div>
<div class="blog_h2"><span class="graybg">类的声明和使用</span></div>
<div>
<pre class="crayon-plain-tag">class Person {
    function __construct($name)
    {
        $this-&gt;name = $name;
    }
    function getName()
    {
        #方法执行时，PHP自动生成$this变量
        return $this-&gt;name;
    }
    private $name;
    public $dob;
}；
$alex = new Person('Alex');
print $alex -&gt; getName();#使用-&gt;操作符访问对象成员
print $alex -&gt; dob;#注意，访问属性不要加$前缀 

#public/private/protected访问修饰符，针对对象中的方法和属性：
#PHP4的var声明还是支持的
class MyClass {
    private $id = 18;
    public function getld() { return $this-&gt;id;}
}
#统一构造函数名__construct ()：
class MyClass {
    function  __construct{) {
        print "Inside constructor";
    }
}
#统一析构函数名：__destruct()：
class MyClass {
    function __destruct()    {
        print "Destroying object";
    }
}
#instanceof 操作符PHP4的is_a()函数不推荐使用：
if ($obj instanceof Circle) { print '$obj is a Circle';}
#final标记方法 Final关键字允许你用来标识方法，使其不能被子类重载： 
class MyClass {
    final function getBaseClassName(){};
}
#final标记类,声明一个类为final类型后，它将不能被继承
final class FinalClass {}
class BogusClass extends FinalClass {}//错误

#强制复制对象，为了克隆一个对象，必须使用clone关键字
class MyClass {
function  __clone() {
    print "Object is being cloned";
}
$obj = new MyClass();
$obj_copy = clone $obj;

#类定义中现在包含常量，而且可以用类来引用:
class MyClass {
    const SUCCESS = const FAILURE = "Success";
}
print MyClass::SUCCESS;

#静态方法。静态方法不支持$this变量, 因为它们并没有绑定到任何具体的对象：
class MyClass {
    static function helloWorld { print "Hello, world";}
}
MyClass::helloWorld();

#静态成员，可以通过类自身来访问
class Singleton {
    static private $instance = NULL;
    private function __construct{} {}
    static public function getlnstanceO { if (self::$instance == NULL) {
        self::$instance = new SingletonO;
        return self::$instance;
    }
}

#抽象类。把类声明为抽象类可以防止它被实例化。但是你可以继承一个抽象类:
abstract class MyBaseClass { 
    function display() {
        print "Default display routine being called";
    }
}
#抽象方法。把方法声明为抽象的，以便在继承的子类中再去定义。包含抽象方法的类本身必须是一个抽象类：
abstract class MyBaseClass {
    abstract function display();
}

#对象类型提示
#函数声明中可以对参数进行对象类型提示。如果函数调用的时候没有传递正确的对象类型，系统报错：
function expectsMyClass(MyCiass $obj) {}

#多态：使用parent::来调用父类的方法，使用slef::调用当前类的静态方法
class Child extends Ancestor { 
    const NAME = "Child"; 
    function __construct(){
        parent::__construct();
        print self::NAME; 
    }
}
#__toString()函数，类似于Java的toString()

#foreach迭代对象属性，类似于数组迭代
$obj = new Class();
foreach($obj as $key =&gt; $val){
}
#实现接口Iterator可以修改迭代行为</pre>
</div>
<div class="blog_h2"><span class="graybg">接口</span></div>
<pre class="crayon-plain-tag">#接口声明语法
interface IA {
    function m();#不能给原型函数设置访问限定符
}
interface IB extends IA,I{
}
#实现接口的语法
class A implements B, C, ... {
}</pre>
<div class="blog_h2"><span class="graybg">异常处理</span></div>
<pre class="crayon-plain-tag">#try-catch语法
try {
    #会抛出一个异常的代码 
    throw new object();#只能抛出一个Exception类或其子类的实例
} catch (FirstExceptionClass $exception) {
    #异常处理代码
} catch (SecondExceptionClass $exception) {
    #异常处理代码
}
#Exception类的结构
class Exception {
    function __construct([$message [,$code]]);
    final public getMessage();
    final public getCode();
    final public getFile();
    final public getLine();
    final public getTrace();
    final public getTraceAsString();
    
}</pre>
<div class="blog_h2"><span class="graybg">__autoload：自动加载类</span></div>
<div>每个应用只能定义一个__autoload函数，当访问一个不存在的类时，该函数被调用，传递类名为参数<br />
<pre class="crayon-plain-tag">&lt;?php
function _autoload($class_name)
{
    require__once ($_SERVER ["DOCUMENT_ROOT"] . "/classes/$class_name.php";
}
?&gt;</pre>
</div>
<div class="blog_h1"><span class="graybg">第三部分：开发PHP Web应用</span></div>
<div class="blog_h2"><span class="graybg">嵌入PHP代码到HTML文档</span></div>
<pre class="crayon-plain-tag">&lt;?php 
#这是标准嵌入方法
?&gt;
&lt;?/*短代码，某些环境会关闭*/?&gt;
&lt;?=$var?&gt; #等价于&lt;?php echo($var)?&gt;</pre>
<div class="blog_h2"><span class="graybg">获取用户数据</span></div>
<div>$_GET可以得到GET参数，$_POST可以得到POST请求参数</div>
<div>$_REQUEST包含请求的所有数据，包括：$_GET、$_POST、$_COOKIE、$_ENV、$_SERVER，如果这些变量中包含同名的，则按照php.ini的配置进行覆写，后面的覆盖前面的，默认顺序是EGPCS</div>
<div class="blog_h2"><span class="graybg">错误处理</span></div>
<div>
<p>开发期可以设置error_reporting=E_ALL &amp; E_STRICT。通过设置log_errors/display_errors可以控制错误信息的流向，日志文件的位置可以通过error_log指定。可以指定全局错误处理函数：</p>
<pre class="crayon-plain-tag">#type为错误类型，可以是：E_NOTICE、E_WARNING、E_USER_NOTICE、E_USER_WARNING、E_USER_ERROR
#error为错误文本
error_function($type, $error, $file, $line);</pre>
</div>
<div class="blog_h2"><span class="graybg">操控Cookies</span></div>
<pre class="crayon-plain-tag">&lt;?php
    ob_start();//开启输出缓冲，若不开启，则无法正确写入响应头
    //设置Cookie，参数依次：cookie名称、值、过期时间、作用范围，作用范围可以是blog.gmem.cc、.gmem.cc这样的形式
    //删除Cookie，只需要将值设为''，并过期即可
    setcookie('uid', $uid, time()+3600, '/' );
?&gt;</pre>
<div class="blog_h2"><span class="graybg">PHP Session</span></div>
<p>每一个会话使用Session ID识别，该ID由客户端IP、当前时间、一些附加信息散列处理得到</p>
<pre class="crayon-plain-tag">&lt;?php 
    ini_set('session.use_cookies',1);
    ini_set('session.use_only_cookies',1);
    session_start();#必须紧跟ini_set后调用，创建一个session ID，并使用空$_SESSION初始化会话
    $_SESSION['uid'] = $uid;
    header('Location:/index');//重定向
    #销毁会话
    $_SESSION = array();
    session_destroy();
?&gt;</pre>
<div class="blog_h2"><span class="graybg">PHP 文件上传</span></div>
<form action="upload.php" enctype="multipart/form-data" method="POST">
<pre class="crayon-plain-tag">&lt;form enctype="multipart/form-data" action="upload.php" method="POST"&gt;
    &lt;input type="hidden" name="MAX_FILE_SIZE" value="16000" /&gt;
    Select File: &lt;input name="image" type="file"/&gt;
    &lt;input type="submit" value="Upload" /&gt;
&lt;/form&gt;
&lt;?php 
    $img = $_FILES['image'];#该数组存放所有文件上传信息
    print $img['name'];#文件在客户端OS的短名
    print $img['type'];#文件的MIME类型
    print $img['tmp_name'];#在服务器的临时文件名，在请求结束后即被删除
    print $img['error'];#错误代码:0成功,1超过php.ini的upload_max_file设置,2超过表单MAX_FILE_SIZE设置,3只接收到部分文件内容,4没有文件被上传
    print $img['size'];#文件大小
?&gt;</pre><br />
</form>
<div class="blog_h1"><span class="graybg">第四部分：访问数据库</span></div>
<div class="blog_h2"><span class="graybg">使用mysqli接口访问MySQL</span></div>
<div class="blog_h3"><span class="graybg">mysqli函数和方法列表</span></div>
<table class="full-width fixed-word-wrap" style="width: 100%;">
<thead>
<tr>
<td style="width: 35%; text-align: center;"><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;">函数名</span></td>
<td style="text-align: center;"><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;">描述</span></td>
</tr>
</thead>
<tbody>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_connect (...)
$mysqli = new mysqli(...)</pre>
</td>
<td>打开一个连向MySQL服务器的连接. 参数:主机名（string)、用户名（string)、密码（string)、数据库名（string)、TCP端口 (integer)</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_init() 
$mysqli = new mysqli() 
mysqli_options(…) 
$mysqli-&gt;options(…) 
mysqli_real_connect(…) 
$mysqli-&gt;real_connect (…)</pre>
</td>
<td>用mysqli_real_connect初始化MySQLi并且返回一个对象<br /> 设置不同的连接选项<br /> 打开一个连向MySQL服务器的连接</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_close (...) 
$mysqli-&gt;close ()</pre>
</td>
<td>关闭一个MySQL数据库连接，参数是连接对象（函数方式）</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_connect_errno()</pre>
</td>
<td>最后一次失败的连接的错误号</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_connect_error()</pre></p>
<p>&nbsp;</p>
</td>
<td>最后一次失败的连接的错误信息</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_get_host_info (...)
$mysqli-&gt;host_info</pre>
</td>
<td>返回数据库连接描述信息的字符串</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_query(...)</pre>
</td>
<td> 发送一个SQL语句并获得结果集对象，参数：连接（函数方式），SQL，模式（缓冲否）</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_multi_query(...)
$mysqli-&gt;multi_query(...)</pre>
</td>
<td> 一次发送并处理多个查询</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_fetch_row()
$mysqli-&gt;fetch_row()
mysqli_fetch_assoc(...)
$result-&gt;fetch_assoc()
mysqli_fetch_object(...)
$result-&gt;fetch_object()</pre>
</td>
<td> 抓取结果集行的方式：数组、关联数组、对象</td>
</tr>
<tr>
<td>
<pre class="crayon-plain-tag">mysqli_prepare(...)
$mysqli-&gt;prepare()
mysqli_stmt_bind_result(...)
$stmt-&gt;bind_result(...)
mysqli_stmt_bind_param(...)
$stmt-&gt;bind_ param(...)
mysqli_stmt_execute(...)
$stmt-&gt;execute()
mysqli_stmt_fetch(...)
$stmt-&gt;fetch()
mysqli_stmt_close(...)
$stmt-&gt;close()</pre>
</td>
<td>预编译语句相关的函数prepare：准备一个预编译语句，参数：(连接),SQL语句bind_result：绑定变量到结果集，参数：(语句),变量bind_param：绑定变量到语句，参数：(语句),类型,变量。类型包括：s字符串,i数字,d双字节浮点数,b=blob</p>
<p>execute：执行语句</p>
<p>stmt_fetch：获取数据到输出变量中</p>
<p>stmt_close：关闭预编译语句</p>
</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">代码示例：</span></div>
<pre class="crayon-plain-tag">&lt;?php
$conn = mysqli_connect("localhost", "username", "passwd", "dbname");
if (empty($conn)) {
    die("mysqli connect failed: " . mysqli_connect_error());
}
// 另外一种风格
$mysqli = new mysqli("localhost", "username", "passwd", "dbname");
$mysqli-&gt;close();
 
// 设置参数
$mysqli = mysqli_init();
$mysqli-&gt;options(MYSQLI_INIT_CMD, "SET_AUTOCOMMIT=0"); // 置初始参数
$mysqli-&gt;options(MYSQLI_READ_DEFAULT_FILE, "SSL_CLIENT");
$mysqli-&gt;options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); // 超时的秒数
$mysqli-&gt;real_connect("localhost", "username", "username", "dbname");
// 执行查询
$result = $conn-&gt;query("SELECT * FROM T_USER", MYSQLI_USE_RESULT); // 二个参数表示使用无缓冲
while ($row = $result-&gt;fetch_row()) {
    print $row[0];
}
$result-&gt;free(); // 关闭结果集
                 
// 预编译语句，
$stmt = $conn-&gt;prepare("INSERT INTO T_USER VALUES(?, ?)");
#绑定输入参数
$stmt-&gt;bind_param($name, $dob, $age);
$name = "Alex";$dob = "1986";$age = "29";
$stmt-&gt;execute();
$name = "Meng";$dob = "1989";$age = "26";
$stmt-&gt;execute();
 
#绑定输出变量
$stmt-&gt;bind_result($name,$dob,$age);
while ($stmt-&gt;fetch()) {
    print "$name: $dob";
}
#处理BLOG数据的方式和普通数据一样
?&gt;</pre>
<div class="blog_h2"><span class="graybg">通用数据库访问抽象层：PEAR DB</span></div>
<p>支持大多数的数据库，提供统一风格的API</p>
<div class="blog_h1"><span class="graybg">第五部分：错误处理</span></div>
<div class="blog_h2"><span class="graybg">错误类型</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 25%; text-align: center;">类型</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>编程错误</td>
<td>语法错误：在PHP执行前被检测到，例如：<pre class="crayon-plain-tag">Parse error: parse error in test.php on line 4</pre> <br />Include/Require：错误之后的代码被废弃，得到不完整编译的文件（后续代码未定义）</td>
</tr>
<tr>
<td>未定义符号</td>
<td>未定义变量、常量：错误通常以警告形式出现<br />未定义函数、类：中止执行，例如：<pre class="crayon-plain-tag">Fatal error: Call to undefined function： undefined_this_function_is()</pre> </td>
</tr>
<tr>
<td>通用类错误</td>
<td>php.ini的配置差异：使用ini_get()检查<br />SAPI差异：例如Apache专有函数</td>
</tr>
<tr>
<td>运行时错误</td>
<td>通常不是编程错误，例如硬盘故障、网络故障。由错误报告机制或者异常处理机制负责处理</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">PHP错误</span></div>
<div class="blog_h3"><span class="graybg">错误报告级别</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">错误级别</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>E_ERROR</td>
<td>严重的不可恢复的错误，例如内存不足、类重复声明</td>
</tr>
<tr>
<td>E_WARNING</td>
<td>例如数据库连接失败、除0错误</td>
</tr>
<tr>
<td>E_PARSE</td>
<td>该错误在编译时发生，会强制PHP在执行前退出</td>
</tr>
<tr>
<td>E_NOTICE</td>
<td>一般性通知，建议开发期开启</td>
</tr>
<tr>
<td>E_CORE_ERROR</td>
<td>该内部PHP错误是由于扩展启动失败导致的，而且会导致PHP运行退出</td>
</tr>
<tr>
<td>E_USER_ERROR</td>
<td>用户生成的致命错误，可以通过<pre class="crayon-plain-tag">trigger_error()</pre>  生成</td>
</tr>
<tr>
<td>E_USER_WARNING</td>
<td>用户生成的警告，可以通过trigger_error() 生成</td>
</tr>
<tr>
<td>E_USER_NOTICE</td>
<td>用户生成的一般性通知，可以通过trigger_error() 生成</td>
</tr>
<tr>
<td>E_ALL</td>
<td>所有错误和警告，除级别 E_STRICT 以外</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">错误报告配置</span></div>
<p>php.ini的一些配置项控制哪些错误显示，以及如何显示：</p>
<table class=" full-width fixed-word-wrap" style="width: 100%;">
<thead>
<tr>
<td style="width: 150px; text-align: center;">配置项</td>
<td style="width: 100px; text-align: center;">数据类型</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>error_reporting</td>
<td>整型</td>
<td>设置默认错误报告方式，例如：E_ALL，E_ALL &amp; ~E_NOTICE(除了NOTICE级别的所有错误被报告)。0表示任何错误都不报告</td>
</tr>
<tr>
<td>display_errors</td>
<td>布尔型</td>
<td>控制错误是否作为PHP输出的一部分显示出来。它默认设置为On</td>
</tr>
<tr>
<td>display_startup_errors</td>
<td>布尔型</td>
<td>这个设置控制在PHP启动时是否显示错误。它的默认设置是Off</td>
</tr>
<tr>
<td>error_prepend_string</td>
<td>字符串</td>
<td>这个字符串将在浏览器中显示错误信息之前直接显示出来</td>
</tr>
<tr>
<td>error_append_string</td>
<td>字符串</td>
<td>这个字符串将在浏览器中显示错误信息之后直接显示出来</td>
</tr>
<tr>
<td>track_errors</td>
<td>布尔型</td>
<td>开启时，$php_errormsg在脚本中可见，包含错误信息</td>
</tr>
<tr>
<td>html_errors</td>
<td>布尔型</td>
<td>是否在错误信息中采用HTML格式，默认On，CLI版本PHP除外</td>
</tr>
<tr>
<td>xmlrpc_errors</td>
<td>布尔型</td>
<td>错误信息是否作为XML-RPC故障显示</td>
</tr>
<tr>
<td>xmlrpc_error_number</td>
<td>整型</td>
<td>配合xmlrpc_errors</td>
</tr>
<tr>
<td> log_errors</td>
<td>布尔型</td>
<td>是否记录错误日志到文件系统，默认记录到Web服务器的错误日志中</td>
</tr>
<tr>
<td> error_log</td>
<td>字符串</td>
<td>日志文件的位置，指定syslog则记录到系统日志（Unix）</td>
</tr>
<tr>
<td> log_errors_max_len</td>
<td>整型</td>
<td>日志信息最大长度，超过的被截断</td>
</tr>
<tr>
<td>ignore_repeated_errors</td>
<td>布尔型</td>
<td>重复的错误是否被显示</td>
</tr>
<tr>
<td>ignore_repeated_source</td>
<td>布尔型</td>
<td>来自同一文件同一行的错误是否被显示</td>
</tr>
</tbody>
</table>
<p>配置文件样例如下：</p>
<pre class="crayon-plain-tag">; 开发环境的典型配置
error_reporting = E_ALL 
display_errors = on 
html_errors = on 
log_errors = off
; 生产环境的典型配置
error_reporting = E_ALL &amp; ~E_NOTICE 
display_errors = off 
log_errors = on 
html_errors = off
error_log = "/var/log/php-error.log"
ignore_repeated_errors = on 
ignore_repeated_source = on</pre>
<div class="blog_h3"><span class="graybg">自定义错误处理器</span></div>
<p>可以定义一个函数，在每一个错误出现时调用：</p>
<pre class="crayon-plain-tag">function customErrorHandler ($errno, $errstr) {
    echo "&lt;b&gt;Error:&lt;/b&gt; [$errno] $errstr&lt;br /&gt;";
    echo "Ending Script";
    die();
}

set_error_handler("customErrorHandler");</pre>
<div class="blog_h3"><span class="graybg">错误抑制</span></div>
<p>在语句前加上符号@，则该语句的错误级别为0。只有内置的错误报告和日志记录受@影响，自定义错误处理器继续工作：</p>
<pre class="crayon-plain-tag">&lt;?php
if (@$_GET["id"]) {
    $obj = new MyDataObject();
}
?&gt;</pre>
<div class="blog_h2"><span class="graybg">PEAR错误</span></div>
<p>PEAR组件使用单独的错误机制，通过检查返回值来判断异常。</p>
<div class="blog_h2"><span class="graybg">异常处理</span></div>
<p>PHP5提供了新的，面向对象的try-catch机制来捕获和处理异常，异常必须是Exception类的子类型。下面的代码示例了异常的常规用法：</p>
<pre class="crayon-plain-tag">function checkAge ($age) {
    if ($age &lt; 0) {
        // 抛出异常
        throw new Exception('Invalid age.');
    }
}
// 捕获异常
try {
    checkAge(- 2);
} catch (Exception $e) {
    echo 'Error: ' . $e-&gt;getMessage();
}

// 自定义异常类
class InvalidAgeException extends Exception {

    public function setMessage ($message) {
        $this . $message = $message;
    }
}</pre>
<div class="blog_h3"><span class="graybg">设置顶层异常处理器</span></div>
<p>任何未捕获的异常，可以由顶层异常处理器负责处理：</p>
<pre class="crayon-plain-tag">function customExceptionHandler ($exception) {
    echo "Exception: " . $exception-&gt;getMessage();
}
// 设置处理器
set_exception_handler('customExceptionHandler');

// 下面的异常没有被捕获，讲传递给顶层异常处理器
throw new Exception('Uncaught Exception occurred');</pre>
<div class="blog_h1"><span class="graybg">第六部分：XML处理</span></div>
<div class="blog_h2"><span class="graybg">解析XML</span></div>
<div class="blog_h3"><span class="graybg">SAX(Simple API for XML)：事件驱动</span></div>
<pre class="crayon-plain-tag"><!--?php 
$xml = xml_parser_create('UTF-8'); // XML编码方式
xml_set_element_handler($xml, 'start_handler', 'end_handler'); // 开始、结束标签处理器
xml_set_character_data_handler($xml, 'character_handler'); // 文本内容处理器
xml_parser_set_option($xml, XML_0PTION_CASE_FOLDING, false); // 禁用标签名全大写转换
function start_handler ($xml, $tag, $attributes)
{
    global $level; // 标签嵌套层次
    echo " \n" . str_repeat(' ', $level) . " $tag";
    foreach ($attributes as $key =--> $value) {
        echo "$key $value";
    }
    $level ++;
}
function end_handler ($xml, $tag)
{
    global $level;
    $level --;
    echo str_repeat(' ', $level, ' ') . " $tag";
}
function character_handler ($xml, $data)
{}
xml_parse($xmly, file_get_contents("test.xml")); // 执行解析
?&gt;</pre>
<div class="blog_h3"><span class="graybg">DOM：解析为文档树</span></div>
<p>该方式的缺点是内存消耗大</p>
<pre class="crayon-plain-tag">&lt;?php
$dom = new DomDocument();
$dom-&gt;load('test.xml');
$root = $dom-&gt;documentElement;
process_children($root);
 
function process_children ($node)
{
    $children = $node-&gt;childNodes;
    foreach ($children as $elem) {
        if ($elem-&gt;nodeType == XML_TEXT_NODE) {
            if (strlen(trim($elem-&gt;nodeValue))) {
                echo trim($elem-&gt;nodeValue), "\n";
            }
        } else 
            if ($elem-&gt;nodeType == XML_ELEMENT_NODE) {
                process_children($elem);
            }
    }
}
?&gt;</pre>
<div class="blog_h3"><span class="graybg">SimpleXML</span></div>
<p>SimpleXML扩展在PHP5默认开启，该方式处理XML最简单，直接通过数据结构的形式访问XML节点：<br /> 1、属性导航表示子元素的迭代器，例如：mother-&gt;children得到孩子的迭代器<br /> 2、数字索引表示第N个子元素，例如：mother-&gt;children[1]访问第二个孩子<br /> 3、非数字索引表示XML属性，例如：mother['name']得到母亲的名字<br /> 4、元素可以直接作为字符串使用(_toString)，以访问其文本内容（不包括子元素）</p>
<pre class="crayon-plain-tag">&lt;?php
$sx0 = simplexml_load_file('test.xml'); // 通过文件读取
$sx1 = simplexml_load_dom(new DomDocument()); // 通过DOM对象读取
 
$str = &lt;&lt;&lt;XML
&lt;?xml version='1.0'?&gt;
&lt;html xmlns="http：//www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
    &lt;head&gt;
        &lt;title&gt;XML&lt;/title&gt;
    &lt;/head&gt;
    &lt;body bgcolor="#FFF"&gt;
        &lt;div&gt;Hello &lt;span&gt;XML&lt;/span&gt;&lt;/div&gt;
        &lt;div&gt;&lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;
XML;
 
$html = simplexml_load_string($str); // 从字符串读取
foreach ($html-&gt;body-&gt;div as $div) {
    $div-&gt;span[0];
    $div['bgcolor'];
    echo $div; // 输出文本内容
    echo strip_tags($div-&gt;asXML()); // 输出完整文本
}
file_put_contents('test.xml', $html-&gt;asXML());
?&gt;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/php5-study-note">PHP5学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/php5-study-note/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
