在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