SlideShare a Scribd company logo
1 of 55
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!

More Related Content

What's hot

advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniterBo-Yi Wu
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7Justin Lin
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
Puppet安装测试
Puppet安装测试Puppet安装测试
Puppet安装测试Yiwei Ma
 
CH11:執行緒與並行API
CH11:執行緒與並行APICH11:執行緒與並行API
CH11:執行緒與並行APIJustin Lin
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introductionotakustay
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式勇浩 赖
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Justin Lin
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享Chong-Kuan Chen
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmiyiditushe
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
 
部分PHP问题总结[转贴]
部分PHP问题总结[转贴]部分PHP问题总结[转贴]
部分PHP问题总结[转贴]wensheng wei
 
Bash入门基础篇
Bash入门基础篇Bash入门基础篇
Bash入门基础篇Zhiyao Pan
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用Robert Hao
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出wang hongjiang
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析wavefly
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享zenyuhao
 
LazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHPLazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHPLin Yo-An
 

What's hot (20)

advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
 
Ali-tomcat
Ali-tomcatAli-tomcat
Ali-tomcat
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
Puppet安装测试
Puppet安装测试Puppet安装测试
Puppet安装测试
 
CH11:執行緒與並行API
CH11:執行緒與並行APICH11:執行緒與並行API
CH11:執行緒與並行API
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmi
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。
 
部分PHP问题总结[转贴]
部分PHP问题总结[转贴]部分PHP问题总结[转贴]
部分PHP问题总结[转贴]
 
Bash入门基础篇
Bash入门基础篇Bash入门基础篇
Bash入门基础篇
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 
LazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHPLazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHP
 

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

PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向Shengyou Fan
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹Shengyou Fan
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍cyf5513
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
1, shell intro
1, shell intro1, shell intro
1, shell introted-xu
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定Shengyou Fan
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsHo Kim
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 

Similar to 课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘 (20)

PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
1, shell intro
1, shell intro1, shell intro
1, shell intro
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定
 
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
运维自动化
运维自动化运维自动化
运维自动化
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 

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