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

PHP 5.4新特性

掌握php

  • traits
    trait的引入,能夠擴展class的內容,使class在某種形式上實現了多重繼承,更加靈活
    trait不能被實例化
    示例代碼:
<?php
  trait Hello {
      public function sayHello() {
              echo 'Hello ' . "\n";
          }
  }
  trait World {
      public function sayWorld() {
              echo 'World' . "\n";
          }
  }
  class MyHelloWorld {
      use Hello, World;
      public function sayExclamationMark() {
              echo '!' . "\n";
          }
  }
  $o = new MyHelloWorld();
  $o->sayHello();
  $o->sayWorld();
  $o->sayExclamationMark();

須要注意的是,trait的繼承順序:
來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法
當多個trait被同一個類使用的時候,會出現方法衝突的狀況,使用關鍵詞insteadof解決
示例代碼:html

<?php
trait A {
  public function smallTalk() {
      echo 'a';
  }
  public function bigTalk() {
      echo 'A';
  }
}
trait B {
  public function smallTalk() {
      echo 'b';
  }
  public function bigTalk() {
      echo 'B';
  }
}
class Talker {
  use A, B {
      B::smallTalk insteadof A;
      A::bigTalk insteadof B;
  }
}
class Aliased_Talker {
  use A, B {
      B::smallTalk insteadof A;
      A::bigTalk insteadof B;
      B::bigTalk as talk;
  }
}
  • 新增短數組語法
<?php
$a = [1, 2, 3, 4];
$a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
  • 新增支持對函數返回數組的成員訪問解析
<?php
function foo()
{
  return array(1,3,4,5);
}
$var =foo()[0];
  • 如今無論是否設置 short_open_tag php.ini 選項,<?= 將老是可用python

  • 新增在實例化時訪問類成員git

<?php
class Test
{
  public function foo()
  {
    //todo
    return 1;
  }
}
$var = (new Test)->foo();

ps:注意括號github

  • SESSION 擴展示在能追蹤文件的 上傳進度
    在php.ini中配置session.upload_progress.enabled = On,
    就會開啓文件上傳進度跟蹤功能web

  • max_input_vars 指令
    在php.ini文件中,設定max_input_vars的值,
    控制$_GET、$_POST 和 $_COOKIE的最大長度
    下降構造哈希碰撞進行拒絕服務攻擊的可能性算法

瞭解數據庫

  • 如今閉包支持 $this
  • 如今支持 Class::{expr}() 語法
    示例代碼:
<?php
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的時候,編譯參數必定要加上
--enabled-opcache     
推薦配置(php.ini)
zend_extension=opcache.so
opcache.enable_cli=1
opcache.memory_consumption=128      //共享內存大小, 這個根據大家的需求可調
opcache.interned_strings_buffer=8   //interned string的內存大小, 也可調
opcache.max_accelerated_files=4000  //最大緩存的文件數目
opcache.revalidate_freq=60          //60s檢查一次文件更新
opcache.fast_shutdown=1             //打開快速關閉, 打開這個在PHP Request Shutdown的時候,回收內存的速度會提升
opcache.save_comments=0             //不保存文件/函數的註釋
  • 生成器(Generators)
    熟悉python的同窗對生成器確定不會陌生的
    其功能是在函數中使用關鍵詞yield,中斷函數執行並返回一個能在foreach中使用的迭代器
    這個語法應該是PHP5.5中最使人激動的特性了
    下面的代碼演示了生成器用法,而且作了對比,用來突出生成器的優點
<?php
ini_set('memory_limit', '512M');
$cmd = isset($argv[1]) ? (int)$argv[1] : 0;

function xrange($start, $end, $step = 1)
{
  if($start <= $end)
  {
      if($step <= 0)
      {
          throw new LogicException('step must be +ve');
      }
      for($i = $start; $i <= $end; $i = $i + $step)
      {
          yield $i;
      }
  }else{
      if($step >= 0)
      {
          throw new LogicException('step must be -ve');
      }
      for($i = $start; $i >= $end; $i = $i + $step)
      {
          yield $i;
      }
  }
}

if($cmd == 0)
{
  $r = range(1, 1000000);
  foreach($r as $v)
  {
      if($v > 20)
      {
          break;
      }
      echo "$v\t";
  }
  $m = memory_get_usage(true);
  echo "\n" . $m/1014/1024 . "M\n";
}else if($cmd == 1){
  $r = xrange(1, 1000000);
  foreach($r as $v)
  {
      if($v > 20)
      {
          break;
      }
      echo "$v\t";
  }
  $m = memory_get_usage(true);
  echo "\n" . $m / 1014 /1024 . "M\n";
}else{
  include 'php-excel.class.php';
  $stime = microtime(true);
  if($cmd == 3)
  {
      $data = array();
      for($i = 0; $i < 10000;$i++)
      {
          $data[] = range(1,100);
      }
      $xls = new Excel_XML();
      $xls->addWorksheet('test', $data);
      $xls->writeWorkbook('test.xls', './');
  }else{
      $data = function($n = 10000){
          for($i = 0; $i < $n; $i++)
          {
              yield xrange(1,100);
          }
      };
      $xls = new Excel_XML();
      $xls->addWorksheet('test', $data());
      $xls->writeWorkbook('test.xls', './');
  }
  $ctime = microtime(true) - $stime;
  $m = memory_get_usage(true);
  echo "\n" . $m / 1014 /1024 . "M\n";
  echo "cost time:" . $ctime . "s\n";
}

ps:php-excel.class.php文件內容請參考本gist
php-excel.php緩存

  • 新增 finally 關鍵字
    示例代碼:
<?php
function getLines($file) 
{
  $f = fopen($file, 'r');
  try 
  {
      while ($line = fgets($f))
      {
          yield $line;
      }
  } finally {
      fclose($f);
  }
}
foreach(getLines('finally.php') as $v)
{
  echo $v;
}

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

  • password API
    password系列函數,爲咱們存儲密碼,實現了更簡便安全的方式
    密碼的存儲從明文到md5到md5+salt,到mcrpty+salt
    password_hash默認使用bcrypt加密算法,自動生成salt,加密密碼
    示例代碼
<?php
$pw1 = '123456';
$pwdb = password_hash($pw1, PASSWORD_DEFAULT);
var_dump($pwdb) . "\n";
var_dump(password_verify($pw1, $pwdb)) . "\n";
$pw2 = '778920';
$pwdb = password_hash($pw2, PASSWORD_DEFAULT);
var_dump($pwdb) . "\n";
var_dump(password_verify($pw1, $pwdb)) . "\n";

強烈建議新應用開發密碼存儲使用內置password系列函數

  • array_column
    這個函數早就應該有了
    咱們從數據庫中取出10條記錄,想要拿到這十條記錄中的指定某一列,以前只能foreach了
    如今只須要一個array_coulum函數搞定,這個函數實際意義很大,單獨提出來說了
    示例代碼:
<?php
// Array representing a possible record set returned from a database
$records = array(
  array(
      'id' => 2135,
      'first_name' => 'John',
      'last_name' => 'Doe',
  ),
  array(
      'id' => 3245,
      'first_name' => 'Sally',
      'last_name' => 'Smith',
  ),
  array(
      'id' => 5342,
      'first_name' => 'Jane',
      'last_name' => 'Jones',
  ),
  array(
      'id' => 5623,
      'first_name' => 'Peter',
      'last_name' => 'Doe',
  )
);
$first_names = array_column($records, 'first_name');
print_r($first_names);

熟悉

  • foreach 如今支持 list()
<?php
$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

相關文章
相關標籤/搜索