PHP5.3新特性

1、首先对之前滥用的语法进行了规范

众所周知PHP在语言开发过程中有一个很好的容错性,导致在数组或全局变量中包含字符串不使用引号是可以不报错的,很多业余的开发者因为懒惰而产生的安全问题十分严重,之所以PHP5.3对所有基本的语法进行了重新整理和提高写作规范,其实对PHP开发者来讲写作上并没有太大的影响,只是让他们变的更加专业。

2、MySQL驱动Mysqli 提高效率

一直以来,php都是通过mysql客户端连接mysql,而现在mysql官方已经推出php版的mysql客户端,而这个mysqlind有效降低内存的使用以及提高性能。mysqlnd进入核心扩展,理论上说该扩展访问mysql速度会较之前的MySQL  MySQLi 扩展快(参见http://dev.mysql.com/downloads/connector/php-mysqlnd/

(1)编译php更方便了,不需要libmysql,已经内置在源码中
(2)使用php许可,避免版权问题
(3)使用php的内存管理,支持php内存限制(memory_limit)
(4)所有数据在内存只有一份,之前的libmysql有两份
(5)提供性能统计功能,帮助分析瓶颈
(6)在驱动层增加缓存机制

3、PHP5.3安全和性能的提升

如md5()大概提高了10%-15%的性能,更好的内存处理机制,提高软件性能的访问。解决了include(require)_once重复打开的问题,之前once都是用静态变量实现的,用gcc4编译的二进制文件将更小,整体性能提高了5%-15%

4、延迟静态绑定

PHP的静态是在预编译时就固定好的,所以在继承的时候,父类里的self指的是父类,而不是子类。而php5.3加入了新的语法static,可以在运行时候捕捉当前类。

在PHP5中,我们可以在类中通过self关键字或者__CLASS__来判断或调用当前类。但有一个问题,如果我们是在子类中调用,得到的结果将是父类。因为在继承父类的时候,静态成员就已经被绑定了。 例如:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}

B::test();
//以上代码会输出A
?>

这和我们的预期不同,我们原来想得到子类的相应结果。PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 这里实现了延迟的静态绑定
    }
}

class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}

B::test();
//以上代码会输出B
?>

5、更多新特性

(1)名字空间,用来解决命名被污染

毫无疑问,命名空间是PHP5.3所带来的最重要的新特性。有了命名空间的概念,在开发大型站点时,就比较容易设计出灵活的结构,同时避免不同包中的类名或变量名产生冲突。

<?php
namespace Zend/Db/Table;
class Select {}
?>

这样即使其它命名空间下存在名为Select的类,程序在调用时也不会产生冲突。代码的可读性也有所增加。

(2)新的魔法函数 __callStatic 原来 __call的静态模式

PHP中原本有一个魔术方法__call(),当代码调用对象的某个不存在的方法时该魔术方法会被自动调用。新增的__callStatic()方法则只用于静态类方法。当尝试调用类中不存在的静态方法时,__callStatic()魔术方法将被自动调用。

<?php
class MethodTest {
    public function __call($name, $arguments) {
        // 参数 $name 大小写敏感
        echo "调用对象方法 ‘$name‘ "
             . implode(‘ -- ‘, $arguments). "/n";
    }

    /**  PHP 5.3.0 以上版本中本类方法有效  */
    public static function __callStatic($name, $arguments) {
        // 参数 $name 大小写敏感
        echo "调用静态方法 ‘$name‘ "
             . implode(‘ -- ‘, $arguments). "/n";
    }
}

$obj = new MethodTest;
$obj->runTest(‘通过对象调用‘);

MethodTest::runTest(‘静态调用‘);  // As of PHP 5.3.0

//以上代码执行后输出如下:
//调用对象方法‘runTest‘ –- 通过对象调用
//调用静态方法‘runTest‘ –- 静态调用
?>

(3)支持变量调用静态,可以通过$someClass::$method()调用

<?php 
class Test 
{ 
    public static function testgo() 
    { 
         echo "gogo!"; 
    } 
} 

