今天无事,偶尔看到phpstorm中的版本选择处有关于各版本的区别的简短描述,因而总结一下。php
PHP5.3相对于以前版本,最大区别也就是命名空间和匿名函数了,这在平时开发和各大框架中都用的比较多了,就再也不详述了。
PHP5.4的主要更新是数组简写语法格式和traits了。
关于数组简写,提及来也挺简单,只是为数组添加了一个新的声明方法,以下:html
// PHP5.4以前 $array = array( "foo" => "bar", "bar" => "foo", ); // 自 PHP 5.4 起 $array = [ "foo" => "bar", "bar" => "foo", ];
而关于PHP5.4的traits就比较少见了,代码说明:laravel
class Base { public function sayHello() { echo 'Hello '; } } trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } } class MyHelloWorld extends Base { use SayWorld; } $o = new MyHelloWorld(); $o->sayHello();
说明一下:结果是'Hello World!',从基类继承的方法会被trait中的同名方法覆盖,当前类中的方法覆盖trait中的同名成员;若是trait中定义了属性,则当前类中不能定义同名属性;trait中也能够定义抽象方法和静态成员。能够使用多个trait,它们之间用逗号分隔,以下:数组
use SayHello1,SayHello2;
若是SayHello1和SayHello2中有同名成员,会产生致命错误,解决方法以下:框架
use SayHello1,SayHello2 { SayHello1::sayHello insteadof SayHello2; // 意思是用SayHello1中的sayHello方法代替SayHello2中的同名方法,注:此处的sayHello不必定是静态方法 // ... // 或 SayHello1::sayHello as sayHello1; // 为其另取一个名字,也可解决 }
PHP5.5中的变化主要是异常处理中添加finally关键字和生成器generator。
关于finally,代码说明:phpstorm
try { throw new ErrorException('Some Error Message'); } catch (ErrorException $e) { echo $e->getMessage()."111 \n"; } catch(Exception $e) { echo $e->getMessage()."222 \n"; } finally { echo 'finally'; }
无论产没产生异常,都会输出finally。函数
关于生成器generator,我看了看手册,不明觉厉。明白了再加上...
今天先到这儿......post
关于generator,今天看到一篇文章(http://laravelacademy.org/post/4317.html),有些小体会,写下来作个记录,定义啥的就不说了,简单说就是为了节约内存
首先,建立生成器,相似函数,但不返回值,只生成值,有点儿别扭spa
function getGenerator() { yield 'I'; yield 'am'; yield 'Polly'; }
使用生成器,生成器的返回值是一个Generator对象code
foreach (getGenerator() as $val) { echo $val . PHP_EOL; }
看到这里,有人会认为,这和tm函数有毛区别,函数返回一个数组不照样循环出来么,看下面的例子:
function makeRange1($length) { $dataSet = []; for ($i=0; $i<$length; $i++) { $dataSet[] = $i; } return $dataSet; } function makeRange2($length) { for ($i=0; $i<$length; $i++) { yield $i; } } // 分别执行makeRange1(1000000)和makeRange2(1000000),便会看出来,第一个直接报错,由于内存占用过多,第二个则不会
用处,若是要读取一个超大的文本文件,确定是用生成器来的更快更节约内存一些
function getRows($file) { $handle = fopen($file, 'rb'); if ($handle == FALSE) { throw new Exception(); } while (feof($handle) === FALSE) { yield fgetcsv($handle); } fclose($handle); } foreach ($getRows($file) as $row) { print_r($row); }
ok