php 5.4 新增功能

在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

你可能感兴趣的:(php 5.4 新增功能)