1. <?php  ">
    Home > php教程 > php手册 > [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    WBOY
    Release: 2016-06-06 19:59:22
    Original
    1119 people have browsed it

    因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了! 所以整理了一下 一些特性,有可能不全,待添加 PHP 5.3中的新特性 一.PHP 5.3中的新特性 1. 支持命名空间 (Namespace) 2.


    因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了!

    所以整理了一下 一些特性,有可能不全,待添加



    PHP 5.3中的新特性 


    一.PHP 5.3中的新特性 
    1. 支持命名空间 (Namespace) 
    2. 支持延迟静态绑定(Late Static Binding) 
    3. 支持goto语句 
    4. 支持闭包、Lambda/Anonymous函数 
    5. 新增两个魔术方法__callStatic()和__invoke() 
    6. 新增Nowdoc语法 
    7. 在类外也可使用const来定义常量 
    8. 三元运算符增加了一个快捷书写方式: 
    9. HTTP状态码在200-399范围内均被认为访问成功 
    10.支持动态调用静态方法 

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

    在PHP5.3之前,惯例的划分Package的办法是通过目录名来分隔代码文件,代码中的类名则用下划线_来表示目录。例如 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. class Zend_Db_Table_Select {}  
    2. // 表示当前这个类的文件位于Zend/Db/Table/Select目录下  
    3. ?>  

    这样的命名方式被PEAR、Zend Framework及各种PHP项目广泛采用。虽然该方法可以避免不同包或类库中的类名产生冲突,但在书写代码的时候显得较为麻烦和笨拙。 
    在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符为反斜杆\。 
    select.php 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. namespace Zend\Db\Table;  
    2. class Select {}  
    3. ?>  

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

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. //namespace Zend\Db;  
    2. include('select.php');  
    3. $s = new Zend\Db\Table\Select();  
    4. $s->test();  
    5. ?>  

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

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. class A {  
    2.     public static function who() {  
    3.         echo __CLASS__;  
    4.     }  
    5.     public static function test() {  
    6.         self::who();  
    7.     }  
    8. }  
    9. class B extends A {  
    10.     public static function who() {  
    11.          echo __CLASS__;  
    12.     }  
    13. }  
    14. B::test();  
    15. ?>  

    以上代码输出的结果是: 

    这和我们的预期不同,我们原来想得到子类的相应结果。 

    PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定: 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. class A {  
    2.     public static function who() {  
    3.         echo __CLASS__;  
    4.     }  
    5.     public static function test() {  
    6.         static::who(); // 这里实现了延迟的静态绑定  
    7.     }  
    8. }  
    9. class B extends A {  
    10.     public static function who() {  
    11.          echo __CLASS__;  
    12.     }  
    13. }  
    14.   
    15. B::test();  
    16. ?>  


    以上代码输出的结果是: 

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

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. goto a;  
    2. echo 'Foo';  
    3. a:  
    4. echo 'Bar';  
    5. for($i=0,$j=50; $i$i++) {  
    6.   while($j--) {  
    7.     if($j==17) goto end;  
    8.   }   
    9. }  
    10. echo "i = $i";  
    11. end:  
    12. echo 'j hit 17';  
    13. ?>  


    4.支持闭包、Lambda/Anonymous函数 
    闭包(Closure)函数和Lambda函数的概念来自于函数编程领域。例如JavaScript 是支持闭包和 lambda 函数的最常见语言之一。 

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

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

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. echo preg_replace_callback('~-([a-z])~'function ($match) {  
    2.     return strtoupper($match[1]);  
    3. }, 'hello-world');  
    4. // 输出 helloWorld  
    5. $greet = function($name)  
    6. {  
    7.     printf("Hello %s\r\n"$name);  
    8. };  
    9. $greet('World');  
    10. $greet('PHP');  
    11. //...在某个类中  
    12. $callback =      function ($quantity$productuse ($tax, &$total)         {  
    13.    $pricePerItem = constant(__CLASS__ . "::PRICE_" .  strtoupper($product));  
    14.    $total += ($pricePerItem * $quantity) * ($tax + 1.0);  
    15.  };  
    16. array_walk($products$callback);  
    17. ?>  


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

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. class MethodTest {  
    2.     public function __call($name$arguments) {  
    3.         // 参数 $name 大小写敏感  
    4.         echo "调用对象方法 '$name' "  
    5.              . implode(' -- '$arguments). "\n";  
    6.     }  
    7.   
    8.     /**  PHP 5.3.0 以上版本中本类方法有效  */  
    9.     public static function __callStatic($name$arguments) {  
    10.         // 参数 $name 大小写敏感  
    11.         echo "调用静态方法 '$name' "  
    12.              . implode(' -- '$arguments). "\n";  
    13.     }  
    14. }  
    15.   
    16. $obj = new MethodTest;  
    17. $obj->runTest('通过对象调用');  
    18.   
    19. MethodTest::runTest('静态调用');  // As of PHP 5.3.0  
    20. ?>  

    以上代码执行后输出如下: 
    调用对象方法'runTest' –- 通过对象调用调用静态方法'runTest' –- 静态调用 
    以函数形式来调用对象时,__invoke()方法将被自动调用。 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. class MethodTest {  
    2.     public function __call($name$arguments) {  
    3.         // 参数 $name 大小写敏感  
    4.         echo "Calling object method '$name' "  
    5.              . implode(', '$arguments). "\n";  
    6.     }  
    7.   
    8.     /**  PHP 5.3.0 以上版本中本类方法有效  */  
    9.     public static function __callStatic($name$arguments) {  
    10.         // 参数 $name 大小写敏感  
    11.         echo "Calling static method '$name' "  
    12.              . implode(', '$arguments). "\n";  
    13.     }  
    14. }  
    15.   
    16. $obj = new MethodTest;  
    17. $obj->runTest('in object context');  
    18.   
    19. MethodTest::runTest('in static context');  // As of PHP 5.3.0  
    20. ?>  


    6.新增Nowdoc语法 
    用法和Heredoc类似,但使用单引号。Heredoc则需要通过使用双引号来声明。 
    Nowdoc中不会做任何变量解析,非常适合于传递一段PHP代码。 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. // Nowdoc 单引号 PHP 5.3之后支持  
    2. $name = 'MyName';  
    3. echo 'EOT'  
    4. My name is "$name".  
    5. EOT;  
    6. //上面代码输出 My name is "$name". ((其中变量不被解析)  
    7. // Heredoc不加引号  
    8. echo 
    9. Hello World!  
    10. FOOBAR;  
    11. //或者 双引号 PHP 5.3之后支持  
    12. echo "FOOBAR"  
    13. Hello World!  
    14. FOOBAR;  
    15. ?>  


    支持通过Heredoc来初始化静态变量、类成员和类常量。 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. // 静态变量  
    2. function foo()  
    3. {  
    4.     static $bar = 
    5. Nothing in here...  
    6. LABEL;  
    7. }  
    8.   
    9. // 类成员、常量  
    10. class foo  
    11. {  
    12.     const BAR = 
    13. Constant example  
    14. FOOBAR;  
    15.   
    16.     public $baz = 
    17. Property example  
    18. FOOBAR;  
    19. }  
    20. ?>  


    7. 在类外也可使用const来定义常量 
    PHP中定义常量通常是用这种方式: 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. define("CONSTANT""Hello world.");  
    2. ?>  

    并且新增了一种常量定义方式: 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. const CONSTANT = 'Hello World';  
    2. ?>  


    8. 三元运算符增加了一个快捷书写方式 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. ?:  

    原本格式为是(expr1) ? (expr2) : (expr3) 
    如果expr1结果为True,则返回expr2的结果。 

    PHP5.3新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3 
    如果expr1结果为True,则返回expr1的结果 

    9. HTTP状态码在200-399范围内均被认为访问成功 
    10.支持动态调用静态方法 

    Php代码  [转] php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

    1. class Test{  
    2.     public static function testgo()  
    3.     {  
    4.          echo "gogo!";  
    5.     }  
    6. }  
    7. $class = 'Test';  
    8. $action = 'testgo';  
    9. $class::$action();  //输出 "gogo!"  
    10. ?>  


    11. 支持嵌套处理异常(Exception) 
    12. 新的垃圾收集器(GC),并默认启用 

    二.PHP5.3中其它值得注意的改变 
    1. 修复了大量bug 
    2. PHP性能提高 
    3. php.ini中可使用变量 
    4. mysqlnd进入核心扩展 理论上说该扩展访问mysql速度会较之前的MySQL 和 MySQLi 扩展快(参见http://dev.mysql.com/downloads/connector/php-mysqlnd/) 
    5. ext/phar、ext/intl、ext/fileinfo、ext/sqlite3和ext/enchant等扩展默认随PHP绑定发布。其中Phar可用于打包PHP程序,类似于Java中的jar机制。 
    6. ereg 正则表达式函数 不再默认可用,请使用速度更快的PCRE 正则表达式函数 



    PHP 5.4中的新特性 

    [html] view plaincopyprint?

    1. 1. Buid-in web server内置了一个简单的Web服务器  
    2. 把当前目录作为Root Document只需要这条命令即可:  
    3. # php -S localhost:3300  
    4. 也可以指定其它路径:  
    5. # php -S localhost:3300 -t /path/to/root  
    6. 还可以指定路由:  
    7. # php -S localhost:3300 router.php  
    8.   
    9. 2.Traits  
    10. Traits提供了一种灵活的代码重用机制,即不像interface一样只能定义方法但不能实现,又不能像class一样只能单继承。至于在实践中怎样使用,还需要深入思考。  
    11. 魔术常量为__TRAIT__  
    12.   
    13. 3. Short array syntax 数组简短语法  
    14. $arr = [1,'james', 'james@fwso.cn'];  
    15. $array = [  
    16.   "foo" => "bar",  
    17.   "bar" => "foo"  
    18.   ];  
    19.   
    20. 4. Array dereferencing 数组值  
    21. function myfunc() {  
    22.     return array(1,'james', 'james@fwso.cn');  
    23. }  
    24. 我认为比数组简短语法更方便的是dereferencing,以前我们需要这样:  
    25. $arr = myfunc();  
    26. echo $arr[1];  
    27. 在PHP5.4中这样就行了:  
    28. echo myfunc()[1];  
    29. 其他:  
    30. $name = explode(",", "Laruence,male")[0];  
    31. explode(",", "Laruence,male")[3] = "phper";  
    32. 本例要注意一个要点http://www.laruence.com/2011/12/19/2409.html  
    33.   
    34. 5. Upload progress  
    35. Session提供了上传进度支持,通过$_SESSION["upload_progress_name"]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。  
    36. 详细的看http://www.laruence.com/2011/10/10/2217.html  
    37.   
    38. 6. JsonSerializable Interface  
    39. 实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。  
    40.   
    41. 7. Use mysqlnd by default  
    42. 现在mysql, mysqli, pdo_mysql默认使用mysqlnd本地库,在PHP5.4以前需要:  
    43. $./configure --with-mysqli=mysqlnd  
    44. 现在:  
    45. $./configure --with-mysqli  
    46.   
    47. 以上来自:http://www.hdj.me/php54  

    [php] view plaincopyprint?

    1. 8.实例化类  
    2. class test{  
    3.     function show(){  
    4.     return 'test';  
    5.     }  
    6. }  
    7. echo (new test())->show();  
    8.   
    9. 9.支持 Class::{expr}() 语法  
    10. foreach ([new Human("Gonzalo"), new Human("Peter")] as $human) {  
    11.     echo $human->{'hello'}();  
    12. }  
    13.   
    14. 10.Callable typehint  
    15. function foo(callable $callback) {  
    16. }  
    17.   则:  
    18.   foo("false"); //错误,因为false不是callable类型  
    19.   foo("printf"); //正确  
    20.   foo(function(){}); //正确  
    21. class A {  
    22.   static function show() {  
    23.     }  
    24. }  
    25.   foo(array("A""show")); //正确  
    26.   
    27. 11.函数类型提示的增强  
    28. 由于php是弱类型的语言,因此在php 5.0后,引入了函数类型提示的功能,其含义为对于传入函数中的参数都进行类型检查,举个例子,有如下的类:  
    29. class bar {  
    30. function foo(bar $foo) {  
    31. }  
    32. //其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如:  
    33. function foo(array $foo) {  
    34. }  
    35. }  
    36.   foo(array(1, 2, 3)); // 正确,因为传入的是数组  
    37.   foo(123); // 不正确,传入的不是数组  
    38.   
    39. 12.新增加了$_SERVER["REQUEST_TIME_FLOAT"],这个是用来统计服务请求时间的,并用ms来表示  
    40. echo "脚本执行时间 "round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), "s";  
    41.   
    42. 13. 让Json更懂中文(JSON_UNESCAPED_UNICODE)  
    43. echo json_encode("中文", JSON_UNESCAPED_UNICODE);  
    44. //"中文"  
    45.   
    46.   
    47. 14. 二进制直接量(binary number format)  
    48. $bin  = 0b1101;  
    49. echo $bin;  
    50. //13  

    [php] view plaincopyprint?

    1. PHP 5.4.0 性能大幅提升, 修复超过100个bug.   
    2. 废除了register_globals, magic_quotes以及安全模式。   
    3. 另外值得一提的是多字节支持已经默认启用了,  
    4. default_charset从ISO-8859-1已经变为UTF-8.   
    5. 默认发送“Content-Type: text/html; charset=utf-8”,  
    6. 你再也不需要在HTML里写meta tag,也无需为UTF-8兼容而传送额外的header了。  
    7.   
    8. 删除的特性  
    9. 最后,我们集中整理了几年来标记为已弃用的多个特性。这些特性包括 allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat42、session.bug_compat_warn 以及 y2k_compliance。  
    10. 除了这些特性之外,magic_quotes 可能是最大的危险。在早期版本中,未考虑因 magic_quotes 出错导致的后果,简单编写且未采取任何举措使自身免受 SQL 注入攻击的应用程序都通过 magic_quotes 来保护。如果在升级到 PHP 5.4 时未验证已采取正确的 SQLi 保护措施,则可能导致安全漏洞。  
    11.   
    12.   
    13. 其他改动和特性  
    14. 有一种新的“可调用的”类型提示,用于某方法采用回调作为参数的情况。  
    15. htmlspecialchars() 和 htmlentities() 现在可更好地支持亚洲字符,如果未在 php.ini 文件中显式设置 PHP default_charset,这两个函数默认使用 UTF-8 而不是 ISO-8859-1。  
    16. =(精简回显语法)现在始终可用,无论 short_tags ini 设置的值为何。这应该使模板化系统创建者感到满意。  
    17. 会话 ID 现在默认通过 /dev/urandom(或等效文件)中的熵生成,而不是与早期版本一样成为必须显式启用的一个选项。  
    18. mysqlnd 这一捆绑的 MySQL 原生驱动程序库现在默认用于与 MySQL 通信的各种扩展,除非在编译时通过 ./configure 被显式覆盖。  
    19. 可能还有 100 个小的改动和特性。从 PHP 5.3 升级到 5.4 应该极为顺畅,但请阅读迁移指南加以确保。如果您从早期版本升级,执行的操作可能稍多一些。请查看以前的迁移指南再开始升级。  



    PHP 5.5中的新特性

    [php] view plaincopyprint?

    1. 新特性及提案列表 都相当大,而且不是按重要性排序。所以,如果你不想通读一遍的话,这里有四个特点我个人是最兴奋的:   
    2. :一个简单的密码散列API  
    3. :标量类型提示  
    4. :Getter和Setter     
    5. :生成器  
    6. 现在,让我们来看看PHP5.5 可能会新增的功能:   
    7. 1、放弃对Windows XP和2003 的支持  
    8.   
    9. 2.弃用e修饰符  
    10. e修饰符是指示preg_replace函数用来评估替换字符串作为PHP代码,而不只是仅仅做一个简单的字符串替换。不出所料,这种行为会源源不断的出现安全问题。这就是为什么在PHP5.5 中使用这个修饰符将抛出一个弃用警告。作为替代,你应该使用preg_replace_callback函数。你可以从RFC找到更多关于这个变化相应的信息。  
    11.   
    12. 3.新增函数和类  
    13. boolval()  
    14. PHP已经实现了strvalintvalfloatval的函数。为了达到一致性将添加boolval函数。它完全可以作为一个布尔值计算,也可以作为一个回调函数。   
    15.   
    16. hash_pbkdf2()  
    17. PBKDF2全称“Password-Based Key Derivation Function 2”,正如它的名字一样,是一种从密码派生出加密密钥的算法。这就需要加密算法,也可以用于对密码哈希。更广泛的说明和用法示例  
    18.   
    19. array_column()  
    20. $userNames = array_column($users'name');  
    21. // is the same as  
    22. $userNames = [];  
    23. foreach ($users as $user) {  
    24.     $userNames[] = $user['name'];  
    25. }  
    26.   
    27. intl 扩展   
    28. 将有许多改进 intl的扩展。例如,将会有新的IntlCalendar,IntlGregorianCalendar,IntlTimeZone,IntlBreakIterator,IntlRuleBasedBreakIterator,IntlCodePointBreakIterator类。之前,我竟然不知道有这么多关于intl扩展,如果你想知道更多,我建议你去最新公告里找 Calendar和 BreakIterator。   
    29.   
    30. 4.一个简单的密码散列API  
    31. $password = "foo";    
    32. // creating the hash    
    33. $hash = password_hash($password, PASSWORD_BCRYPT);    
    34. // verifying a password    
    35. if (password_verify($password$hash)) {    
    36.     // password correct!    
    37. else {    
    38.     // password wrong!    
    39. }   
    40.   
    41. 5.新的语言特性和增强功能。  
    42. 常量引用  
    43. “常量引用”意味着数组可以直接操作字符串和数组字面值。举两个例子:  
    44. function randomHexString($length) {    
    45.     $str = '';    
    46.     for ($i = 0; $i $length; ++$i) {    
    47.         $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string    
    48.     }    
    49. }    
    50. function randomBool() {    
    51.     return [false, true][mt_rand(0, 1)]; // direct dereference of array    
    52. }   
    53. 我不认为在实践中会使用此功能,但它使语言更加一致。请参阅 RFC。  
    54.   
    55. 6.调用empty()函数(和其他表达式)一起工作  
    56. 目前,empty()语言构造只能用在变量,而不能在其他表达式。  
    57. 在特定的代码像empty($this->getFriends())将会抛出一个错误。作为PHP5.5 这将成为有效的代码  
    58.   
    59. 7.获取完整类别名称  
    60. PHP5.3 中引入命名空间的别名类和命名空间短版本的功能。虽然这并不适用于字符串类名称  
    61. use Some\Deeply\Nested\Namespace\FooBar;    
    62. // does not work, because this will try to use the global `FooBar` class    
    63. $reflection = new ReflectionClass('FooBar');   
    64. echo FooBar::class;  
    65. 为了解决这个问题采用新的FooBar::class语法,它返回类的完整类别名称  
    66.   
    67. 8.参数跳跃   
    68. 如果你有一个函数接受多个可选的参数,目前没有办法只改变最后一个参数,而让其他所有参数为默认值。   
    69. RFC上的例子,如果你有一个函数如下:   
    70. function create_query($where$order_by$join_type=''$execute = false, $report_errors = true) { ... }  
    71. 那么有没有办法设置$report_errors=false,而其他两个为默认值。为了解决这个跳跃参数的问题而提出:   
    72. create_query("deleted=0""name"defaultdefault, false);  
    73. 我个人不是特别喜欢这个提议。在我的眼睛里,代码需要这个功能,只是设计不当。函数不应该有12个可选参数。   
    74.   
    75. 9.标量类型提示   
    76. 标量类型提示原本计划进入5.4,但由于缺乏共识而没有做。获取更多关于为什么标量类型提示没有做进PHP的信息,请参阅: 标量类型提示比你认为的更难。   
    77. 对于PHP5.5 而言,针对标量类型提示讨论又一次出现,我认为这是一个相当不错的 提议。   
    78. 它需要通过输入值来指定类型。例如:123,123.0,“123”都是一个有效的int参数输入,但“hello world”就不是。这与内部函数的行为一致。   
    79. function foo(int $i) { ... }  
    80. foo(1);      // $i = 1  
    81. foo(1.0);    // $i = 1  
    82. foo("1");    // $i = 1  
    83. foo("1abc"); // not yet clear, maybe $i = 1 with notice  
    84. foo(1.5);    // not yet clear, maybe $i = 1 with notice  
    85. foo([]);     // error  
    86. foo("abc");  // error  
    87.   
    88. 10.Getter 和 Setter   
    89. 如果你从不喜欢写这些getXYZ()和setXYZ($value)方法,那么这应该是你最受欢迎的改变。提议添加一个新的语法来定义一个属性的设置/读取:   
    90.   
    91. class TimePeriod {  
    92.     public $seconds;  
    93.   
    94.     public $hours {  
    95.         get { return $this->seconds / 3600; }  
    96.         set { $this->seconds = $value * 3600; }  
    97.     }  
    98. }  
    99. $timePeriod = new TimePeriod;  
    100. $timePeriod->hours = 10;  
    101. var_dump($timePeriod->seconds); // int(36000)  
    102. var_dump($timePeriod->hours);   // int(10)  
    103. 当然还有更多的功能,比如只读属性。如果你想要知道更多,请参阅 RFC。   
    104.   
    105. 11.生成器   
    106. 目前,自定义迭代器很少使用,因为它们的实现,需要大量的样板代码。生成器解决这个问题,并提供了一种简单的样板代码来创建迭代器。   
    107. 例如,你可以定义一个范围函数作为迭代器:   
    108. function *xrange($start$end$step = 1) {  
    109.     for ($i = $start$i $end$i += $step) {  
    110.         yield $i;  
    111.     }  
    112. }  
    113. foreach (xrange(10, 20) as $i) {  
    114.     // ...  
    115. }  
    116. 上述xrange函数具有与内建函数相同的行为,但有一点区别:不是返回一个数组的所有值,而是返回一个迭代器动态生成的值。   
    117.   
    118.   
    119. 12.列表解析和生成器表达式   
    120.   
    121. 列表解析提供一个简单的方法对数组进行小规模操作:   
    122. $firstNames = [foreach ($users as $user) yield $user->firstName];  
    123. 上述列表解析相等于下面的代码:   
    124. $firstNames = [];  
    125. foreach ($users as $user) {  
    126.     $firstNames[] = $user->firstName;  
    127. }  
    128. 也可以这样过滤数组:   
    129. $underageUsers = [foreach ($users as $userif ($user->age $user];  
    130. 生成器表达式也很类似,但是返回一个迭代器(用于动态生成值)而不是一个数组。   
    131.   
    132. 以上来自:http://www.oschina.net/question/157182_61259  

    [php] view plaincopyprint?

    1. 13.finally关键字  
    2. 这个和java中的finally一样,经典的try ... catch ... finally 三段式异常处理。  
    3.   
    4. 14.foreach 支持list()  
    5. 对于“数组的数组”进行迭代,之前需要使用两个foreach,现在只需要使用foreach + list了,但是这个数组的数组中的每个数组的个数需要一样。看文档的例子一看就明白了。  
    6. $array = [  
    7.     [1, 2],  
    8.     [3, 4],  
    9. ];  
    10. foreach ($array as list($a$b)) {  
    11.     echo "A: $a; B: $b\n";  
    12. }  
    13.   
    14. 15.增加了opcache扩展  
    15. 使用opcache会提高php的性能,你可以和其他扩展一样静态编译(--enable-opcache)或者动态扩展(zend_extension)加入这个优化项。  
    16.   
    17. 16.非变量array和string也能支持下标获取了  
    18. echo array(1, 2, 3)[0];  
    19. echo [1, 2, 3][0];  
    20. echo "foobar"[2];  


    来源:

    http://blog.csdn.net/fenglailea/article/details/9853645

    http://blog.csdn.net/baiwz/article/details/9077825


    source:php.cn
    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Popular Recommendations
    Popular Tutorials
    More>
    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template