首頁 > 後端開發 > php教程 > PHP 5.3往更高版本遷移之新特性

PHP 5.3往更高版本遷移之新特性

WBOY
發布: 2016-07-25 08:46:31
原創
1085 人瀏覽過
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; 🎜> public function sayExclamationMark() {
  13. echo '!' . "n";
  14. }
  15. }
  16. $o = new MyHelloWorld();
  17. $o->sayHello();
  18. $o->sayWorld();
  19. $o->sayExclamationMark();
複製程式碼
要注意的是,trait的繼承順序:


來自目前類別的成員覆寫了 trait 的方法,而 trait 則覆寫了被繼承的方法 當多個trait被同一個類別使用的時候,會出現方法衝突的情況,使用關鍵字insteadof解決
範例程式碼:

    trait A {
  1. public function smallTalk() {
  2. echo 'a';
  3. }
  4. public function bigTalk() {
  5. echo 'A';
  6. }
  7. }
  8. trait B {
  9. public function smallTalk() {
  10. echo 'b';
  11. }
  12. () {
  13. echo 'B';
  14. }
  15. }
  16. class Talker {
  17. use A, B {
  18. B::smallTalk insteadof A;
  19. A::bigTalk insteadof B;
  20. }
  21. }
  22. class Aliased_Talker {
  23. use A, B {
  24. B::smallTalk insteadof A;
  25. A::bigTalk insteadof B;
  26. B: :bigTalk as talk;
  27. }
  28. }
複製程式碼
新增短數組語法
    $a = [1, 2, 3, 4];
  1. $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
複製程式碼
新增支援對函數傳回陣列的成員存取解析
    function foo()
  1. {
  2. return array(1,3,4,5);
  3. }
  4. $var =foo()[0];
複製程式碼

現在不管是否設定 short_open_tag php.ini 選項,= 將總是可用= 将总是可用

新增在實例化時存取類別成員

    class Test
  1. {
  2. public function foo()
  3. {
  4. //todo
  5. return 1;
  6. {
  7. //todo
  8. return 1;
  9. {
  10. //todo
return 1;
{ //todo return 1;
{

//todo

return 1;

{ //todo return 1;
{
//todo

1; }

}$var = (new Test)->foo();


複製程式碼

ps:注意括號

SESSION 擴充現在能追蹤檔案的 上傳進度
在php.ini配置session.upload_progress.enabled = On, 就會開啟檔案上傳進度追蹤功能
max_input_vars 指令
在php.ini檔案中,設定max_input_vars的值,
    控制$_GET、$_POST 和 $_COOKIE的最大長度
  1. 降低構造哈希碰撞進行拒絕服務攻擊的可能性
  2. 了解
  3. 現在閉包支援 $this
  4. 現在支援 Class::{expr}() 語法
  5. 範例程式碼:
class Utils{ public static function test1()
{ echo 1; } } public static function test2() { echo 2; }}$m = 'test';Utils::{$m . (10-8)} ();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. opcachememory_pache. 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 "$vt";
  33. }
  34. $m = memory_getget_usage( true);
  35. echo "n" . $m/1014/1024 . "Mn";
  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 "$vt";
  45. }
  46. $m = memory_get_usage(true);
  47. echo "n" . $m / 1014 /1024 . "Mn";
  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 . "Mn";
  73. echo "cost time:" . $ctime . "sn" ;
  74. }
複製程式碼

ps:php-excel.class.php檔案內容請參考本gist
php-excel.php

新增 finally 關鍵字
範例程式碼:
  1. function getLines($file)
  2. {
  3. $f = fopen($file, 'r');
  4. try
  5. $f = fopen($file, 'r');
  6. try
  7. {
  8. while ($line = fgets($f))
  9. {
  10. yield $line;
  11. }
  12. } finally {
  13. fclose($f);
  14. }
  15. }
  16. foreach(getLines('finally.php') as $v)
  17. {
  18. echo $v;
}
複製程式碼

編寫程式碼的時候,一定要養成良好的習慣,及時的釋放打開的資源

password API
password系列函數,為我們儲存密碼,實現了更簡單安全的方式
密碼的儲存從明文到md5到md5 salt,到mcrpty salt
password_hash預設使用bcrypt加密演算法,自動產生salt,加密密碼
範例程式碼
  1. $pw1 = '123456';
  2. $pwdb = password_hash($pw1, PASSWORD_DEFAULT);
  3. ";
  4. var_dump(password_verify($pw1, $pwdb)) . "n";
  5. $pw2 = '778920';
  6. $pwdb = password_hash($pw2, PASSWORD_DEFAULT);var_dump(password_verify($pw1, $pwdb)) . "n";
複製程式碼

複製程式碼


複製程式碼


複製程式碼
  1. 複製程式碼
  2. 強烈建議新應用開發密碼儲存使用內建password系列函數
  3. array_column
  4. 這個函數早就應該有了
  5. 我們從資料庫中取出10筆記錄,想要拿到這十筆記錄中的指定某一列,之前只能foreach了
  6. 現在只需要一個array_coulum函數搞定,這個函數實際意義很大,單獨提出來講了
  7. 範例程式碼:
  8. // Array representing a possible record set returned from a database
  9. $records = array(
  10. array(
  11. '$records = array(
  12. array(
  13. '$record' > 2135,
  14. 'first_name' => 'John',
  15. 'last_name' => 'Doe',
  16. ),
  17. array(
  18. 'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith', ), array(
'id' => 5342,
'first_name' => 'id' => 5342,

'first_name' => 'id' => 5342, 'first_name' => 'id' => 5342, 'first_name' => 'id' => 5342,

'first_name' => 'id' => 5342,
'first_name' => 'id' => 'id Jane', 'last_name' => 'Jones', ),
array(
'id' => 5623,
    'first_name' => 'Peter',
  1. 'last_name' => 'Doe',
  2. )
  3. );
  4. $first_names = array_column($records, 'first_name');
  5. print_r($first_names);
  6. 複製程式碼
熟悉

foreach 現在支援 list()

$arr= array( array(1,2,3),

array(1,2,3),
array(1,2,3),);foreach($arr as list($a, $b, $c))
{
//todo
}



複製程式碼


要注意的是,遍歷數組的子數組個數要一樣

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
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板