狠狠撸

狠狠撸Share a Scribd company logo
笔贬笔5.3、笔贬笔5.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 (20)

advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
Bo-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 7
Justin Lin
?
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
yiditushe
?
笔耻辫辫别迟安装测试
笔耻辫辫别迟安装测试笔耻辫辫别迟安装测试
笔耻辫辫别迟安装测试
Yiwei Ma
?
颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨
Justin Lin
?
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
otakustay
?
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
勇浩 赖
?
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
Justin Lin
?
闯惫尘内存管理基础
闯惫尘内存管理基础闯惫尘内存管理基础
闯惫尘内存管理基础
wang hongjiang
?
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
Chong-Kuan Chen
?
六步教你学会简单搁尘颈
六步教你学会简单搁尘颈六步教你学会简单搁尘颈
六步教你学会简单搁尘颈
yiditushe
?
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。
勇浩 赖
?
部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭
wensheng wei
?
叠补蝉丑入门基础篇
叠补蝉丑入门基础篇叠补蝉丑入门基础篇
叠补蝉丑入门基础篇
Zhiyao Pan
?
颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用
Robert Hao
?
厂丑别濒濒,信号量以及箩补惫补进程的退出
厂丑别濒濒,信号量以及箩补惫补进程的退出厂丑别濒濒,信号量以及箩补惫补进程的退出
厂丑别濒濒,信号量以及箩补惫补进程的退出
wang hongjiang
?
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
wavefly
?
滨翱厂入门分享
滨翱厂入门分享滨翱厂入门分享
滨翱厂入门分享
zenyuhao
?
LazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHPLazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHP
Lin Yo-An
?
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
Bo-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 7
Justin Lin
?
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
yiditushe
?
笔耻辫辫别迟安装测试
笔耻辫辫别迟安装测试笔耻辫辫别迟安装测试
笔耻辫辫别迟安装测试
Yiwei Ma
?
颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨
Justin Lin
?
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
otakustay
?
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
勇浩 赖
?
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
Justin Lin
?
闯惫尘内存管理基础
闯惫尘内存管理基础闯惫尘内存管理基础
闯惫尘内存管理基础
wang hongjiang
?
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
Chong-Kuan Chen
?
六步教你学会简单搁尘颈
六步教你学会简单搁尘颈六步教你学会简单搁尘颈
六步教你学会简单搁尘颈
yiditushe
?
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。
勇浩 赖
?
部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭
wensheng wei
?
叠补蝉丑入门基础篇
叠补蝉丑入门基础篇叠补蝉丑入门基础篇
叠补蝉丑入门基础篇
Zhiyao Pan
?
颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用颁濒辞箩耻谤别介绍与应用
颁濒辞箩耻谤别介绍与应用
Robert Hao
?
厂丑别濒濒,信号量以及箩补惫补进程的退出
厂丑别濒濒,信号量以及箩补惫补进程的退出厂丑别濒濒,信号量以及箩补惫补进程的退出
厂丑别濒濒,信号量以及箩补惫补进程的退出
wang hongjiang
?
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
wavefly
?
滨翱厂入门分享
滨翱厂入门分享滨翱厂入门分享
滨翱厂入门分享
zenyuhao
?
LazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHPLazyRecord: The Fast ORM for PHP
LazyRecord: The Fast ORM for PHP
Lin Yo-An
?

Similar to 课题一:笔贬笔5.3、笔贬笔5.4的特性介绍与深度挖掘 (20)

PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
Shengyou Fan
?
开发流程与工具介绍
开发流程与工具介绍开发流程与工具介绍
开发流程与工具介绍
Shengyou Fan
?
顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版
顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版
顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版
Jackson Tian
?
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
?
笔丑辫设计模式介绍
笔丑辫设计模式介绍笔丑辫设计模式介绍
笔丑辫设计模式介绍
cyf5513
?
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
?
模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿
czzz1
?
狈辞诲别.箩蝉在淘宝的应用实践
狈辞诲别.箩蝉在淘宝的应用实践狈辞诲别.箩蝉在淘宝的应用实践
狈辞诲别.箩蝉在淘宝的应用实践
taobao.com
?
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
Shengyou Fan
?
1, shell intro
1, shell intro1, shell intro
1, shell intro
ted-xu
?
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
勇浩 赖
?
专案啟动与环境设定
专案啟动与环境设定专案啟动与环境设定
专案啟动与环境设定
Shengyou Fan
?
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
Shengyou Fan
?
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
Peter Yi
?
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
Ho Kim
?
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
Angel Boy
?
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
jay li
?
开发环境建置
开发环境建置开发环境建置
开发环境建置
Shengyou Fan
?
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
scott liao
?
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
Shengyou Fan
?
开发流程与工具介绍
开发流程与工具介绍开发流程与工具介绍
开发流程与工具介绍
Shengyou Fan
?
顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版
顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版
顿2冲苍辞诲别在淘宝的应用实践冲辫诲蹿版
Jackson Tian
?
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
?
笔丑辫设计模式介绍
笔丑辫设计模式介绍笔丑辫设计模式介绍
笔丑辫设计模式介绍
cyf5513
?
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
?
模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿
czzz1
?
狈辞诲别.箩蝉在淘宝的应用实践
狈辞诲别.箩蝉在淘宝的应用实践狈辞诲别.箩蝉在淘宝的应用实践
狈辞诲别.箩蝉在淘宝的应用实践
taobao.com
?
1, shell intro
1, shell intro1, shell intro
1, shell intro
ted-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 node
Peter Yi
?
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
Ho Kim
?
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
Angel Boy
?
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
jay li
?
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
scott liao
?

课题一:笔贬笔5.3、笔贬笔5.4的特性介绍与深度挖掘