课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 1,479 views

 

Statistics

Views

Total Views
1,479
Views on SlideShare
1,479
Embed Views
0

Actions

Likes
0
Downloads
3
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 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<?phpnamespace test;class Sample{ //some code}?><?phpnamespace test1;class Sample{ //some code}?> 7
  • 例子2:命名空间2<?phpuse test;use test1 as t1;$obj1 = new testSample();$obj2 = new t1Sample(); 8
  • 例子3:命名空间3<?phpnamespace 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();//outputJackJack 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();//outputJackJones 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’);//outputHello world1!Hello world2! 17
  • 例子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
  • 例子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的时候可以直接使用thisClass 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• 可以注册多个自动载入函数。• 支持导入类的方式。<?phpspl_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<?phptrait Debug{ public $debug_power = 1; public function back_trace(){ //some code }}class Sample{ use Debug;} 35
  • 例子9:traits2<?phpclass Sample{ use Debug,Logger;} 36
  • 例子10:traits3<?phpclass Sample{ use Debug,Logger{ Logger::log instead of Debug; }} 37
  • 例子11:traits4<?phpclass Sample{ use Debug,Logger{ Logger::log instead of Debug; Debug::log as dlog; }} 38
  • 例子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
  • 语法补充• 可以有静态成员。• 可以有抽象方法。• 新增函数:trait_exists• 暂不支持autoload 40
  • 价值挖掘• 新的代码重用方式。• 多继承的另类替代方案。• 相比类耦合更简单。• 相比函数表达能力更强。• 天生就是好拦截器。 41
  • 适合的应用场景AuthenticationCachingError handlingLazy loadingDebugingLogging…… 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!