PHP7新特性

PHP7新特性

  1. 特性一:
    
    //----------php5.0+ 版本 運行效果
    //代碼一
    $a = array(1,2,3);
    foreach($a as $v){
        
        var_dump(current($a);
    }
    
    //result: int 2,int 2,int 2
    
    // 代碼二
    $a = array(1,2,3);
    $b = $a;
    foreach($a as $v){
        var_dump(current($a));
    }
    
    // result: int 1,int 1,int 1
    
    // 代碼三
    $a = array(1,2,3);
    $b = &$a;
    foreach($a as $v){
        var_dump(current($a));
    }
    
    // result:int 2,int 3,bool false
    
    // 原因迭代器foreach會干涉到變量$a的指針
    
    //-------以上三段代碼在php7.0的運行效果都爲
    // result: int 1,int 1,int 1
    // 在php7中迭代器不會影響變量的指針。
  1. 特性二,新操作符 <=>,比較兩個值得大小

$a <=> $b; 
// 相當於 $a > $b ? 1 : ($a < $b ? -1 : 0);
  1. 異常捕獲 Throwable
try {
    $a = new A();
} catch (Throwable $e) {
    print_r($e);
    echo $e->getLine() . PHP_EOL;
    echo $e->getFile() . PHP_EOL;
    echo $e->getMessage();
}


// 輸出
Error Object
(
    [message:protected] => Class 'A' not found
    [string:Error:private] => 
    [code:protected] => 0
    [file:protected] => /Users/fym/Documents/code/php/miaosha/test.php
    [line:protected] => 4
    [trace:Error:private] => Array
        (
        )

    [previous:Error:private] => 
)
4
/Users/fym/Documents/code/php/miaosha/test.php
Class 'A' not found
  1. register_shutdown_function() 註冊終止函數
    • 註冊終止函數, 在程序執行完畢, 發生異常退出時會執行這裏註冊的函數。
class Test
{

    function abort() {

        echo '這是終止方法' . PHP_EOL;

        if(error_get_last()) {
            // error_log('1232');
            print_r(error_get_last());
        }

        echo 'abort after' . PHP_EOL;
    }

}

function abort() {

    echo '這是終止函數' . PHP_EOL;
}
// 註冊函數
register_shutdown_function('abort');
// 註冊類的方法
register_shutdown_function([new Test, 'abort']);

$a = new A();

echo 'hello world' . PHP_EOL;
  1. spl_autoload_register() 類的自動加載,php5.3就有了
    • 先使用該函數註冊加載方法,該方法會傳入類名
    • 當程序中使用沒有導入的類時,php會自動調用註冊的方法加載類
    • 當使用use引入的類時, 類名就是use後面的路徑,導入文件時需要把反斜槓轉換爲斜槓。
    • 可以多次調用該函數註冊多個加載器,多個加載器會依次執行,知道找到類文件,否則觸發報錯機制
    • 自定義拋出的異常可以使用try-catch捕獲, 如果不自定義異常,系統拋出的異常則不能被捕獲。
        define('ROOT_PATH', './');
        spl_autoload_register(function($class_name){
            
            $path = ROOT_PATH . $class_name . '.php';
            if(is_file($path)) {
                require $path;
            } else {
                throw new Exception("class name not found: {$class_name}");
            }
        });
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章