php 5.4 新增功能

来源:互联网 发布:linux samba 配置 编辑:程序博客网 时间:2024/06/07 02:09

在PHP 5.4中,首先是修复了多达100多处的bug,并且在内存及性能优化上做的更好了,而且去掉了一些之前版本的方法,比如register_globals,magic_quotes,safe_mode等,而且要注意的是,PHP 5.4中,默认的编码方式已经改变为UTF-8了,这很有利于开发者开发多语言的版本应用。

trait

首先来介绍下PHP 5.4中新加入的功能Trait,这里可以简单理解为一系列的方法的集合,在组织结构上跟类有点象(但不能象类那样实例化),能让开发者可以在不同的类中重用这组方法。由于php是单继承的语言,所以一个类中是不能同时继承多个类的。这个时候,Trait就派上用场了,更准确的理解是对类进行扩展。

Trait是一个方案集合,它不属于任何实际类。用户没法创建Trait实例或直接调用Trait中的方法,相反,用户必须将Trait合并到实际的类当中方能使用它们。在优先级方面,Trait方法会覆盖继承而来的同名方法,而当前合并类中的同名方法则会覆盖Trait方法。

示例代码如下:

trait SayName                                    {                                                    public function sayName($name)                   {                                                    echo "my name is $name\n";                   }                                            }                                                class Person                                     {                                                    public function sayName($name)                   {                                                    echo "person call: name is $name\n";         }                                            }                                                class Teacher extends Person                     {                                                    use SayName; //调用Trait                       function __CONSTRUCT($name)                      {                                                    $this->sayName($name);                       }                                            }                                                class Doctor extends Person                      {                                                    use SayName; //调用Trait                       function __CONSTRUCT($name)                      {                                                    $this->sayName($name);                       }                                                function sayName($name)                          {                                                    echo "doctor call: name is $name\n";         }                                            }                                                $teacher = new Teacher('jack');                  $doctor = new  Doctor('tony');                   

输出结果:

my name is jack
doctor call: name is tony

从结果中可以看出在Teacher实例中,Trait中的方法覆盖了从Person继承来的方法,而在Doctor的实例中,类本身的方法覆盖了Trait的方法。

允许在一个类中使用多个trait,但如果这些Trait中有同名方法则会报错,解决方案有两种,一种是使用insteadof,它将会从trait中只选取一个方法,如果有多个方法的话,其它方法将不能使用,这种解决方法限制太大;另一种解决方法是使用as,它可以对从trait继承来的方法重命名,而且还可以修改这些方法的可见性,代码如下:

trait A {                                public function smallTalk() {            echo 'a';                        }                                    private function bigTalk() {             echo 'A';                        }                                }                                                                       trait B {                                public function smallTalk() {            echo 'b';                        }                                    private function bigTalk() {             echo 'B';                        }                                }                                                                       class Talker {                           use A, B {                               B::smallTalk insteadof A;            A::bigTalk insteadof B;          }                                }                                                                     class Aliased_Talker {                   use A, B {                               B::smallTalk insteadof A;            A::bigTalk insteadof B;              B::bigTalk as public talk;       }                                }                                    
数组的声明更简洁

数组声明更简洁:$a = [1, 2, 3, 4]; 或者 $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];。

直接对函数返回值进行数组取值

比如:echo explode(' ', 'Alan Mathison Turing')[1]。

可以在类实例化时直接访问成员

比如:(new Foo)->bar()

闭包中支持使用$this指针

直接上代码:

class Foo                                                {                                                            function hello()                                         {                                                            echo 'Hello Nettuts!';                               }                                                        function anonymous()                                     {                                                            return function() {                                          $this->hello(); //这在以前的版本中是不能实现         };                                                   }                                                    }                                                        class Bar                                                {                                                            function __construct(Foo $o)                             {                                                            $x = $o->anonymous(); // 实际上调用Foo::hello()          $x(); // 执行的是 Foo::hello()                       }                                                    }                                                        new Bar(new Foo); //输出 Hello Nettuts!                  
不管php.ini中的short_tag标记如何设置,短标记(<?=)可以随时被使用

支持Class::{expr}()语法

直接上代码

class SayHello             {                              static function hello()    {                              echo 'hello';          }                      }                          SayHello::{'hello'}();     
采用“0b”前缀标识二进制数

比如:echo 0b1+0b11; 会输出4。

支持callable类型

对于一个参数是否是回调函数,不需要再像以前一样做很多检查,代码如下:

function callBack(callable $callback){                                    }                                    callBack(123);         //错误                   callBack('printf');    //正确              
除此以外php 5.4还支持内建服务器,改善了参数类型错误提示消息等等,更多的可以查看php手册:http://www.php.net/manual/zh/migration54.new-features.php

原创粉丝点击