$class = ‘Test‘; 
$action = ‘testgo‘; 
$class::$action();  //输出 "gogo!" 
?>


(4)新增日期函数date_create_from_format,别名 DateTime::createFromFormat()。

<?php
$date = date_create_from_format(‘j-M-Y‘, ‘28-Feb-2014‘);
echo $date->format(‘Y-m-d‘);
//输出 2014-02-28
?> 


(5)新魔法常量 __DIR__ 来解决路径问题

在5.3以前,为了获得当前脚本的目录,需要一次函数调用

echo dirname(__FILE__); // < PHP 5.3

在5.3,只需要一个魔术常量__DIR__就解决了

echo __DIR__; // >= PHP 5.3


(6)goto语句

多数计算机程序设计语言中都支持无条件转向语句goto,当程序执行到goto语句时,即转向由goto语句中的标号指出的程序位置继续执行。尽管goto语句有可能会导致程序流程不清晰,可读性减弱,但在某些情况下具有其独特的方便之处,例如中断深度嵌套的循环和 if 语句。

<?php
goto a;
echo ‘Foo‘;
 
a:
echo ‘Bar‘;

for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end; 
  }  
}
echo "i = $i";
end:
echo ‘j hit 17‘;
?>

(7)新增了类似JavaScript中的匿名函数和闭包。闭包(Closure)函数和Lambda函数的概念来自于函数编程领域。例如JavaScript 是支持闭包和lambda 函数的最常见语言之一。

在PHP中,我们也可以通过create_function()在代码运行时创建函数。但有一个问题:创建的函数仅在运行时才被编译,而不与其它代码同时被编译成执行码,因此我们无法使用类似APC这样的执行码缓存来提高代码执行效率。

在PHP5.3中,我们可以使用Lambda/匿名函数来定义一些临时使用(即用即弃型)的函数,以作为array_map()/array_walk()等函数的回调函数。

<?php
echo preg_replace_callback(‘~-([a-z])~‘, function ($match) {
    return strtoupper($match[1]);
}, ‘hello-world‘);
// 输出 helloWorld
 
$greet = function($name)
{
    printf("Hello %s/r/n", $name);
};

$greet(‘World‘);
$greet(‘PHP‘);
 
//...在某个类中
$callback = function ($quantity, $product) use ($tax, &$total) {
   $pricePerItem = constant(__CLASS__ . "::PRICE_" .  strtoupper($product));
   $total += ($pricePerItem * $quantity) * ($tax + 1.0);
 };
array_walk($products, $callback);
?>

(8)新的垃圾收集器(GC),并默认启用.

PHP开发者经常碰到的一个性能瓶颈是垃圾回收。PHP有一个非常简单的垃圾回收器,用于回收不在作用域内的对象。它的原理是通过引用计数,当计数到达0时(意味着不再有引用指向该对象),该对象被回收,释放占用的内存。

这种方式简单高效,但是在父子关系的对象引用中会产生问题。此时,这些对象的引用计数器不为0,所以不会被回收,一直存在到请求的结束。下面我们来看这个问题的一个例子。

<?php
class Parent 
{ 
     public function __construct()
    { 
        $this->child = new Child($this);
    }
}
class Child {
    public function __construct( Parent $parent ) 
    {
        $this->parent = $parent;
    }
}

for ($i = 0; $i < 1000; $i++) {
    new Parent();
}
?>

在这个例子中,你每次创建一个Parent对象,然后该对象不再被引用,但是内存不会被释放,所以脚本的内存消耗持续增加。在用户空间,存在一些方法来解决该问题,比如为Parent类提供一个析构函数,直接释放引用的子对象。但是你必须在释放Parent对象前显式调用该析构函数,如果一直这么做,将使你的代码变得非常复杂。

在PHP V5.3中,垃圾回收器将会检测这种循环引用并释放它们,从而使该脚本的内存使用保持在正常状态。当Parent对象的引用计数为0时,Parent内部引用的Child对象也将被回收。

完成。

PHP5.3新特性,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。