|
admin 发表于 2021-5-30 12:34:25
26324
101
, ~' j9 q0 P( l" @4 ^
课程目录2 j5 x& E2 }$ W# }) ]
1 y0 Y4 _- [3 _9 V' ^: z
PHP7.0详解
: o7 k! ^1 n+ v$ f Z( s/ \# h开始介绍PHP7.0新特忄生,具体的可以参照官网的介绍,我来挑一些给大家详细讲解下
; }! i- y* |( K1 V2 M+ l* c. ?
6 a9 y5 u/ \; d+ n7 h+ z8 I4 t1. ?? 运算符(NULL 合并运算符)
. N8 D, y, T- f' U+ b) H. g2 A6 F+ q% o) ~$ }3 o3 F
" T9 x" Y5 N; x1 }$ N/ v
$a = $_GET['a'] ?? 1;. H W7 t0 X+ X4 r$ i
; \( o' {, i* W, ~
# V2 |: G7 b2 P M: Y0 h' U
它相当于:6 x" E( n1 f& x! y
% {- {0 I' u n0 p" D& X3 Y2 u* k) ~7 z* {# Q
. |( g: x' @; o# B9 _- o$a = empty($_GET['a']) ? 1 : $_GET['a'];
' |# |( \& N# `" U1 y5 A* K% S: Z8 Z& n9 _$ g6 \
1 G5 [9 A. G2 P3 ]6 {: l9 k- y
我们知道三元运算符是可以这样用的:6 i {* D; L% M
6 K1 W4 p3 {4 i% V# K2 b
5 N; B6 Y5 e& E; `7 G9 B* c- Y M& z, S' U' Q
$a ?: 11 X# W0 ]# F6 q& q& o7 Z% {
! g2 o5 a. j, s# d$ ]
: U( F2 G# l3 b$ e; t
但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。简化代码的同时也更直观了!$ a7 w \7 L* T% J, j; G, U& f
$ O, H7 r+ h. F& Q+ r7 ?- L% j4 N* U2 b. k. E( e4 r/ ^
2. 函数返回值类型声明, U5 T1 V/ q+ m1 R, {+ s; F
2 [+ |, B$ x F官方文档提供的例子(注意 ... 的边长参数语法在 PHP 5.6 以上的版本中才有):
. I) P3 A, V4 y5 \2 B+ k
6 J- A5 D0 h& t
P( W- o1 b2 q/ ]0 f/ C o
9 u ]* l4 w. ?2 o复制代码
( g4 a5 q# ^, q8 B) K$ c8 _( V
$ ?* ^5 z; u5 t9 _# L a) Y<?php2 P; `2 V, B) S: D1 w; N4 W8 }
function arraysSum(array ...$arrays): array: @: l/ T! v5 X' ^8 E+ c
{9 r$ |+ W8 c. k8 |# A
return array_map(function(array $array): int {/ M% D! q. U1 ?* K9 x( \- h1 Z
return array_sum($array);
`% y7 U# Z, o6 O! A }, $arrays);
4 k' ?. x) J D' K+ a8 t; F}
( ]7 i& P& Y7 e; }
$ T0 h, V" ~, ?/ s* l9 {! Oprint_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));# {3 b+ o5 O6 F8 {# a) W
$ ^2 {+ \: V" _$ o5 j复制代码. |$ a& j3 u1 H! J# S
" ]) N# ]1 f: {) A1 H8 ]
! B# z% X0 \; s! }$ A/ C从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。
& @! F- B5 C# N( `/ u, |' j U$ m! J }1 p$ m) Y4 `$ F
3 a5 [4 e; o; E2 k这个特忄生可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。
4 \) y, q* ?9 ~7 n+ X$ H, y3 I8 w) X
% d! a& }6 M( I0 s不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。
) T" c! b* @ v+ X2 [6 s" [8 f$ F9 Z, B
* W" V) }/ V2 p使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。1 m( M- V; I( S" W. Y6 c
: t3 g7 P' _( L5 {/ f
' W% M3 W4 }* {强制模式:' Y( T; K2 Q; D# X9 V# L; A
- }$ g; W$ L9 K( K: c- a6 x8 _+ t, O) v- l# v
4 e- Y+ [3 v8 P5 r& T' P复制代码9 F6 U' r" I, V0 r
7 ^: U5 b* A2 C, _2 `4 y<?php# ]7 K }0 \- f
function foo($a) : int" q/ @- s& g( v
{& q$ F# [7 u$ Y. u+ y
return $a;
0 d+ c3 h8 v" n: y}
$ a$ T6 J( |5 v5 X& Q r \ T% C9 @8 w
foo(1.0);$ Q+ M3 |$ g8 T# j- i
" r. c' @3 B; T# L1 o8 b
复制代码
. W$ g# H: ~7 n. g6 N8 D' f2 [5 W- v$ A; q. J8 F0 a2 T
: B& `+ ~, E+ I; d以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。) H I) i- Q( ?% X' f
& q0 Q/ z0 [! |
) A# _8 C) s; H4 D4 _, ?严格模式:
& ?6 s* e! w- }1 z: t( T/ E* Y8 o( G8 i
( `' Z* d; G+ J" a/ ?
* l% l$ X! S" Q4 p+ A A5 f6 {
复制代码
. o- E' L# @3 O: W" [" m; L
. \/ k, l# H- u1 G5 }. v2 p3 W<?php
. e. }# w( X* u# H wdeclare(strict_types=1);
) d4 D* E/ V1 ?: H( F$ B, S T% W
) W! h0 `% n# R3 k& \0 y& hfunction foo($a) : int
* N" i) s8 x) A3 E; k{) t# B9 F3 p9 t: l8 i
return $a;( Y6 R, l& K; y8 ~$ E; I
}) W- {( j0 x% O) Q
9 t5 r% {* V) T% x1 c& H- e
foo(1.0);, h# k; n9 m/ T. s$ ~& g
; `& U2 }# g. D; |, B$ v2 m- U9 j
复制代码
! W! V9 [ @9 c; c8 Z9 w7 \, y
% K$ L3 O1 T% n5 Q$ U0 M& e6 M" G x" x1 w, C% V
在声明之后,就会触发致命错误。
9 e x" w+ ?' M% D' y9 y
r+ L- q B' B. o$ E7 R7 V0 _7 R6 c/ e7 G# V' S* B
) }& G* T; N0 F5 ^0 B* \( j+ T
# PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6* s; m7 ]8 o* g2 T; h
s' v6 t+ h* ~2 Q" L1 S7 o* r. X; \. t; V8 r
3. 标量类型声明' m7 h! o+ f9 l6 \ e8 b" ?: r
: D7 t6 m" w, j; H6 A/ H2 {; \ @PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。
7 A) K( ]! D ?/ Q; w( z: { L
, @+ s1 O0 X5 T5 n" r3 P# c" t: }9 t3 h8 f2 [' n2 n
! S. G8 z6 P- {5 u6 G9 ^) T; Y/ f* J! d
复制代码; X" J8 V* F9 [3 e$ w, v- P
2 u0 }6 x+ Q+ ]9 }<?php
[. \; {2 Z4 M0 k& E$ f0 `// Coercive mode
, A, y0 Z1 @& R+ g- M7 f, Bfunction sumOfInts(int ...$ints)
4 A( _2 t' h* B3 ]{
" r- ]' C" [5 Q4 i) N" Q return array_sum($ints);
1 M$ U, \* L5 F}
0 H; a7 k+ t, d5 c' l; g D9 Q' X4 y# E# p9 @) ~+ a
var_dump(sumOfInts(2, '3', 4.1));9 b, n; o" Z' i6 `: B% k) ?
1 u4 @+ C5 Y# F复制代码: }7 K- O) o$ f) J. q7 T
( N% c. X/ k7 m, _$ n0 y& ]
* r" B# ^5 S6 M2 E需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。
9 }: I0 C" }. Q' t& {9 V5 G) t8 J( F/ Z$ n" n9 X
5 |1 z- `* Q( X. H h% a4. use 批量声明
& E7 E) b5 O5 g! t$ g% h7 o$ e$ |3 }2 ~
PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:
+ Q: v, U: |4 L4 _
8 z# H' H+ }$ X* Q) Z; e( D9 N( x# w' C$ Z" Q- H
8 t' G% d. U8 }
<?php$ t6 Y5 V R! y5 `5 M
use some {' p9 o6 Y' j0 g2 e2 e) i
amespace{ClassA, ClassB, ClassC as C};
* s5 f: ^9 q! {- s' \$ \use function some* [: ~3 w& V* I m" j$ l9 ^" @7 ~9 v
amespace{fn_a, fn_b, fn_c};
7 [$ C; `9 ` @' iuse const some
p7 h: d* J( I: J1 Famespace{ConstA, ConstB, ConstC};
4 ?; I. Z6 w+ v1 C6 J/ A# I3 o7 O# W/ E" Q+ L
* g) L0 T+ s2 }6 E. _
但还是要写出每个类或函数或 const 的名称(并没有像 Python 一样的 from some import * 的方法)。
, A4 |$ h+ S& g) m. v. c% \" l, G! C- z& ^ L9 S
5 ?: i, l' |1 F% c5 O- R8 B4 I9 e需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。
# U( p6 ]3 i. q3 m- A' G( v( _
* k( s- A7 N$ T* y' `! j8 f! i5 G
1 H: G6 V4 e! s; n' u4 S# @8 n" `再来简单说几个:
# W* {4 O' @! v, j1 {! y; ?( \: o6 j/ ?2 L2 {; t7 T
: J4 U8 M2 b' w/ |# \. R4 d1、PHP 5.3 开始有了匿名函数,现在又有了匿名类了;3 Q- g9 b' a( _4 X2 K% g
8 s) Q7 P+ k$ v O1 Y, v5 }0 `
+ r8 F; {: g# J
2、define 现在可以定义常量数组;
: J# B* e' |: Z$ R0 d" _: ^3 g) E# i
: E, s2 j1 ? w6 M# m* h2 L3 ~$ R
3、闭包( Closure)增加了一个 call 方法;. E" ]% P! d& N w
8 U5 H, G u5 S4 @/ F+ N
, J: n/ F2 M5 U7 _2 G4、生成器(或者叫迭代器更合适)可以有一个最终返回值(return),也可以通过 yield from 的新语法进入一个另外一个生成器中(生成器委托)。9 o+ H }* ?- @* l, ?' _% A
7 K4 \5 Q: k8 B5 y( P8 K, C# h2 g3 k! r+ q3 a8 ?/ Z1 \
生成器的两个新特忄生(return 和 yield from)可以组合。具体的大家可以自行测试。
i3 i8 O0 t/ t: p/ @, r! P
7 ]0 ^, ]" s. X. X资源存放>百度网盘3 i l2 K9 v; X9 |; M+ Q
2 H, f- e# o; F; d9 g下载地址( w/ N x( t6 c1 y& Q3 k3 Y2 F
$ t3 h- u) y. H$ TVIP会员全站免金币
( a7 a% p ]- U: p& \IT直通车已为全国各地程序员提供上千G课程资源5 r; ?! [5 i2 n. R' \! I! _" ]* Y6 B
如您需要购买本站VIP会员,请点击「开通VIP」享受全站资源免金币无限制下载!
$ @% v* Z" O. m6 j" O& v
! S$ _9 o0 f- {' ` Y" C Q失效反馈; E! n% h- s# ^: v. G
IT直通车所有资源都存放在自己注册的百度网盘,失效可修复,确保持续可用4 D" \3 l" v2 h" e- B# p4 K' _4 q
如您需要的资源链接提示失效,请尽情反馈给我们,将在收到反馈后尽快修复「点击反馈」
6 Y& M9 c- S! I6 |" m! v e# w
获得帮助0 b2 s2 n: t" _% n% |
需要帮助吗?点击网站右侧在线客服,7X12小时在线!
3 _3 s! W4 W5 c+ l8 X$ b# m
5 {, M! K. z3 p |
|