PHP7 新特性學習

PHP7新特性

  • 隨機整數或者字節 
    random_int() 
    random_bytes() 
    當隨機的熵不夠的時候會拋出異常,能夠根據異常自定一些處理。php

    try {
    $bytes = random_bytes(42);
    } catch (Exception $e) {
    $cryptoStrong = false;
    $bytes = openssl_random_pseudo_bytes(42, $cryptoStrong);
    }
  • 在php7 中引入了新的exception 類,不是原來的 Exception 是繼承 BasicEception的新異常類,主要有三種類 EngineException, TypeException 和 ParseException. 分別是引擎異常,類型異常, 解析異常。能夠捕獲系統的致命錯誤,能夠進行錯誤恢復。
function add(int $left, int $right) {
return $left + $right;
}
try {
echo add('left', 'right');
} catch (Exception $e) {
// Handle exception
} catch (TypeException $e) {
// Appears to descend from Exception
// Log error and end gracefully
}
  • php7 加入了對一些敏感詞的支持,容許使用部分敏感詞作方法名。
  • php7 加入新的方法 preg_replace_callback_array function 能夠根據匹配到的結果進行特殊處理
$code = preg_replace_callback_array(
array(
"/EXECUTE_DATA/m" =>
function($matches) {
return "execute_data";
},
"/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m" =>
function($matches) use ($spec, $prefix, $op1, $op2) {
return "return " . $matches[1] . ($spec?"_SPEC":"") . $prefix[$op1] . $prefix[$op2] . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)";
},
"/ZEND_VM_DISPATCH_TO_HELPER\(\s*([A-Za-z_]*)\s*\)/m" =>
function($matches) use ($spec, $prefix, $op1, $op2) {
return "return " . helper_name($matches[1], $spec, $op1, $op2) . "(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)";
},
"/ZEND_VM_DISPATCH_TO_HELPER_EX\(\s*([A-Za-z_]*)\s*,\s*[A-Za-z_]*\s*,\s*(.*)\s*\);/m" =>
function($matches) use ($spec, $prefix, $op1, $op2) {
return "return " . helper_name($matches[1], $spec, $op1, $op2) . "(" . $matches[2]. ", ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);";
},
), $code);
  • 增長用戶生成密碼的東西(沒看懂,不知道幹什麼用得)
  • 匿名類的支持
  • 代理生成器 yield from expr 高端弄不懂,大概的意思就是能夠是程序從某個地方斷開去相應的地方取執行,執行完畢在返回。
  • 預留了更多的類型 這些類型不能用做 類名,接口名以及特徵名,一邊未來向下兼容性。 
    • int
    • float
    • bool
    • string
    • true,false
    • null
  • 從新定義了一些Notice 錯誤提示
  • 類型中方法與類重名,會錯誤提示notice 由於php8 可能會去掉這個特性,建議都用__construct。
  • 去除了date.timezone 警告
  • 加入新的比較方法 <=> 
    • 左邊大於右邊返回1
    • 左邊小於右邊返回-1
    • 相等返回0
  • 修復了foreach的一些詭異現象好比
php -r '$a = [1,2,3]; foreach($a as $v) {echo $v . " - " . current($a) . "\n";}'
  • 移除了一些擴展
  • 利用Jsond 替換了當前使用的Json
  • Json 解析加入新的參數 JSON_PRESERVE_ZERO_FRACTION 不會將特定類型的數據轉換好比 10.0 轉換成 int 10 .
echo json_encode(10.0); // Output 10
echo json_encode(10.1); // Output 10.1
echo json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION); // Output 10.0
echo json_encode(10.1, JSON_PRESERVE_ZERO_FRACTION); // Output 10.1
var_dump(json_decode(json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION))); // Output double(10)
var_dump(10.0 === json_decode(json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION))); // Output bool(true)
  • 增長函數返回類型設置
  • 添加參數快速解析api 提升了內部方法的參數解析速度
  • 支持對unicode 解析
  • PHP RFC: Native TLS (這個特性又沒看懂,弱弱的感受)
  • 加入了新的操做符 ?? 至關於三目運算 ? : 根據null來判斷
$username = $_GET['user'] ?? 'nobody';
  • 整數的語義有些變化,是爲了支持大整數型 
    • 無論任何平臺都將NaN認定爲0
    • 不容許未操做負數
    • 位左移超出大小返回0
    • 位右移超出大小返回0 或者 -1
  • 在類型轉換過程當中出現float 轉到int 是出現超出邊際失敗提醒
  • 將phpng 分支移動到主分支(鳥哥分支)
  • 抽象語法樹 (不懂求科普)
  • 統一變量解析
  • 提升字符串和整型64位支持
  • Closure::call(又不懂了)
  • 修復list 方法出現的bug list 對字符串無效可是有時會生效
$ php -r 'list($a,$b) = "aa";var_dump($a,$b);'
NULL
NULL
$ php -r '$a[0]="ab"; list($a,$b) = $a[0]; var_dump($a,$b);'
string(1) "a"
string(1) "b"
  • 移除php邊際標籤 
    • <%
    • <%=
    • %> closing tag
    • (<script\s+language\s*=\s*(php|"php"|'php')\s*>)i opening tag
    • ()i closing tag
  • 在switch 中使用多個默認值,會報語法錯誤
  • 捕獲 「call to a member function of a non-object」錯誤能夠利用set_error_handler進行錯誤消息捕獲來搞些事情
set_error_handler(function($code, $message) {
var_dump($code, $message);
});

$x= null;
var_dump($x->method());
echo "Alive\n";
  • unserialize() 反序列化是進行過濾
//反序列全部的東西
$data = unserialize($foo);
//反序列化全部對象
$data = unserialize($foo, false);
//反序列化除了這兩個對象之外的
$data = unserialize($foo, array("MyClass", "MyClass2"));
  • IntlChar class (不懂,大神在哪)
  • session_start() 能夠傳入數組進行對session配置 
    • read_only 只讀,讀取後馬上關閉
    • lazy_write 懶寫入等session 更新後自動更新 經過對MD5加密後的結果進行對比查看是否更新
    • unsafe_lock 安全鎖機制,讀取或者寫入時會上鎖
    • lazy_destroy 懶銷燬
  • 去除對16進制 數字和字符串的支持
  • 命名空間組的概念
// Current use syntax:

use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion as Choice;
use Symfony\Component\Console\Question\ConfirmationQuestion;

// Proposed group use syntax:

use Symfony\Component\Console\{
Helper\Table,
Input\ArrayInput,
Input\InputInterface,
Output\NullOutput,
Output\OutputInterface,
Question\Question,
Question\ChoiceQuestion as Choice,
Question\ConfirmationQuestion,
};
  • 斷言捕獲我的認爲試用調試代碼
  • 能夠捕獲引擎的致命錯誤以下
function call_method($obj) {
$obj->method();
}
try {
call_method(null); // oops!
} catch (EngineException $e) {
echo "Exception: {$e->getMessage()}\n";
}
  • 生成器返回表達式 不會用
  • 類型聲明
  • Continue output buffering despite aborted connection(不懂啊)
  • 加入新的符號整除 %%
echo 3%%2;
//輸出1
  • 加入 gc_collect_cycles 變爲一個能夠設置鉤子的指針函數,有利於對垃圾回收的統計
相關文章
相關標籤/搜索