Maison  >  Article  >  développement back-end  >  PHP 5.3向更高版本迁移之新特性

PHP 5.3向更高版本迁移之新特性

WBOY
WBOYoriginal
2016-07-25 08:46:311006parcourir
PHP 5.4新特性

掌握

traits
trait的引入,可以扩展class的内容,使class在某种形式上实现了多重继承,更加灵活
trait不能被实例化
示例代码:
  1. trait Hello {
  2. public function sayHello() {
  3. echo 'Hello ' . "\n";
  4. }
  5. }
  6. trait World {
  7. public function sayWorld() {
  8. echo 'World' . "\n";
  9. }
  10. }
  11. class MyHelloWorld {
  12. use Hello, World;
  13. public function sayExclamationMark() {
  14. echo '!' . "\n";
  15. }
  16. }
  17. $o = new MyHelloWorld();
  18. $o->sayHello();
  19. $o->sayWorld();
  20. $o->sayExclamationMark();
复制代码

需要注意的是,trait的继承顺序:
来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法
当多个trait被同一个类使用的时候,会出现方法冲突的情况,使用关键词insteadof解决
示例代码:

  1. trait A {
  2. public function smallTalk() {
  3. echo 'a';
  4. }
  5. public function bigTalk() {
  6. echo 'A';
  7. }
  8. }
  9. trait B {
  10. public function smallTalk() {
  11. echo 'b';
  12. }
  13. public function bigTalk() {
  14. echo 'B';
  15. }
  16. }
  17. class Talker {
  18. use A, B {
  19. B::smallTalk insteadof A;
  20. A::bigTalk insteadof B;
  21. }
  22. }
  23. class Aliased_Talker {
  24. use A, B {
  25. B::smallTalk insteadof A;
  26. A::bigTalk insteadof B;
  27. B::bigTalk as talk;
  28. }
  29. }
复制代码
新增短数组语法
  1. $a = [1, 2, 3, 4];
  2. $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
复制代码
新增支持对函数返回数组的成员访问解析
  1. function foo()
  2. {
  3. return array(1,3,4,5);
  4. }
  5. $var =foo()[0];
复制代码

现在不管是否设置 short_open_tag php.ini 选项,= 将总是可用

新增在实例化时访问类成员

  1. class Test
  2. {
  3. public function foo()
  4. {
  5. //todo
  6. return 1;
  7. }
  8. }
  9. $var = (new Test)->foo();
复制代码

ps:注意括号

SESSION 扩展现在能追踪文件的 上传进度
在php.ini中配置session.upload_progress.enabled = On,
就会开启文件上传进度跟踪功能

max_input_vars 指令
在php.ini文件中,设定max_input_vars的值,
控制$_GET、$_POST 和 $_COOKIE的最大长度
降低构造哈希碰撞进行拒绝服务攻击的可能性

了解

现在闭包支持 $this 现在支持 Class::{expr}() 语法
示例代码:
  1. class Utils
  2. {
  3. public static function test1()
  4. {
  5. echo 1;
  6. }
  7. public static function test2()
  8. {
  9. echo 2;
  10. }
  11. }
  12. $m = 'test';
  13. Utils::{$m . (10-8)}();
  14. Utils::test2();
复制代码
新增二进制直接量,例如:0b001001101 PHP 5.5新特性

掌握

opcache集成在php发行包
opcache实际上是zend公司的Zend Optimizer Plus,功能类同apc
它的性能优于apc,对opcode进行了优化,关于opcache的更多信息
请移步鸟哥博客
一个关于Zend O+的小分享
因此在安装PHP的时候,编译参数一定要加上
  1. --enabled-opcache
  2. 推荐配置(php.ini)
  3. zend_extension=opcache.so
  4. opcache.enable_cli=1
  5. opcache.memory_consumption=128 //共享内存大小, 这个根据你们的需求可调
  6. opcache.interned_strings_buffer=8 //interned string的内存大小, 也可调
  7. opcache.max_accelerated_files=4000 //最大缓存的文件数目
  8. opcache.revalidate_freq=60 //60s检查一次文件更新
  9. opcache.fast_shutdown=1 //打开快速关闭, 打开这个在PHP Request Shutdown的时候,回收内存的速度会提高
  10. opcache.save_comments=0 //不保存文件/函数的注释
