在PHP5.3之前,惯例的划分Package的办法是通过目录名来分隔代码文件,代码中的类名则用下划线_来表示目录。例如
<?php class Zend_Db_Table_Select {} // 表示当前这个类的文件位于Zend/Db/Table/Select目录下 ?>
这样的命名方式被PEAR、Zend Framework及各种PHP项目广泛采用。虽然该方法可以避免不同包或类库中的类名产生冲突,但在书写代码的时候显得较为麻烦和笨拙。
<?php namespace Zend/Db/Table; class Select {} ?>
<?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 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
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'; ?>
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); ?>
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' –- 静态调用
以函数形式来调用对象时,__invoke()方法将被自动调用。
<?php class MethodTest { public function __call($name, $arguments) { // 参数 $name 大小写敏感 echo "Calling object method '$name' " . implode(', ', $arguments). "/n"; } /** PHP 5.3.0 以上版本中本类方法有效 */ public static function __callStatic($name, $arguments) { // 参数 $name 大小写敏感 echo "Calling static method '$name' " . implode(', ', $arguments). "/n"; } } $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); // As of PHP 5.3.0 ?>
<?php // Nowdoc 单引号PHP 5.3之后支持 $name = 'MyName'; echo <<<'EOT' My name is "$name". EOT; //上面代码输出 My name is "$name". ((其中变量不被解析) // Heredoc不加引号 echo <<<FOOBAR Hello World! FOOBAR; //或者双引号 PHP 5.3之后支持 echo <<<"FOOBAR" Hello World! FOOBAR; ?>
支持通过Heredoc来初始化静态变量、类成员和类常量。
<?php // 静态变量 function foo() { static $bar = <<<LABEL Nothing in here... LABEL; } // 类成员、常量 class foo { const BAR = <<<FOOBAR Constant example FOOBAR; public $baz = <<<FOOBAR Property example FOOBAR; } ?>
<?php define("CONSTANT", "Hello world."); ?>
PHP5.3 新增了一种常量定义方式:
<?php const CONSTANT = 'Hello World'; ?>
<?php class Test { public static function testgo() { echo "gogo!"; } } $class = 'Test'; $action = 'testgo'; $class::$action(); //输出 "gogo!" ?>
1. 修复了大量bug
2. PHP 性能提高
3. php.ini 中可使用变量
ereg
正则表达式函数 不再默认可用,请使用速度更快的 PCRE 正则表达式函数
其余参考:
http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new1/
http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new2/
http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new3/
http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new4/index.html
http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new5/index.html