PHP 5.0 到 7.1 常用文法糖

來源:互聯網
上載者:User
在電腦科學中,文法糖(syntactic sugar)是指程式設計語言中可以更容易的表達一個操作的文法,它可以使程式員更加容易去使用這門語言:操作可以變得更加清晰、方便,或者更加符合程式員的編程習慣。

類型

Boolean
  • Null 物件在4.0以後都視為true

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

        $str = '012345';    echo $str[1];  //1    echo $str{2};  //2
Array
  • 5.4 以後可以像JS一樣定義數組

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

全域變數

時間長不用總會忘記重新整理一下加深下印象
$_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;
運算子
  • <=> 比較子,7.0 之後支援

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

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

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

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

goto a;echo 'Foo';a:echo 'Bar';//輸出 Bar
函數
  • 變長參數 ...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/**這個文法,我最近總在用。感覺還比較簡單。不過要注意伺服器版本。。最近入了一個坑。*/
  • 匿名函數(Anonymous functions)5.3

也叫閉包函數,在JS中很常見。為了防止汙染全域範圍。5.3 以後PHP也支援了這種寫法

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

如果想要從父範圍中繼承變數怎麼辦

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

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

類和對象

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

namespace Foo{    class test{    }    echo test::class; // 輸出 FOO\test, 在使用命名空間的情況非常有用}
  • 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(); // 提示不能訪問一個受保護的方法

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 1



  • 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;

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

異常處理

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.