蓝冰大侠 发表于 2011-12-21 08:44

[转]PHP5.3新功能与不兼容特性整理


                <div id="cnblogs_post_body"><strong>1.支持命名空间</strong>
<div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;&nbsp;
&nbsp;
&nbsp;PHP5.3之后的版本引入了名称空间的支持,此举的好处是不同模块之间分隔方式变得天然纯正,以往PHP要实现不同模块之间的划分通常会各为其政,有
类PEAR或ZendFramework的,
有像Drupal以模块区分等等,在已有项目内引入了第三方库经常会担心是否有全局名称的冲突,PHP5.3后这种担心可大大减低,
其为我们提供了一种主流解决方案。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;&nbsp; &nbsp; &nbsp;关于此特性也颇具争议有人认为PHP的特点就是简单,在PHP5之后越加复杂违背了最初的理念,不过鄙人拙见认为语言就是应对解决问题而生有更好的解决方式就应该提倡。</p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br>namespace namespaceDemo;<br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> demoClass<br>{<br>    </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> echoValue()<br>    {<br>      </span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">i am "\namespaceDemo\demoClass-&gt;echoValue"</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>    }<br>}<br><br></span><span style="color: #800080;">$test</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> \namespaceDemo\demoClass();<br></span><span style="color: #800080;">$test</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">echoValue();<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * i am "\namespaceDemo\demoClass-&gt;echoValue"<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<br>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>2.支持GOTO语句</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><span style="font-size: 14px;">&nbsp;&nbsp; &nbsp; &nbsp;GOTO语句曾经颇受争议, 后来经过大师们很多次较量后才最终确认合理使用有益无害,PHP5.3之后也引入了此语句。</span></p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">( </span><span style="color: #800080;">$i</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">; </span><span style="color: #800080;">$i</span><span style="color: #000000;"> </span><span style="color: #000000;">&lt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">100</span><span style="color: #000000;">; </span><span style="color: #800080;">$i</span><span style="color: #000000;">++</span><span style="color: #000000;"> )<br>{<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;">( </span><span style="color: #800080;">$i</span><span style="color: #000000;"> </span><span style="color: #000000;">%</span><span style="color: #000000;"> </span><span style="color: #000000;">20</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;"> )<br>      goto </span><span style="color: #008080;">end</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #008080;">end</span><span style="color: #000000;">:</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">我是{</span><span style="color: #800080;">$i</span><span style="color: #000000;">}我是第一个被20整除的数!</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * 我是20我是第一个被20整除的数!<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<br>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>3.新的静态魔术方法__callStatic.</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;&nbsp; &nbsp; &nbsp;5.2支持通过魔术方法处理不存在方法的调用, 但其只支持非静态方法, 5.3版本引入了静态魔术方法。</p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * __callStatic魔术方法使用方式<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> callStatic<br>{<br>    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;">__callStatic( </span><span style="color: #800080;">$name</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$arguments</span><span style="color: #000000;"> )<br>    {<br>      </span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;b&gt;function name:&lt;/b&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>      </span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$name</span><span style="color: #000000;"> </span><span style="color: #000000;">.</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;br&gt;</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br><br>      </span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;b&gt;function arguments:&lt;/b&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>      </span><span style="color: #008080;">print_r</span><span style="color: #000000;">( </span><span style="color: #800080;">$arguments</span><span style="color: #000000;"> );<br>    }<br>}<br><br></span><span style="color: #800080;">$callStatic</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> callStatic();<br></span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$callStatic</span><span style="color: #000000;">::</span><span style="color: #000000;">notExistsFun( </span><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span><span style="color: #000000;">'</span><span style="color: #000000;">param1</span><span style="color: #000000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">param2</span><span style="color: #000000;">'</span><span style="color: #000000;"> ) );<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * function name:notExistsFun<br> * function arguments:Array ( =&gt; Array ( =&gt; param1 =&gt; param2 ) )<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<br>
<div><strong>4.新的匿名魔术方法 __invoke.</strong></div>
<div><span style="font-size: 14px;">&nbsp;&nbsp; &nbsp; &nbsp;如果对象实现了__invoke魔术方法就可将其作为函数直接调用,实例化对象之后可用匿名函数的形式直接调用。</span></div>
<div>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> invokeDemo<br>{<br>    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> __invoke( </span><span style="color: #800080;">$param1</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$param2</span><span style="color: #000000;"> )<br>    {<br>      </span><span style="color: #008080;">print_r</span><span style="color: #000000;">( </span><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span><span style="color: #800080;">$param1</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$param2</span><span style="color: #000000;"> ) );<br><br>      </span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;br&gt;this is invoke magic function</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>    }<br>}<br><br></span><span style="color: #800080;">$invokeDemo</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> invokeDemo();<br></span><span style="color: #800080;">$invokeDemo</span><span style="color: #000000;">( </span><span style="color: #000000;">'</span><span style="color: #000000;">param1String</span><span style="color: #000000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">) );<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * Array ( =&gt; param1String =&gt; Array ( =&gt; 1 =&gt; 2 =&gt; 3 ) )<br> * this is invoke magic function<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
</div>

<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>5.动态调用静态属性。</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">  PHP5.2之前静态方法是不支持用变量指定方法名称并动态调用的, 5.3之后引入了此功能。</p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #008000;">/*</span><span style="color: #008000;"> <br> * To change this template, choose Tools | Templates<br> * and open the template in the editor.<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> dynamicCallStatic<br>{<br>    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> callStaticFunc()<br>    {<br>      </span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">i am callStaticFunc function</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>    }<br>}<br><br></span><span style="color: #800080;">$funcName</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">callStaticFunc</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br><br>dynamicCallStatic</span><span style="color: #000000;">::</span><span style="color: #800080;">$funcName</span><span style="color: #000000;">();<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * i am callStaticFunc function<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<p><strong>6.支持匿名函数(lumbda).</strong></p>
<p>&nbsp;&nbsp; &nbsp;
&nbsp;5.3之后引入了匿名函数,对Javascript了解的人对其并不陌生它占了JS的重头戏,灵活运用匿名函数会带来很多便利,PHP的匿名函数作用域
和函数的作用域相同,不过可以通过内置语法USE传入全局变量,当然也可以在函数内部使用global或$GLOBALS调用全局变量。</p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #800080;">$city</span><span style="color: #000000;"></span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">dalian</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #800080;">$closure</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;">( </span><span style="color: #800080;">$name</span><span style="color: #000000;"> ) </span><span style="color: #0000ff;">use</span><span style="color: #000000;">( </span><span style="color: #800080;">$city</span><span style="color: #000000;"> ){ </span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$name</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$city</span><span style="color: #000000;">; };<br><br></span><span style="color: #800080;">$closure</span><span style="color: #000000;">( </span><span style="color: #000000;">'</span><span style="color: #000000;">jucky</span><span style="color: #000000;">'</span><span style="color: #000000;"> );<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * jucky-dalian<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #800080;">$arr</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;"> );<br><br></span><span style="color: #008080;">usort</span><span style="color: #000000;">(<br>    </span><span style="color: #800080;">$arr</span><span style="color: #000000;">,</span><span style="color: #000000;"><br>    </span><span style="color: #0000ff;">function</span><span style="color: #000000;">( </span><span style="color: #800080;">$a</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;"> )<br>    {<br>      </span><span style="color: #0000ff;">if</span><span style="color: #000000;">( </span><span style="color: #800080;">$a</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;"> )<br>            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>      </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> (</span><span style="color: #800080;">$a</span><span style="color: #000000;"> </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">:</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>    }<br>);<br><br></span><span style="color: #008080;">print_r</span><span style="color: #000000;">( </span><span style="color: #800080;">$arr</span><span style="color: #000000;"> );<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * Array ( =&gt; 1 =&gt; 2 =&gt; 3 =&gt; 5 =&gt; 6 )<br> </span><span style="color: #008000;">*/</span></div></pre>
</div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>7.新的三元操作符</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;&nbsp; &nbsp; &nbsp;新三元操作符?:在判断表达式结果为TRUE时会返回此判断表达式的结果即?:之前的值, False时返回?:之后的值。</p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #800080;">$result</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$result</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;"> </span><span style="color: #000000;">?:</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">error code:20</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * 1<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br></span><span style="color: #800080;">$result</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$result</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;"> </span><span style="color: #000000;">?:</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">error code:20</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * error code:20<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>8.全局空间内const代替define()函数可直接使用</strong></p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #0000ff;">const</span><span style="color: #000000;"> PLATFORM_NAME </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">Linux</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> PLATFORM_NAME;<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * Linux<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>9.json_encode支持强制转换对象JSON</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;&nbsp; &nbsp; &nbsp;5.3后的json_enocde可通过参数强制转换数组为对象形式JSON。</p>
<div class="cnblogs_code">
<pre><div><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br></span><span style="color: #800080;">$arr</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;"> );<br></span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> json_encode( </span><span style="color: #800080;">$arr</span><span style="color: #000000;"> ) </span><span style="color: #000000;">.</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;br&gt;</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">echo</span><span style="color: #000000;"> json_encode( </span><span style="color: #800080;">$arr</span><span style="color: #000000;"> </span><span style="color: #000000;">,</span><span style="color: #000000;"> JSON_FORCE_OBJECT );<br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br> * output:<br> * <br> * {"0":1,"1":2,"2":3}<br> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #000000;">?&gt;</span></div></pre>
</div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>10.默认启用SPL支持。</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;&nbsp; &nbsp; SPL提供了很多激动人心的特性,具体包括数据结构类、迭代类、接口、异常、文件等通用功能类。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;&nbsp;
&nbsp; 数据结构提供了双向链表、栈、队列、堆、优先队列、固定大小数组、对象存储器,
但效率是否高于数组实现需要在应用内具体测试,方才测试队列类的效能发现低于原生实现,
不过固定数组的效率还是很可观的,下面代码是对固定大小数组的一个测试, 速度快了近1倍,详细代码如下:</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<div class="cnblogs_code">
<pre><div><span style="color: #800080;">$i</span><span style="color: #000000;">=</span><span style="color: #000000;">1000000</span><span style="color: #000000;">;<br></span><span style="color: #800080;">$spl</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SplFixedArray( </span><span style="color: #000000;">1000000</span><span> );</span><span><span color="#008000" style="color: #008000;"><br></span></span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #800080;">$i</span><span style="color: #000000;">--</span><span style="color: #000000;">) {<br>    </span><span style="color: #800080;">$spl</span><span style="color: #000000;">[</span><span style="color: #800080;">$i</span><span style="color: #000000;">] </span><span style="color: #000000;">= </span><span style="color: #000000;">'SM</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>}</span></div></pre>
</div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><span style="color: #800000;"><em>SplFixedArray数组运行时间与<em>内存使用大小</em>:</em></span></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">Running time:0.2420928478241<br>Memory usage:52324152</p>
<p><span style="color: #800000;"><em>Array数组运行时间与内存使用大小:</em></span></p>
<p>Running time:0.42152786254883<br>Memory usage:100517992</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>11.延迟静态绑定。</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>12.循环垃圾收集,&nbsp;能够发现对象的循环引用并自动回收内存</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><strong>13.支持phar归档</strong></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<div>
<div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"><span style="font-size: 16px;"><strong>不兼容的特性:</strong></span></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">1.atsort,natcasesort,usort,uasort,array_flip等数组函数不支持传入对象。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">2.魔术方法必须声明为公共属性</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">3.从PECL移除的库,ncurses, fpdf, dbase, fbsql, ming.</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">4.废弃的tick, ereg正则。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">5.namespace,Closure变成了保留值</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">6.http Stream流支持200-399全部状态</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">7.去除了<code>magic quotes<span style="font-family: verdana, Arial, Helvetica, sans-serif;" face="verdana, Arial, Helvetica, sans-serif">&nbsp;和&nbsp;</span></code><code>register globals特性</code></p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">8.出错提示信息与5.2版本相比有变化</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">9.以下配置项在PHP5.3将产生警告</p>
</div>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; color: #333333; margin-left: 40px; margin-top: 0px; margin-bottom: 0px; margin-right: 0px; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 2px none #efefef;">
<div>
<div><span style="font-family: verdana, sans-serif;">define_syslog_variables</span></div>
</div>
<div>
<div><span style="font-family: verdana, sans-serif;">register_globals</span></div>
</div>
<div>
<div><span style="font-family: verdana, sans-serif;">register_long_arrays</span></div>
</div>
<div>
<div><span style="font-family: verdana, sans-serif;">safe_mode</span></div>
</div>
<div>
<div><span style="font-family: verdana, sans-serif;">magic_quotes_gpc</span></div>
</div>
<div>
<div><span style="font-family: verdana, sans-serif;">magic_quotes_runtime</span></div>
</div>
</blockquote>
</div>
<p><span style="color: #333333; font-family: verdana, sans-serif;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;magic_quotes_sybase</span>&nbsp;</p>
<div>
<div>&nbsp;</div>
<div><span style="font-size: 16px;"><strong>新的函数:</strong></span></div>
<div>
<p class="simpara">PHP Core:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">array_replace()</a> - Replaces elements from
passed arrays into one array. </span>
</li><li class="listitem"><span class="simpara"><a class="function">array_replace_recursive()</a> -
Recursively replaces elements from passed arrays into one array. </span>
</li><li class="listitem"><span class="simpara"><a class="function">class_alias()</a> - Creates an alias for a user
defined class. </span>
</li><li class="listitem"><span class="simpara"><a class="function">forward_static_call()</a> - Call a user
function from a method context. </span>
</li><li class="listitem"><span class="simpara"><a class="function">forward_static_call_array()</a> -
Call a user function from a method context, with the arguments contained in an
array. </span>
</li><li class="listitem"><span class="simpara"><a class="function">gc_collect_cycles()</a> - Forces
collection of any existing garbage cycles. </span>
</li><li class="listitem"><span class="simpara"><a class="function">gc_disable()</a> - Deactivates the circular
reference collector. </span>
</li><li class="listitem"><span class="simpara"><a class="function">gc_enable()</a> - Activates the circular
reference collector. </span>
</li><li class="listitem"><span class="simpara"><a class="function">gc_enabled()</a> - Returns the status of the
circular reference collector. </span>
</li><li class="listitem"><span class="simpara"><a class="function">get_called_class()</a> - Return the name
of the class a static method is called in. </span>
</li><li class="listitem"><span class="simpara"><a class="function">gethostname()</a> - Return the current host
name for the local machine. </span>
</li><li class="listitem"><span class="simpara"><a class="function">header_remove()</a> - Removes an HTTP header
previously set using the <a class="function">header()</a> function. </span>
</li><li class="listitem"><span class="simpara"><a class="function">lcfirst()</a> - Make a string's first character
lowercase. </span>
</li><li class="listitem"><span class="simpara"><a class="function">parse_ini_string()</a> - Parse a
configuration string. </span>
</li><li class="listitem"><span class="simpara"><a class="function">quoted_printable_encode()</a> -
Convert an 8 bit string to a quoted-printable string. </span>
</li><li class="listitem"><span class="simpara"><a class="function">str_getcsv()</a> - Parse a CSV string into an
array. </span>
</li><li class="listitem"><span class="simpara"><a class="function">stream_context_set_default()</a>
- Set the default stream context. </span>
</li><li class="listitem"><span class="simpara"><a class="function">stream_supports_lock()</a> - Return
<b><tt class="constant">TRUE</tt></b> if the stream supports locking. </span>
</li><li class="listitem"><span class="simpara"><a class="function">stream_context_get_params()</a> -
Retrieve parameters from a stream context. </span>
</li><li class="listitem"><span class="simpara"><a class="function">streamWrapper::stream_cast()</a> -
Retrieve the underlying stream resource. </span>
</li><li class="listitem"><span class="simpara"><a class="function">streamWrapper::stream_set_option()</a>
- Change stream options </span></li></ul>
<p class="simpara"><a class="link">Date/Time</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">date_add()</a> - Adds an amount of days, months,
years, hours, minutes and seconds to a <a class="classname">DateTime</a> object. </span>
</li><li class="listitem"><span class="simpara"><a class="function">date_create_from_format()</a> -
Returns a new <a class="classname">DateTime</a> object
formatted according to the given format. </span>
</li><li class="listitem"><span class="simpara"><a class="function">date_diff()</a> - Returns the difference between
two <a class="classname">DateTime</a> objects. </span>
</li><li class="listitem"><span class="simpara"><a class="function">date_get_last_errors()</a> - Returns
the warnings and errors from the last date/time operation. </span>
</li><li class="listitem"><span class="simpara"><a class="function">date_parse_from_format()</a> - Get
infoformation about a given date. </span>
</li><li class="listitem"><span class="simpara"><a class="function">date_sub()</a> - Subtracts an amount of days,
months, years, hours, minutes and seconds from a <a class="classname">DateTime</a> object. </span>
</li><li class="listitem"><span class="simpara"><a class="function">timezone_version_get()</a> - Returns
the version of the timezonedb. </span></li></ul>
<p class="simpara"><a class="link">GMP</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">gmp_testbit()</a> - Tests whether a bit is set.
</span></li></ul>
<p class="simpara"><a class="link">Hash</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">hash_copy()</a> - Copy hashing context.
</span></li></ul>
<p class="simpara"><a class="link">IMAP</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">imap_gc()</a> - Clears IMAP cache. </span>
</li><li class="listitem"><span class="simpara">imap_utf8_to_mutf7() - Encode a
UTF-8 string to modified UTF-7. </span>
</li><li class="listitem"><span class="simpara">imap_mutf7_to_utf8() - Decode a
modified UTF-7 string to UTF-8. </span></li></ul>
<p class="simpara"><a class="link">JSON</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">json_last_error()</a> - Returns the last
JSON error that occurred. </span></li></ul>
<p class="simpara"><a class="link">MySQL Improved</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">mysqli_fetch_all()</a> - Fetches all result
rows as an associative array, a numeric array, or both. </span>
</li><li class="listitem"><span class="simpara"><a class="function">mysqli_get_connection_stats()</a> -
Returns statistics about the client connection. </span>
</li><li class="listitem"><span class="simpara"><a class="function">mysqli_poll()</a> - Poll connections. </span>
</li><li class="listitem"><span class="simpara"><a class="function">mysqli_reap_async_query()</a> - Get result
from async query. </span></li></ul>
<p class="simpara"><a class="link">OpenSSL</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">openssl_random_pseudo_bytes()</a>
- Returns a string of the given length specified, filled with pseudo-random
bytes. </span></li></ul>
<p class="simpara"><a class="link">PCNTL</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">pcntl_signal_dispatch()</a> - Calls
signal handlers for pending signals. </span>
</li><li class="listitem"><span class="simpara"><a class="function">pcntl_sigprocmask()</a> - Sets and
retrieves blocked signals. </span>
</li><li class="listitem"><span class="simpara"><a class="function">pcntl_sigtimedwait()</a> - Wait for
signals with a timeout. </span>
</li><li class="listitem"><span class="simpara"><a class="function">pcntl_sigwaitinfo()</a> - Wait for
signals. </span></li></ul>
<p class="simpara"><a class="link">PCRE</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">preg_filter()</a> - Perform a regular
expression search and replace, reutrning only results which matched the pattern.
</span></li></ul>
<p class="simpara"><a class="link">Semaphore</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">msg_queue_exists()</a> - Check whether a
message queue exists. </span>
</li><li class="listitem"><span class="simpara"><a class="function">shm_has_var()</a> - Checks whether a specific
key exists inside a shared memory segment. </span></li></ul>
<p class="simpara">The following functions are now natively implemented, making
them available on all operating systems which can run PHP: </p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">acosh()</a> </span></li><li class="listitem"><span class="simpara"><a class="function">asinh()</a> </span></li><li class="listitem"><span class="simpara"><a class="function">atanh()</a> </span></li><li class="listitem"><span class="simpara"><a class="function">expm1()</a> </span></li><li class="listitem"><span class="simpara"><a class="function">log1p()</a></span></li></ul>
<p><strong><span style="font-size: 16px;">原有函数的参数变更:</span></strong></p>
<p class="simpara">PHP Core:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">clearstatcache()</a> - Added <i><tt class="parameter">clear_realpath_cache</tt></i> and <i><tt class="parameter">filename</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">copy()</a> - Added a stream context parameter, <i><tt class="parameter">context</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">fgetcsv()</a> - Added <i><tt class="parameter">escape</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">ini_get_all()</a> - Added <i><tt class="parameter">details</tt></i> . </span>
</li><li class="listitem"><span class="simpara">The <a class="function">mail()</a> function now supports logging of sent
email. (Note: This only applies to email sent through this function.) </span>
</li><li class="listitem"><span class="simpara"><a class="function">nl2br()</a> - Added <i><tt class="parameter">is_xhtml</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">parse_ini_file()</a> - Added <i><tt class="parameter">scanner_mode</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">round()</a> - Added <i><tt class="parameter">mode</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">stream_context_create()</a> - Added
<i><tt class="parameter">params</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">strstr()</a> and <a class="function">stristr()</a> - Added <i><tt class="parameter">before_needle</tt></i> . </span></li></ul>
<p class="simpara"><a class="link">json</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">json_encode()</a> - Added <i><tt class="parameter">options</tt></i> . </span>
</li><li class="listitem"><span class="simpara"><a class="function">json_decode()</a> - Added <i><tt class="parameter">depth</tt></i> . </span></li></ul>
<p class="simpara"><a class="link">Streams</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">stream_select()</a>, <a class="function">stream_set_blocking()</a>, <a class="function">stream_set_timeout()</a>,
and <a class="function">stream_set_write_buffer()</a> now
work with user-space stream wrappers. </span></li></ul>
<p class="simpara"><a class="link">sybase_ct</a>:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><a class="function">sybase_connect()</a> - Added <i><tt class="parameter">new</tt></i> . </span></li></ul>
<p class="simpara">New method parameters in PHP <span style="color: #ffffff;" color="#ffffff">5.3</span>.0: </p>
<p class="simpara">PHP Core:</p>
<ul class="itemizedlist"><li class="listitem"><span class="simpara"><span class="methodname"><a class="function">Exception::__construct</a></span> - Added <i><tt class="parameter">previous</tt></i> .&nbsp;</span></li></ul>
</div>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;">&nbsp;</p>
<div><span style="font-size: 16px;"><strong>已使用5.3的应用:</strong></span></div>
<div>drupal7.0</div>
<div>zend Home</div>
<div>&nbsp;</div>
<div><span style="font-size: 16px;"><strong>参考文档:</strong></span></div>
<div>PHP V5.3 中的新特性 John Mertic &nbsp;http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new1/index.html</div>
<div>Manual - Backward Incompatible Changes PHP &nbsp;http://cn.php.net/manual/zh/migration53.incompatible.php</div>
<div>Manual - New features http://cn.php.net/manual/en/migration53.new-features.php</div>
<div>drupal - PHP 5.3 Compatibility &nbsp;http://drupal.org/node/360605</div>
</div>
</div></div>
               
               
               
               
               
               
               
               
               
               
页: [1]
查看完整版本: [转]PHP5.3新功能与不兼容特性整理