PHP5.3、PHP5.4的特性
   介绍与深度挖掘

    分享者:刘喜东
 邮箱:xidongliu@anjuke.com
内容结构

• PHP 5.3特性
• PHP 5.4特性
• 跨版本的特性




                     2
PHP5.3特性

•   命名空间
•   延迟静态绑定
•   闭包
•   SPL
•   其他特性概述




                        3
PHP5.3特性

•   命名空间
•   延迟静态绑定
•   闭包
•   SPL
•   其他特性概述




                        4
命名空间

1. 起名字是个问题。
2. 解决命名冲突的两类方案:人为约定、语
   法支持。
3. 其他语言如何解决的:
• Python——模块就是命名空间。
• JavaScript——对象、with、匿名函数。




                              5
PHP的命名空间

• namespace
• use
• __NAMESPACE__




                     6
例子1:命名空间1
<?php
namespace test;
class Sample{
        //some code
}
?>

<?php
namespace test1;
class Sample{
        //some code
}
?>

                                  7
例子2:命名空间2
<?php
use test;
use test1 as t1;

$obj1 = new testSample();
$obj2 = new t1Sample();




                                8
例子3:命名空间3
<?php
namespace service;
use PDO;

$db = new PDO($dsn, $user, $password);




                                         9
命名空间的总结

• 提供了解决命名冲突的语法支持。
• 在软件架构非常复杂的情况下使用。
• 在php.ini配置了auto_prepend_file的情况下
  使用。
• 虽不优雅但是基本完成任务。




                                 10
PHP5.3特性

•   命名空间
•   延迟静态绑定
•   闭包
•   SPL
•   其他特性概述




                        11
何谓延迟静态绑定?
class Dad{
          public static $name = ‘Jack’;
          public static get_name(){
                     echo self::$name;
          }
}
class Son extends Dad{
          public static $name = ‘Jones’;
          public static get_name(){
                     echo self::$name;
          }
}
Dad::get_name();
Son::get_name();
//output
Jack
Jack
                                           12
这就是延迟静态绑定
class Dad{
             public static $name = ‘Jack’;
             public static get_name(){
                          echo self::$name;
             }
}
class Son extends Dad{
           public static $name = ‘Jones’;
           public static get_name(){
                        echo static::$name;
           }
}

Dad::get_name();
Son::get_name();

//output
Jack
Jones

                                              13
意义何在?

• OO有三宝:封装、继承、多态。
• 完善PHP在静态类的多态特性的实现。
• 可以将更多类写成静态类。




                       14
PHP5.3特性

•   命名空间
•   延迟静态绑定
•   闭包
•   SPL
•   其他特性概述




                        15
闭包

• PHP 5.3.0添加此特性。
• 直到PHP 5.4一直在完善。




                    16
例子4:闭包1
<?php
$test = ‘Hello ’;

$a = function($v) use ($test){
        echo $test,$v,PHP_EOL;
};

$a(‘world1’);
$a(‘world2’);

//output
Hello world1!
Hello world2!

                                 17
例子5:闭包2
<?php
class Test{}
Function test(){}
define('A','3434');

$a = function(){
        var_dump($_SERVER);
        var_dump(__FILE__);
        var_dump(A);
        test();
        new Test;
};
$a();

                                18
例子6:闭包3
<?php
//5.3的时候如何引用闭包所在的对象实例
Class Test{
       public $name = 123;

     pulic function sample(){
              $that = $this;
              $a = function()use($that){
                      echo $that->name;
              };
     }
}


                                           19
例子7:闭包4
<?php
//5.4的时候可以直接使用this
Class Test{
       public $name = 123;

       pulic function sample(){
                $a = function(){
                        echo $this->name;
                };
       }
}




                                            20
注意事项

• 结尾的分号不可少。
• use默认是传值,不是传引用。要传引用请
  加&。




                     21
闭包的价值

• 提供一个更小粒度的代码重用方案
• OO代码重用按范围从大到小排列:
  class>method>closure
• 更具体的,在一个大方法内有重复代码,
  就可以用闭包来解决。




                         22
PHP5.3特性

•   命名空间
•   延迟静态绑定
•   闭包
•   SPL
•   其他特性概述




                        23
SPL

• 全称:Standard PHP Library
• 它提供了:迭代器、异常、数组重载、文
  件处理等。
• 这是个宝藏,你值得拥有。




                            24
三个代表

• SplFileInfo
• SplFixedArray
• spl_autoload_register




                          25
