PHP更新了這久了,一隻也沒有來鞏固一下基本語法。最近抽了點時間梳理了一下php版本的差異。自己記錄一下,同時也分享出來 大家一起學習探討一下
類型
Boolean
String
Array
全局變量
時間長不用總會忘記重新整理一下加深下印象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']
服務器端臨時名稱
常量
const DEBUG = true;12
運算符
echo $a <=> $b;/*
當 $a < $b 時, 表達式返回 -1
當 $a = $b 時, 表達是返回 0
當 $a > $b 時, 表達式返回 1
*/123456
$name = $_POST['name'] ?? ''; //如果前面的值不爲null,則返回本身,否則返回後面的值1
$name = $_POST['name'] ?: ''; ////如果前面的值不爲null,則返回本身,否則返回後面的值1
流程控制
操作符可以用來跳轉到程序中的另一位置。該目標位置可以用目標名稱加上冒號來標記,而跳轉指令是 goto 之後接上目標位置的標記。PHP 中的 goto 有一定限制,目標位置只能位於同一個文件和作用域,也就是說無法跳出一個函數或類方法,也無法跳入到另一個函數。也無法跳入到任何循環或者 switch 結構中。可以跳出循環或者 switch,通常的用法是用 goto 代替多層的 break。
goto a;echo 'Foo';
a:echo 'Bar';//輸出 Bar1234567
函數
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
也叫閉包函數,在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
需要注意的是,閉包函數的父作用域,是定義它的作用域,不是調用的作用域
類和對象
namespace Foo{ class test{
} echo test::class; // 輸出 FOO\test, 在使用命名空間的情況非常有用}123456
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
該功能從語言內部角度考慮被命名爲”後期靜態綁定”。”後期綁定”的意思是說,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; //拋出異常