在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