资讯专栏INFORMATION COLUMN

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

_ipo / 1920人阅读

摘要:今天无事,偶尔看到中的版本选择处有关于各版本的区别的简短描述,于是总结一下。相对于之前版本,最大区别也就是命名空间和匿名函数了,这在平时开发和各大框架中都用的比较多了,就不再详述了。的主要更新是数组简写语法格式和了。

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


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

// PHP5.4之前
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

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

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,代码说明:

try {
    throw new ErrorException("Some Error Message");
} catch (ErrorException $e) {
    echo $e->getMessage()."111 
";
} catch(Exception $e) {
    echo $e->getMessage()."222 
";
} finally {
    echo "finally";
}

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

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


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

function getGenerator() {
    yield "I";
    yield "am";
    yield "Polly";
}

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21324.html

相关文章

  • 考虑 PHP 5.0~5.6 版本兼容性的 cURL 文件上传

    摘要:最近做的一个需求,要通过调用,以格式上传文件。传统上,的支持通过在数组数据中,使用文件全路径的语法附加文件,供读取上传。的默认值为,的默认值为。对于而言,手动设置为是毫无意义的。命名空间或以下的版本没有命名空间。 最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件。踩坑若干,够一篇文章了。 重要警告 没事不要读PHP的官方中文文档!版本...

    NikoManiac 评论0 收藏0
  • PHP 5.35.45.55.6 中的新特性

    摘要:同时还支持简写的运算符,表示进行幂运算并赋值。对应的结构为和。为了达到一致性将添加函数。新增函数可用来返回数组中指定的一列。这种简写形式被称为在起被默认开启,在起总是可用。三元运算符可以简写省略中间的部分表达式,当为时返回,否则返回。 PHP 5.6 1、可以使用表达式定义常量 https://php.net/manual/zh/migration56.new-features.p...

    ysl_unh 评论0 收藏0
  • PHP 5.35.45.55.6 中的新特性(7出来但是一样有用)

    摘要:同时还支持简写的运算符,表示进行幂运算并赋值。为了达到一致性将添加函数。新增函数可用来返回数组中指定的一列。这种简写形式被称为在起被默认开启,在起总是可用。结构中可以用双引号来声明标识符了。 PHP 5.61、可以使用表达式定义常量 https://php.net/manual/zh/mig... 在之前的 PHP 版本中,必须使用静态值来定义常量,声明属性以及指定函数参数默认值。 现...

    Shihira 评论0 收藏0
  • PHP5.3升级5.5安装过程

    摘要:参考资料检查当前安装的包如果有安装的包,先删除他们更新我们系统用这个如果想删除上面安装的包,重新安装上面搜索到的包即可运行注如果想升级到把上面的换成就可以了。安装注如果想升级到把上面的换成就可以了。 参考资料: http://www.blogjava.net/nkjav...http://www.111cn.net/sys/Cent... 1.检查当前安装的PHP包 yum lis...

    roadtogeek 评论0 收藏0
  • 使用 Windows Linux Subsystem 配置开发环境

    摘要:微软前些日子公布了下简称,当时还只有支持安装,作为普通用户的我就没有尝试。解决方案有待进一步发掘。按照刚刚发布的报告,微软已经是开源贡献第一大公司,拥抱之后我们也可以在下进行开发了。 微软前些日子公布了 Windows Subsystem Linux(下简称WSL),当时还只有 Insider Preview 支持安装,作为普通用户的我就没有尝试。这两天不知道伴随哪次更新,标准的专业版...

    kk_miles 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<