复制代码
生成器(Generators)
熟悉python的同学对生成器肯定不会陌生的
其功能是在函数中使用关键词yield,中断函数执行并返回一个能在foreach中使用的迭代器
这个语法应该是PHP5.5中最令人激动的特性了
下面的代码演示了生成器用法,并且做了对比,用来突出生成器的优势
  1. ini_set('memory_limit', '512M');
  2. $cmd = isset($argv[1]) ? (int)$argv[1] : 0;
  3. function xrange($start, $end, $step = 1)
  4. {
  5. if($start {
  6. if($step {
  7. throw new LogicException('step must be +ve');
  8. }
  9. for($i = $start; $i {
  10. yield $i;
  11. }
  12. }else{
  13. if($step >= 0)
  14. {
  15. throw new LogicException('step must be -ve');
  16. }
  17. for($i = $start; $i >= $end; $i = $i + $step)
  18. {
  19. yield $i;
  20. }
  21. }
  22. }
  23. if($cmd == 0)
  24. {
  25. $r = range(1, 1000000);
  26. foreach($r as $v)
  27. {
  28. if($v > 20)
  29. {
  30. break;
  31. }
  32. echo "$v\t";
  33. }
  34. $m = memory_get_usage(true);
  35. echo "\n" . $m/1014/1024 . "M\n";
  36. }else if($cmd == 1){
  37. $r = xrange(1, 1000000);
  38. foreach($r as $v)
  39. {
  40. if($v > 20)
  41. {
  42. break;
  43. }
  44. echo "$v\t";
  45. }
  46. $m = memory_get_usage(true);
  47. echo "\n" . $m / 1014 /1024 . "M\n";
  48. }else{
  49. include 'php-excel.class.php';
  50. $stime = microtime(true);
  51. if($cmd == 3)
  52. {
  53. $data = array();
  54. for($i = 0; $i {
  55. $data[] = range(1,100);
  56. }
  57. $xls = new Excel_XML();
  58. $xls->addWorksheet('test', $data);
  59. $xls->writeWorkbook('test.xls', './');
  60. }else{
  61. $data = function($n = 10000){
  62. for($i = 0; $i {
  63. yield xrange(1,100);
  64. }
  65. };
  66. $xls = new Excel_XML();
  67. $xls->addWorksheet('test', $data());
  68. $xls->writeWorkbook('test.xls', './');
  69. }
  70. $ctime = microtime(true) - $stime;
  71. $m = memory_get_usage(true);
  72. echo "\n" . $m / 1014 /1024 . "M\n";
  73. echo "cost time:" . $ctime . "s\n";
  74. }
复制代码

ps:php-excel.class.php文件内容请参考本gist
php-excel.php

新增 finally 关键字
示例代码:
  1. function getLines($file)
  2. {
  3. $f = fopen($file, 'r');
  4. try
  5. {
  6. while ($line = fgets($f))
  7. {
  8. yield $line;
  9. }
  10. } finally {
  11. fclose($f);
  12. }
  13. }
  14. foreach(getLines('finally.php') as $v)
  15. {
  16. echo $v;
  17. }
复制代码

编写代码的时候,一定要养成良好的习惯,及时的释放打开的资源

password API
password系列函数,为我们存储密码,实现了更简便安全的方式
密码的存储从明文到md5到md5+salt,到mcrpty+salt
password_hash默认使用bcrypt加密算法,自动生成salt,加密密码
示例代码
  1. $pw1 = '123456';
  2. $pwdb = password_hash($pw1, PASSWORD_DEFAULT);
  3. var_dump($pwdb) . "\n";
  4. var_dump(password_verify($pw1, $pwdb)) . "\n";
  5. $pw2 = '778920';
  6. $pwdb = password_hash($pw2, PASSWORD_DEFAULT);
  7. var_dump($pwdb) . "\n";
  8. var_dump(password_verify($pw1, $pwdb)) . "\n";
复制代码

强烈建议新应用开发密码存储使用内置password系列函数

array_column
这个函数早就应该有了
我们从数据库中取出10条记录,想要拿到这十条记录中的指定某一列,之前只能foreach了
现在只需要一个array_coulum函数搞定,这个函数实际意义很大,单独提出来讲了
示例代码:
  1. // Array representing a possible record set returned from a database
  2. $records = array(
  3. array(
  4. 'id' => 2135,
  5. 'first_name' => 'John',
  6. 'last_name' => 'Doe',
  7. ),
  8. array(
  9. 'id' => 3245,
  10. 'first_name' => 'Sally',
  11. 'last_name' => 'Smith',
  12. ),
  13. array(
  14. 'id' => 5342,
  15. 'first_name' => 'Jane',
  16. 'last_name' => 'Jones',
  17. ),
  18. array(
  19. 'id' => 5623,
  20. 'first_name' => 'Peter',
  21. 'last_name' => 'Doe',
  22. )
  23. );
  24. $first_names = array_column($records, 'first_name');
  25. print_r($first_names);
复制代码

熟悉

foreach 现在支持 list()
  1. $arr= array(
  2. array(1,2,3),
  3. array(1,2,3),
  4. array(1,2,3),
  5. );
  6. foreach($arr as list($a, $b, $c))
  7. {
  8. //todo
  9. }
复制代码

需要注意的是,遍历数组的子数组个数要一样

empty() 支持任意表达式,函数调用也可以使用empty了

了解

改进 GD
翻转支持使用新的 imageflip() 函数
高级裁剪支持使用 imagecrop() & imagecropauto() 函数
WebP 的读写分别支持使用 imagecreatefromwebp() & imagewebp()

另外PHP5.4和PHP5.5新增的function,新增的class,新增的interface,新增的全局常量还是挺多的
想了解的,可以查看下面链接
http://www.php.net/manual/zh/migration55.new-functions.php
http://www.php.net/manual/zh/migration55.classes.php
http://www.php.net/manual/zh/migration55.new-methods.php
http://www.php.net/manual/zh/migration55.global-constants.php
http://www.php.net/manual/zh/migration54.functions.php
http://www.php.net/manual/zh/migration54.classes.php
http://www.php.net/manual/zh/migration54.methods.php
http://www.php.net/manual/zh/migration54.global-constants.php

更高, 新特性, PHP


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn