PHP 5.0 到 7.1 經常使用語法糖

類型
Boolean
空對象在4.0之後都視爲true
String
string的內部結構相似 array, 能夠像python一下使用下標訪問字符串python

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

Array
5.4 之後能夠像JS同樣定義數組nginx

$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); // 輸出15
echo dosum(1,2,3,4,5,6); //輸出21spa

//TODO
/**
這個語法,我最近總在用。感受還比較簡單。不過要注意服務器版本。。最近入了一個坑。
*/

匿名函數(Anonymous functions)5.3
也叫閉包函數,在JS中很常見。爲了防止污染全局做用域。5.3 之後PHP也支持了這種寫法對象

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

若是想要從父做用域中繼承變量怎麼辦繼承

//這裏定義一個默認的輸出名字的方式
$tpl = 'My name is ';three

//使用 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 1
echo $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 能夠在調用函數的方法。用這個關鍵字,來實現了後期靜態綁定。

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

相關文章
相關標籤/搜索