分享

PHP5.3、5.4、5.5、5.6各版本重要更新简述

 昵称21532077 2019-10-10

今天无事,偶尔看到phpstorm中的版本选择处有关于各版本的区别的简短描述,于是总结一下。

clipboard.png
PHP5.3相对于之前版本,最大区别也就是命名空间和匿名函数了,这在平时开发和各大框架中都用的比较多了,就不再详述了。
PHP5.4的主要更新是数组简写语法格式和traits了。
关于数组简写,说起来也挺简单,只是为数组添加了一个新的声明方法,如下:

  1. // PHP5.4之前
  2. $array = array(
  3. "foo" => "bar",
  4. "bar" => "foo",
  5. );
  6. // 自 PHP 5.4 起
  7. $array = [
  8. "foo" => "bar",
  9. "bar" => "foo",
  10. ];

而关于PHP5.4的traits就比较少见了,代码说明:

  1. class Base {
  2. public function sayHello() {
  3. echo 'Hello ';
  4. }
  5. }
  6. trait SayWorld {
  7. public function sayHello() {
  8. parent::sayHello();
  9. echo 'World!';
  10. }
  11. }
  12. class MyHelloWorld extends Base {
  13. use SayWorld;
  14. }
  15. $o = new MyHelloWorld();
  16. $o->sayHello();

说明一下:结果是'Hello World!',从基类继承的方法会被trait中的同名方法覆盖,当前类中的方法覆盖trait中的同名成员;如果trait中定义了属性,则当前类中不能定义同名属性;trait中也可以定义抽象方法和静态成员。可以使用多个trait,它们之间用逗号分隔,如下:

use SayHello1,SayHello2;

如果SayHello1和SayHello2中有同名成员,会产生致命错误,解决方法如下:

  1. use SayHello1,SayHello2 {
  2. SayHello1::sayHello insteadof SayHello2; // 意思是用SayHello1中的sayHello方法代替SayHello2中的同名方法,注:此处的sayHello不一定是静态方法
  3. // ...
  4. // 或
  5. SayHello1::sayHello as sayHello1; // 为其另取一个名字,也可解决
  6. }

PHP5.5中的变化主要是异常处理中添加finally关键字和生成器generator。
关于finally,代码说明:

  1. try {
  2. throw new ErrorException('Some Error Message');
  3. } catch (ErrorException $e) {
  4. echo $e->getMessage()."111 \n";
  5. } catch(Exception $e) {
  6. echo $e->getMessage()."222 \n";
  7. } finally {
  8. echo 'finally';
  9. }

不管产没产生异常,都会输出finally。

关于生成器generator,我看了看手册,不明觉厉。明白了再加上...
今天先到这儿......


关于generator,今天看到一篇文章(http:///post/4317.html),有些小体会,写下来做个记录,定义啥的就不说了,简单说就是为了节约内存
首先,创建生成器,类似函数,但不返回值,只生成值,有点儿别扭

  1. function getGenerator() {
  2. yield 'I';
  3. yield 'am';
  4. yield 'Polly';
  5. }

使用生成器,生成器的返回值是一个Generator对象

  1. foreach (getGenerator() as $val) {
  2. echo $val . PHP_EOL;
  3. }

看到这里,有人会认为,这和tm函数有毛区别,函数返回一个数组不照样循环出来么,看下面的例子:

  1. function makeRange1($length) {
  2. $dataSet = [];
  3. for ($i=0; $i<$length; $i++) {
  4. $dataSet[] = $i;
  5. }
  6. return $dataSet;
  7. }
  8. function makeRange2($length) {
  9. for ($i=0; $i<$length; $i++) {
  10. yield $i;
  11. }
  12. }
  13. // 分别执行makeRange1(1000000)和makeRange2(1000000),便会看出来,第一个直接报错,因为内存占用过多,第二个则不会

用处,如果要读取一个超大的文本文件,肯定是用生成器来的更快更节约内存一些

  1. function getRows($file) {
  2. $handle = fopen($file, 'rb');
  3. if ($handle == FALSE) {
  4. throw new Exception();
  5. }
  6. while (feof($handle) === FALSE) {
  7. yield fgetcsv($handle);
  8. }
  9. fclose($handle);
  10. }
  11. foreach ($getRows($file) as $row) {
  12. print_r($row);
  13. }

ok

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多