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

1,616 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,616
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. PHP5.3、PHP5.4的特性 介绍与深度挖掘 分享者:刘喜东 邮箱:xidongliu@anjuke.com
  2. 2. 内容结构• PHP 5.3特性• PHP 5.4特性• 跨版本的特性 2
  3. 3. PHP5.3特性• 命名空间• 延迟静态绑定• 闭包• SPL• 其他特性概述 3
  4. 4. PHP5.3特性• 命名空间• 延迟静态绑定• 闭包• SPL• 其他特性概述 4
  5. 5. 命名空间1. 起名字是个问题。2. 解决命名冲突的两类方案:人为约定、语 法支持。3. 其他语言如何解决的:• Python——模块就是命名空间。• JavaScript——对象、with、匿名函数。 5
  6. 6. PHP的命名空间• namespace• use• __NAMESPACE__ 6
  7. 7. 例子1:命名空间1<?phpnamespace test;class Sample{ //some code}?><?phpnamespace test1;class Sample{ //some code}?> 7
  8. 8. 例子2:命名空间2<?phpuse test;use test1 as t1;$obj1 = new testSample();$obj2 = new t1Sample(); 8
  9. 9. 例子3:命名空间3<?phpnamespace service;use PDO;$db = new PDO($dsn, $user, $password); 9
  10. 10. 命名空间的总结• 提供了解决命名冲突的语法支持。• 在软件架构非常复杂的情况下使用。• 在php.ini配置了auto_prepend_file的情况下 使用。• 虽不优雅但是基本完成任务。 10
  11. 11. PHP5.3特性• 命名空间• 延迟静态绑定• 闭包• SPL• 其他特性概述 11
  12. 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 self::$name; }}Dad::get_name();Son::get_name();//outputJackJack 12
  13. 13. 这就是延迟静态绑定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();//outputJackJones 13
  14. 14. 意义何在?• OO有三宝:封装、继承、多态。• 完善PHP在静态类的多态特性的实现。• 可以将更多类写成静态类。 14
  15. 15. PHP5.3特性• 命名空间• 延迟静态绑定• 闭包• SPL• 其他特性概述 15
  16. 16. 闭包• PHP 5.3.0添加此特性。• 直到PHP 5.4一直在完善。 16
  17. 17. 例子4:闭包1<?php$test = ‘Hello ’;$a = function($v) use ($test){ echo $test,$v,PHP_EOL;};$a(‘world1’);$a(‘world2’);//outputHello world1!Hello world2! 17
  18. 18. 例子5:闭包2<?phpclass Test{}Function test(){}define(A,3434);$a = function(){ var_dump($_SERVER); var_dump(__FILE__); var_dump(A); test(); new Test;};$a(); 18
  19. 19. 例子6:闭包3<?php//5.3的时候如何引用闭包所在的对象实例Class Test{ public $name = 123; pulic function sample(){ $that = $this; $a = function()use($that){ echo $that->name; }; }} 19
  20. 20. 例子7:闭包4<?php//5.4的时候可以直接使用thisClass Test{ public $name = 123; pulic function sample(){ $a = function(){ echo $this->name; }; }} 20
  21. 21. 注意事项• 结尾的分号不可少。• use默认是传值,不是传引用。要传引用请 加&。 21
  22. 22. 闭包的价值• 提供一个更小粒度的代码重用方案• OO代码重用按范围从大到小排列: class>method>closure• 更具体的,在一个大方法内有重复代码, 就可以用闭包来解决。 22
  23. 23. PHP5.3特性• 命名空间• 延迟静态绑定• 闭包• SPL• 其他特性概述 23
  24. 24. SPL• 全称:Standard PHP Library• 它提供了:迭代器、异常、数组重载、文 件处理等。• 这是个宝藏,你值得拥有。 24
  25. 25. 三个代表• SplFileInfo• SplFixedArray• spl_autoload_register 25
  26. 26. SplFileInfo<?php$info = new SplFileInfo(‘/home/example.php);if ($info->isFile()) { echo $info->getRealPath(); echo $info->getFilename();} 26
  27. 27. SplFixedArray• 指定长度的数组。• 相比array()更快。<?php$array = new SplFixedArray(5);$array[1] = 2;echo $array->count(); 27
  28. 28. spl_autoload_register• 可以注册多个自动载入函数。• 支持导入类的方式。<?phpspl_autoload_regiter(‘load_util’);spl_autoload_regiter(‘load_model’);Spl_autoload_regiter(array(‘loader’,’util’));Spl_autoload_regiter(array(‘loader’,’model’)); 28
  29. 29. PHP5.3特性• 命名空间• 延迟静态绑定• 闭包• SPL• 其他特性概述 29
  30. 30. 其他特性概述• 增加goto语法。• php.ini支持[HOST=]、[PATH=]设置。• 增加__DIR__魔术常量。 30
  31. 31. 告一段落To be continued… … 31
  32. 32. PHP5.4特性• 奇怪的Traits• 获得文件上传进度的支持• 小清新特性若干 32
  33. 33. PHP5.4特性• 奇怪的Traits• 获得文件上传进度的支持• 小清新特性若干 33
  34. 34. 什么是Traits?• 看起来像类,但不是类。• 不是接口,但可以多个共存。• 不能独立使用,只能依附于类。• 不可继承。• 不能实现接口。 34
  35. 35. 例子8:traits1<?phptrait Debug{ public $debug_power = 1; public function back_trace(){ //some code }}class Sample{ use Debug;} 35
  36. 36. 例子9:traits2<?phpclass Sample{ use Debug,Logger;} 36
  37. 37. 例子10:traits3<?phpclass Sample{ use Debug,Logger{ Logger::log instead of Debug; }} 37
  38. 38. 例子11:traits4<?phpclass Sample{ use Debug,Logger{ Logger::log instead of Debug; Debug::log as dlog; }} 38
  39. 39. 例子15:traits5<?phptrait HelloWorld { public function sayHello() { echo Hello World!; }}class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo Hello Universe!; }}$o = new TheWorldIsNotEnough();$o->sayHello();//outputHello Universe 39
  40. 40. 语法补充• 可以有静态成员。• 可以有抽象方法。• 新增函数:trait_exists• 暂不支持autoload 40
  41. 41. 价值挖掘• 新的代码重用方式。• 多继承的另类替代方案。• 相比类耦合更简单。• 相比函数表达能力更强。• 天生就是好拦截器。 41
  42. 42. 适合的应用场景AuthenticationCachingError handlingLazy loadingDebugingLogging…… 42
  43. 43. PHP5.4特性• 奇怪的Traits• 获得文件上传进度的支持• 小清新特性若干 43
  44. 44. 过去如何获得?• Flash(SWFUpload)• APC(PECL)• Upload progress(PECL) 44
  45. 45. PHP5.4提供原生支持• 用session提供上传进度信息• 需要设置php.ini 45
  46. 46. 配置项;是否开启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
  47. 47. 获取方式$_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
  48. 48. PHP5.4特性• 奇怪的Traits• 获得文件上传进度的支持• 小清新特性若干 48
  49. 49. 哪些小清新?• 数组:$a = array() VS $a = []• 闭包内直接使用$this• $obj->get_array()[12];• (new User())->get_user_info(); 49
  50. 50. 又告一段落To be continued too! 50
  51. 51. 跨两个版本的变化• use 关键字的作用• php-fpm 51
  52. 52. use关键字的功能1. 为闭包引入作用域内的变量。2. 导入其他命名空间。3. 引用traits。 52
  53. 53. php-fpm立志传• PHP 5.2.13——作为patch• PHP 5.3.3——混进核心扩展库。• PHP 5.4.0——Removed EXPERIMENTAL flag 经过两年多的奋斗,终于从临时工混成公务员了! 53
  54. 54. 友情提醒 2012年4月26日,PHP 5.4.1发布了。 PHP 5.4朝着稳定又迈进一步,我们应该认真做准备来迎接它了。 54
  55. 55. Thanks!

×