php语法糖
2020年11月18日PHP更新了这久了,一只也没有来巩固一下基本语法。最近抽了点时间梳理了一下php版本的差异。自己记录一下,同时也分享出来 大家一起学习探讨一下
类型
Boolean
- 空对象在
4.0以后都视为true
String
string的内部结构类似array, 可以像python一下使用下标访问字符串
123<span class="hljs-variable">$str</span> = <span class="hljs-string">'012345'</span>;<span class="hljs-keyword">echo</span> <span class="hljs-variable">$str</span>[<span class="hljs-number">1</span>]; <span class="hljs-comment">//1</span><span class="hljs-keyword">echo</span> <span class="hljs-variable">$str</span>{<span class="hljs-number">2</span>}; <span class="hljs-comment">//2</span>
Array
5.4以后可以像JS一样定义数组
1<span class="hljs-variable">$arr</span> = [<span class="hljs-string">'one'</span>, <span class="hljs-string">'two'</span>, <span class="hljs-string">'three'</span>]; <span class="hljs-comment">//感觉方便了很多</span>
全局变量
|
1 |
时间长不用总会忘记重新整理一下加深下印象 |
$_SERVER
SERVER_ADDRIP地址 127.0.0.1SERVER_NAME主机名 localhostSERVER_SOFTWARE服务器类型 nginxREMOTE_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来定义常量
|
1 |
<span class="hljs-keyword">const</span> DEBUG = <span class="hljs-keyword">true</span>; |
运算符
<=>比较运算符,7.0之后支持
|
1 2 3 4 5 6 |
<span class="hljs-keyword">echo</span> <span class="hljs-variable">$a</span> <=> <span class="hljs-variable">$b</span>; <span class="hljs-comment">/* 当 $a < $b 时, 表达式返回 -1 当 $a = $b 时, 表达是返回 0 当 $a > $b 时, 表达式返回 1 */</span> |
??空合并运算符PHP7特性。
|
1 |
<span class="hljs-variable">$name</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'name'</span>] ?? <span class="hljs-string">''</span>; <span class="hljs-comment">//如果前面的值不为null,则返回本身,否则返回后面的值</span> |
- 三元运算符
?:5.3以后可以使用
|
1 |
<span class="hljs-variable">$name</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'name'</span>] ?: <span class="hljs-string">''</span>; <span class="hljs-comment">如果前面的值不为null,则返回本身,否则返回后面的值</span> |
流程控制
goto5.3以上有效
操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用 goto 代替多层的 break。
|
1 2 3 4 5 6 7 |
<span class="hljs-keyword">goto</span> a; <span class="hljs-keyword">echo</span> <span class="hljs-string">'Foo'</span>; a: <span class="hljs-keyword">echo</span> <span class="hljs-string">'Bar'</span>; <span class="hljs-comment">//输出 Bar</span> |
函数
- 变长参数
...,5.6以后可用
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">dosum</span><span class="hljs-params">(...<span class="hljs-variable">$arr</span>)</span>{</span> <span class="hljs-variable">$sum</span> = <span class="hljs-number">0</span>; <span class="hljs-keyword">foreach</span>(<span class="hljs-variable">$arr</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$v</span>){ <span class="hljs-variable">$sum</span> += <span class="hljs-variable">$v</span>; } <span class="hljs-keyword">return</span> <span class="hljs-variable">$sum</span>; } <span class="hljs-variable">$arr</span> = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]; <span class="hljs-keyword">echo</span> dosum(...<span class="hljs-variable">$arr</span>); <span class="hljs-comment">// 输出15</span> <span class="hljs-keyword">echo</span> dosum(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>); <span class="hljs-comment">//输出21</span> <span class="hljs-comment">//TODO</span> <span class="hljs-comment">/** 这个语法,我最近总在用。感觉还比较简单。不过要注意服务器版本。。最近入了一个坑。 */</span> |
- 匿名函数(Anonymous functions)
5.3
也叫闭包函数,在JS中很常见。为了防止污染全局作用域。5.3 以后PHP也支持了这种写法
|
1 2 3 4 |
<span class="hljs-variable">$test</span> = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(<span class="hljs-variable">$name</span>=<span class="hljs-string">'Li'</span>)</span>{</span> <span class="hljs-keyword">echo</span> <span class="hljs-string">'My name is '</span>.<span class="hljs-variable">$name</span>; }; <span class="hljs-variable">$test</span>(); |
如果想要从父作用域中继承变量怎么办
|
1 2 3 4 5 6 7 8 |
<span class="hljs-comment">//这里定义一个默认的输出名字的方式</span> <span class="hljs-variable">$tpl</span> = <span class="hljs-string">'My name is '</span>; <span class="hljs-comment">//使用 use() 来引用父级的变量,最后输出结果与上边一致 </span> <span class="hljs-variable">$test</span> = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(<span class="hljs-variable">$name</span>=<span class="hljs-string">'Li'</span>)</span> <span class="hljs-title">use</span><span class="hljs-params">(<span class="hljs-variable">$tpl</span>)</span> {</span> <span class="hljs-keyword">echo</span> <span class="hljs-variable">$tpl</span>.<span class="hljs-variable">$name</span>; }; <span class="hljs-variable">$test</span>(); |
需要注意的是,闭包函数的父作用域,是定义它的作用域,不是调用的作用域
类和对象
::class类的静态方法,用于获取类的完全限定名称,(包含命名空间)
|
1 2 3 4 5 6 |
<span class="hljs-keyword">namespace</span> <span class="hljs-title">Foo</span>{ <span class="hljs-title">class</span> <span class="hljs-title">test</span>{ } <span class="hljs-title">echo</span> <span class="hljs-title">test</span>::<span class="hljs-title">class</span>; <span class="hljs-comment">// 输出 FOO\test, 在使用命名空间的情况非常有用</span> } |
5.4新增加的一个多继承实现方式trait。下面总结了一下基本概念
1.trait 和 class 是相似的概念,但不能被实例化
2.一个类可以使用多个trait,优先级是 class > trait > 父类继承的方法
3.使用insteadof 来解决 tarit 冲突
4.使用as,来修改方法的访问控制
5.在trait中也可以使用tarit。和在class中用法一致
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<span class="hljs-keyword">trait</span> A { <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">say</span><span class="hljs-params">()</span>{</span> <span class="hljs-keyword">echo</span> <span class="hljs-string">'trait A'</span>; } } <span class="hljs-keyword">trait</span> B { <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">say</span><span class="hljs-params">()</span>{</span> <span class="hljs-keyword">echo</span> <span class="hljs-string">'trait B'</span>; } <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">walk</span><span class="hljs-params">()</span>{</span> <span class="hljs-keyword">echo</span> <span class="hljs-string">'walk B'</span>; } } <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> {</span> <span class="hljs-keyword">use</span> <span class="hljs-title">A</span>, <span class="hljs-title">B</span>{ <span class="hljs-title">B</span> :: <span class="hljs-title">say</span> <span class="hljs-title">insteadof</span> <span class="hljs-title">A</span>; <span class="hljs-comment">// 使用B的say方法代替了A的say方法</span> walk <span class="hljs-keyword">as</span> <span class="hljs-keyword">protected</span>; <span class="hljs-comment">// 将walk 设置为受保护的</span> } } <span class="hljs-variable">$obj</span> = <span class="hljs-keyword">new</span> Person; <span class="hljs-variable">$obj</span>->say(); <span class="hljs-comment">// echo trait A;</span> <span class="hljs-variable">$obj</span>->walk(); <span class="hljs-comment">// 提示不能访问一个受保护的方法</span> |
6.在trait中使用, 属性、静态属性、静态方法、抽象类都是被允许的。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="hljs-keyword">trait</span> Test { <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-variable">$obj</span>; <span class="hljs-keyword">public</span> <span class="hljs-variable">$name</span> = <span class="hljs-number">1</span>; <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">createObj</span><span class="hljs-params">()</span>{</span> <span class="hljs-keyword">return</span> <span class="hljs-keyword">empty</span>(<span class="hljs-keyword">self</span>::<span class="hljs-variable">$obj</span>) ? <span class="hljs-keyword">new</span> <span class="hljs-keyword">self</span> : <span class="hljs-keyword">self</span>::<span class="hljs-variable">$obj</span>; } } <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">son</span> {</span> <span class="hljs-keyword">use</span> <span class="hljs-title">Test</span>; } <span class="hljs-variable">$obj</span> = son::createObj(); <span class="hljs-keyword">echo</span> <span class="hljs-variable">$obj</span>->name; <span class="hljs-comment">// echo 1</span> <span class="hljs-keyword">echo</span> <span class="hljs-variable">$obj</span> === <span class="hljs-variable">$obj1</span> ? <span class="hljs-number">0</span> : <span class="hljs-number">1</span>; <span class="hljs-comment">// echo 1</span> |
5.3类的后期静态绑定
官方的解释是:
该功能从语言内部角度考虑被命名为”后期静态绑定”。”后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定”,因为它可以用于(但不限于)静态方法的调用
乍一看,好像什么也没看懂。看看具体的代码吧。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">A</span> {</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">who</span><span class="hljs-params">()</span> {</span> <span class="hljs-keyword">echo</span> <span class="hljs-keyword">__CLASS__</span>; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span><span class="hljs-params">()</span> {</span> <span class="hljs-keyword">self</span>::who(); } } <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">B</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">A</span> {</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">who</span><span class="hljs-params">()</span> {</span> <span class="hljs-keyword">echo</span> <span class="hljs-keyword">__CLASS__</span>; } } B::test(); <span class="hljs-comment">// echo A;</span> <span class="hljs-comment">// 上面是一个正常的调用, 输出了 A</span> <span class="hljs-comment">// 当我们把 class A 的 test 方法修改一下。 将 self 改成 static 后</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">A</span> {</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">who</span><span class="hljs-params">()</span> {</span> <span class="hljs-keyword">echo</span> <span class="hljs-keyword">__CLASS__</span>; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span><span class="hljs-params">()</span> {</span> <span class="hljs-keyword">static</span>::who(); } } <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">B</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">A</span> {</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">who</span><span class="hljs-params">()</span> {</span> <span class="hljs-keyword">echo</span> <span class="hljs-keyword">__CLASS__</span>; } } B::test(); <span class="hljs-comment">// echo B;</span> |
总结:PHP5.3新增加了一类关键字,static 可以在调用函数的方法。用这个关键字,来实现了后期静态绑定。
异常处理
|
1 |
比较简单记录一下 |
|
1 2 3 4 5 6 7 |
<span class="hljs-keyword">try</span>{ <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Execption(<span class="hljs-string">'抛出异常'</span>); } <span class="hljs-keyword">catch</span> (Execption <span class="hljs-variable">$e</span>){ <span class="hljs-comment">//获取异常</span> <span class="hljs-variable">$error</span> = <span class="hljs-variable">$e</span>->getMessage(); } <span class="hljs-keyword">echo</span> <span class="hljs-variable">$error</span>; <span class="hljs-comment">//抛出异常</span> |