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