SplFileInfo
<?php
$info = new SplFileInfo(‘/home/example.php');

if ($info->isFile()) {
          echo $info->getRealPath();
          echo $info->getFilename();
}




                                                26
SplFixedArray

• 指定长度的数组。
• 相比array()更快。

<?php
$array = new SplFixedArray(5);
$array[1] = 2;
echo $array->count();




                                   27
spl_autoload_register

• 可以注册多个自动载入函数。
• 支持导入类的方式。

<?php
spl_autoload_regiter(‘load_util’);
spl_autoload_regiter(‘load_model’);

Spl_autoload_regiter(array(‘loader’,’util’));
Spl_autoload_regiter(array(‘loader’,’model’));


                                                 28
PHP5.3特性

•   命名空间
•   延迟静态绑定
•   闭包
•   SPL
•   其他特性概述




                        29
其他特性概述

• 增加goto语法。
• php.ini支持[HOST=]、[PATH=]设置。
• 增加__DIR__魔术常量。




                                30
告一段落



To be continued… …




                     31
PHP5.4特性

• 奇怪的Traits
• 获得文件上传进度的支持
• 小清新特性若干




                  32
PHP5.4特性

• 奇怪的Traits
• 获得文件上传进度的支持
• 小清新特性若干




                  33
什么是Traits?

•   看起来像类,但不是类。
•   不是接口,但可以多个共存。
•   不能独立使用,只能依附于类。
•   不可继承。
•   不能实现接口。




                      34
例子8:traits1
<?php
trait Debug{
         public $debug_power = 1;
         public function back_trace(){
                  //some code
         }
}

class Sample{
        use Debug;
}




                                         35
例子9:traits2
<?php
class Sample{
       use Debug,Logger;
}




                                36
例子10:traits3

<?php
class Sample{
      use Debug,Logger{
           Logger::log instead of Debug;
      }
}




                                           37
例子11:traits4
<?php
class Sample{
       use Debug,Logger{
             Logger::log instead of Debug;
             Debug::log as dlog;
       }
}




                                             38
例子15:traits5
<?php
trait HelloWorld {
           public function sayHello() {
                     echo 'Hello World!';
           }
}

class TheWorldIsNotEnough {
         use HelloWorld;
         public function sayHello() {
                   echo 'Hello Universe!';
         }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();

//output
Hello Universe

                                             39
语法补充

•   可以有静态成员。
•   可以有抽象方法。
•   新增函数:trait_exists
•   暂不支持autoload




                        40
价值挖掘

•   新的代码重用方式。
•   多继承的另类替代方案。
•   相比类耦合更简单。
•   相比函数表达能力更强。
•   天生就是好拦截器。




                  41
适合的应用场景

Authentication
Caching
Error handling
Lazy loading
Debuging
Logging
……


                           42
PHP5.4特性

• 奇怪的Traits
• 获得文件上传进度的支持
• 小清新特性若干




                  43
过去如何获得?

• Flash(SWFUpload)
• APC(PECL)
• Upload progress(PECL)




                          44
PHP5.4提供原生支持

• 用session提供上传进度信息
• 需要设置php.ini




                      45
配置项
;是否开启session记录上传进度
session.upload_progress.enabled = On
;是否在上传完毕清空进度信息
session.upload_progress.cleanup = On
;上传进度信息的key前缀
session.upload_progress.prefix = “upload_progress_”
;上传文件的表单的名字
session.upload_progress.name
=‘PHP_SESSION_UPLOAD_PROGRESS’
;更新进度的频率(已经处理的字节数), 也支持百分比表示’
session.upload_progress.freq = "1%"
;更新进度的时间间隔(秒级)
session.upload_progress.min_freq = "1"



                                                      46
获取方式
$_SESSION["upload_progress_liuxd"] = array(
       "start_time" => 1234567890, // 请求时间
       "content_length" => 57343257, // 上传文件总大小
       "bytes_processed" => 453489, // 已经处理的大小
       "done" => false, // 当所有上传处理完成后为TRUE
       "files" => array(
       0 => array(
                 "field_name" => "file1", // 表单中上传框的名字
                 "name" => "foo.avi",
                 "tmp_name" => "/tmp/phpxxxxxx",
                 "error" => 0,
                 "done" => true, // 当处理完成后会变成TRUE
                 "start_time" => 1234567890, // 开始处理时间
                 "bytes_processed" => 57343250, // 已经处理的大小
       ),
                                                             47
PHP5.4特性

• 奇怪的Traits
• 获得文件上传进度的支持
• 小清新特性若干




                  48
哪些小清新?

•   数组:$a = array() VS $a = []
•   闭包内直接使用$this
•   $obj->get_array()[12];
•   (new User())->get_user_info();




                                     49
又告一段落




To be continued too!




                       50
跨两个版本的变化

• use 关键字的作用
• php-fpm




                   51
use关键字的功能

1. 为闭包引入作用域内的变量。
2. 导入其他命名空间。
3. 引用traits。




                   52
php-fpm立志传

• PHP 5.2.13——作为patch
• PHP 5.3.3——混进核心扩展库。
• PHP 5.4.0——Removed EXPERIMENTAL
  flag

  经过两年多的奋斗,终于从临时工混成
公务员了!


                                53
友情提醒

  2012年4月26日,PHP 5.4.1发布了。
  PHP 5.4朝着稳定又迈进一步,我们应
该认真做准备来迎接它了。




                             54
Thanks!

课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