PHP 5.0 到 7.1 常用語法糖(個人整理)


PHP更新了這久了,一隻也沒有來鞏固一下基本語法。最近抽了點時間梳理了一下php版本的差異。自己記錄一下,同時也分享出來 大家一起學習探討一下

類型

Boolean
  • 空對象在4.0以後都視爲true

String
  • string的內部結構類似 array, 可以像python一下使用下標訪問字符串

        $str = '012345';    echo $str[1];  //1
        echo $str{2};  //2
    • 1

    • 2

    • 3

Array
  • 5.4 以後可以像JS一樣定義數組

        $arr = ['one', 'two', 'three']; //感覺方便了很多
    • 1

    • 2

全局變量

時間長不用總會忘記重新整理一下加深下印象12
$_SERVER
  • SERVER_ADDR IP地址 127.0.0.1

  • SERVER_NAME 主機名 localhost

  • SERVER_SOFTWARE 服務器類型 nginx

  • REMOTE_ADDR 客戶端IP. 127.0.0.1 
    s

$_FILES
  • $_FILES['file']['name'] 圖片原名稱

  • $_FILES['file']['type'] 圖片MIME類型

  • $_FILES['file']['size'] 圖片大小

  • $_FILES['file']['tmp_name'] 服務器端臨時名稱

常量
  • 5.3之後可以使用const來定義常量

const DEBUG = true;12
運算符
  • <=> 比較運算符,7.0 之後支持

echo  $a <=> $b;/*
當 $a < $b 時, 表達式返回 -1
當 $a = $b 時, 表達是返回 0
當 $a > $b 時, 表達式返回  1
*/123456
  • ?? 空合併運算符 PHP7特性。

$name = $_POST['name'] ?? '';  //如果前面的值不爲null,則返回本身,否則返回後面的值1
  • 三元運算符 ?: 5.3以後可以使用

$name = $_POST['name'] ?: ''; ////如果前面的值不爲null,則返回本身,否則返回後面的值1
流程控制
  • goto 5.3以上有效

操作符可以用來跳轉到程序中的另一位置。該目標位置可以用目標名稱加上冒號來標記,而跳轉指令是 goto 之後接上目標位置的標記。PHP 中的 goto 有一定限制,目標位置只能位於同一個文件和作用域,也就是說無法跳出一個函數或類方法,也無法跳入到另一個函數。也無法跳入到任何循環或者 switch 結構中。可以跳出循環或者 switch,通常的用法是用 goto 代替多層的 break。

goto a;echo 'Foo';

a:echo 'Bar';//輸出 Bar1234567
函數
  • 變長參數 ..., 5.6以後可用

function dosum(...$arr){
    $sum = 0;    foreach($arr as $v){        $sum += $v;
    }    return $sum;
}$arr = [1, 2, 3, 4, 5];echo dosum(...$arr);   // 輸出15echo dosum(1,2,3,4,5,6); //輸出21//TODO/**
這個語法,我最近總在用。感覺還比較簡單。不過要注意服務器版本。。最近入了一個坑。
*/12345678910111213141516
  • 匿名函數(Anonymous functions)5.3

也叫閉包函數,在JS中很常見。爲了防止污染全局作用域。5.3 以後PHP也支持了這種寫法

$test = function($name='Li'){
    echo 'My name is '.$name;
};$test();1234

如果想要從父作用域中繼承變量怎麼辦

//這裏定義一個默認的輸出名字的方式$tpl = 'My name is ';//使用 use() 來引用父級的變量,最後輸出結果與上邊一致 $test = function($name='Li') use($tpl) {
    echo $tpl.$name;
};$test();12345678

需要注意的是,閉包函數的父作用域,是定義它的作用域,不是調用的作用域

類和對象

  • ::class 類的靜態方法,用於獲取類的完全限定名稱,(包含命名空間)

namespace Foo{    class test{

    }    echo test::class; // 輸出 FOO\test, 在使用命名空間的情況非常有用}123456
  • 5.4 新增加的一個多繼承實現方式trait。下面總結了一下基本概念

1.trait 和 class 是相似的概念,但不能被實例化 
2.一個類可以使用多個trait,優先級是 class > trait > 父類繼承的方法 
3.使用insteadof 來解決 tarit 衝突 
4.使用as,來修改方法的訪問控制 
5.在trait中也可以使用tarit。和在class中用法一致

trait A {    public function say(){
        echo 'trait  A';
    }
}trait B {    public function say(){
        echo 'trait B';
    }    public function walk(){
        echo 'walk B';
    }
}class Person {
    use A, B{        B :: say insteadof A; // 使用B的say方法代替了A的say方法
        walk as protected;    // 將walk 設置爲受保護的
    }


}$obj = new Person;$obj->say();  // echo trait A;$obj->walk(); // 提示不能訪問一個受保護的方法1234567891011121314151617181920212223242526272829

6.在trait中使用, 屬性、靜態屬性、靜態方法、抽象類都是被允許的。

trait Test {    public static $obj;    public $name = 1;    static function createObj(){
        return empty(self::$obj) ? new self : self::$obj;
    }
}class son {
    use Test;
}$obj = son::createObj();echo $obj->name;  // echo 1echo $obj === $obj1 ? 0 : 1; // echo 1123456789101112131415



  • 5.3 類的後期靜態綁定 
    官方的解釋是: 


該功能從語言內部角度考慮被命名爲”後期靜態綁定”。”後期綁定”的意思是說,static:: 不再被解析爲定義當前方法所在的類,而是在實際運行時計算的。也可以稱之爲”靜態綁定”,因爲它可以用於(但不限於)靜態方法的調用 
乍一看,好像什麼也沒看懂。看看具體的代碼吧。
class A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        self::who();
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}
B::test(); // echo A;// 上面是一個正常的調用, 輸出了 A// 當我們把 class A 的 test 方法修改一下。 將 self 改成 static 後class A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        static::who();
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}
B::test(); // echo B;123456789101112131415161718192021222324252627282930313233343536

總結:PHP5.3新增加了一類關鍵字,static 可以在調用函數的方法。用這個關鍵字,來實現了後期靜態綁定

異常處理

比較簡單記錄一下12
try{    throw new Execption('拋出異常');
} catch (Execption $e){    //獲取異常
    $error = $e->getMessage();
}echo $error;  //拋出異常


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章