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; //抛出异常

相关文章
相关标签/搜索