PHP7.0详解

  [复制链接]

2166

主题

2202

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10384
admin 发表于 2021-5-30 12:34:25
26527 101

0 F+ t+ s" d0 w- J课程目录0 B2 Y! n8 S* A' L, Q
2 A$ ]2 n- O: e8 ?: e
  PHP7.0详解7 K* L0 b* \( x+ ?+ L
开始介绍PHP7.0新特忄生,具体的可以参照官网的介绍,我来挑一些给大家详细讲解下6 N* h; i0 A2 _
  z7 `5 h" i6 W; |. g
1. ?? 运算符(NULL 合并运算符)% L: y1 S; X" n4 \/ j; A9 K" O

/ T1 C$ r9 S1 Q" k3 e3 s) C6 Q, ~2 f" I6 n8 h. O- e! N
$a = $_GET['a'] ?? 1;
6 z6 K7 l9 a' l7 H5 N& z3 e3 P/ j+ ?9 s  h
. B' v" K1 ]  U  X
它相当于:; h  `+ K" O* R: l. I

( I) G. Q$ c- a6 V/ L& {! j, U
( |+ y- W  v5 f1 P3 {* X8 I
. a+ E9 M( u! L- B  {: V/ H1 {$a = empty($_GET['a']) ? 1 : $_GET['a'];
( v! A+ b" A7 K2 I, N0 z* P& f% O7 r  g' [; v  Q
# M2 A( s( m8 Q1 _4 m
我们知道三元运算符是可以这样用的:
3 A/ D" c7 a, h) h( B) K, a
+ v2 {9 e# x" l, n, h1 B! w" O$ ]. c) s) m) L: `

; |# o( q* X: _% F7 H% `$a ?: 1! S) l8 S- Q; ^  t) i* q* L9 s
, E) s# z5 B5 S0 _- h7 @6 |# F
" ~4 h3 N0 c6 P9 S3 p9 c7 ~
但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。简化代码的同时也更直观了!( v( u6 ?. M, N% u: M$ y& M! _
7 t6 S6 {5 _& k8 I9 h/ l

4 J8 v$ v5 S+ v% f$ |& G2. 函数返回值类型声明
2 I. F- Q+ {- Y2 Z* I. O. o6 Q. d: ^
官方文档提供的例子(注意 ... 的边长参数语法在 PHP 5.6 以上的版本中才有):$ u, n# k/ C% R% |

4 q% K9 B* a- J8 T+ S. V" d" z2 Q  Q! a  L: s: P
2 w$ _$ ^& u$ }
复制代码( G" ?" {5 m! S; {% D- Y" f! x

' |4 U5 K+ J, G5 Z% J2 e, v- D1 ]<?php0 [3 T& }. G2 ~, I* q6 e
function arraysSum(array ...$arrays): array
: F; X4 N8 \( i  l/ q: s# L{
" y4 ^+ A0 I5 ^; }" X( S& G    return array_map(function(array $array): int {
* ]" ~) q9 J+ f6 t# w: |        return array_sum($array);
5 i/ g8 k; d3 G+ ~2 W' R/ m, D    }, $arrays);* x1 f$ e- E. x+ q6 F* E' o
}
. {" E- i& L  E: d8 r% |
2 x- q- |! o& K$ j5 j" ?" Mprint_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
; r, o8 d# W2 }3 A1 g( ]! Q
/ J7 X# w* B: u8 ?4 F. w+ r6 W/ l复制代码
; H' A/ [! E( a2 {. ^. G
4 W+ \5 L* p  u$ ]$ o: N6 B; D% N) I9 {
) O% C& p: I2 h/ B8 z1 C9 i/ |: k从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。
, W4 M4 b3 o2 J/ m4 K
) y5 ~/ t1 D9 V! x& q
0 {! S4 U" u+ E$ R+ a' k2 s+ j这个特忄生可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。
; G8 I' o8 P6 X
4 {2 @+ m3 l. C4 r
$ w9 f- q6 r, K1 ]5 G2 x不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。* T* q8 E1 ]9 v& N+ t
# {% |3 L0 B5 \/ S

$ X4 R. w- M9 l) ~7 b使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。  Z8 b( y" f$ ~( K
+ V: w: d  \/ b
1 B+ S8 _4 F$ w1 `' V. j9 k1 {
强制模式:4 q  D! S) g, G/ M4 B- L
9 U0 G" [3 s; w
; w! n$ a1 S% m0 n8 F# k0 j5 O

0 |# s2 \+ A9 L+ i& W; ?复制代码# M" h9 k8 \- V2 g0 Z
) o" w  q( [/ e, n0 g
<?php" N: s. w& |8 p
function foo($a) : int
$ A, z7 O* T( L' J) o) v' n{
4 W6 b# w' A) J6 t. Q    return $a;- ]$ L0 p+ }- ?& j# a& K
}
  `' B7 |" H! l! W/ Z, x/ k- s0 F  X4 I  n4 j
foo(1.0);, f3 }' r/ y: @3 X; j; `( g4 ~
3 q* h$ f5 B2 \) B2 b4 ^7 h- q
复制代码2 i& _: \! |' Y* Q# n

: o& }- i& p9 @  u
, f# Q9 D6 D! }以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。
' {/ y  P  j* Y' K
, S' k7 J& P* X/ W, W) }0 Z0 ^3 X6 k0 B9 A1 F$ U8 e
严格模式:* a* I$ p% H1 \2 O/ S
- Z- Z1 w! @2 G/ O' i

, L& @9 o$ i2 g+ W' ^7 t, g1 t( o8 T8 |4 ~* T6 {
复制代码/ }  u& ]. b: m% W$ S4 B' L

) D7 ~/ |% N3 e6 g( l$ E<?php5 z& d8 I8 C. r1 P$ F: g
declare(strict_types=1);2 u1 I; @5 r: J/ v* O/ N- z

0 i6 W+ R1 p/ D5 L' j  M# v+ @1 `function foo($a) : int" G# N9 g* `) ]0 K- x
{! R8 v! r4 q- H2 L8 L) H1 o
    return $a;
' c! o* T# t$ Z( E}
" t% Q6 [: e5 q# h+ |
1 i3 s9 P+ N: Q* m1 z/ L9 a1 K: Qfoo(1.0);
0 H" G9 c' X9 d; t
: f3 ]3 |# K, }; t. q复制代码
+ C/ i& Q4 H# S4 s, N  e, H
+ F+ u$ P5 n! G
& O+ d3 _# B- e! r# @在声明之后,就会触发致命错误。, v9 J4 |: K0 U9 m
/ ]' u+ Z( j! F! Z4 @3 @

4 x) E; n  d5 g& M+ P( }5 l& S" p( o4 z
# PHP Fatal error:  Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:69 F: o4 ^$ l% l1 l
/ S, k$ O1 S% f' Z! j6 j9 w0 ]

: T- {' K  e+ a, h! J3. 标量类型声明
6 c/ M/ [% T  p# K/ u
/ X* Y' u) M9 c2 s& O8 qPHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。# q1 ~) l2 L" L3 i: B& W
+ R, @' d" _/ ]) U1 P

, v$ U/ w$ V4 C# A0 Z# k5 R6 F  a' @4 g7 t3 S$ ^
复制代码( \' c) [2 `+ |
+ m# e5 A& N5 e" Y  a1 E- E  [
<?php$ D" i% Z* f: Y/ q" v0 K! }
// Coercive mode
$ o: ]  I2 J) s, ^0 b) cfunction sumOfInts(int ...$ints)9 b# Q2 N. o* F  c. T" i( d3 l. u
{+ h% u* y4 X# L' r- ^' C
    return array_sum($ints);
6 g9 ~2 ?6 u& k- d& B6 v. }3 P9 z}/ j. ]9 q9 g- z! C- Q7 {9 a

- I9 u5 Q* p8 q- v1 \9 K0 avar_dump(sumOfInts(2, '3', 4.1));
3 j! T- X" F; X, k
* h6 Q' U+ M) p3 Q& t. m( Q* @复制代码' j1 e4 X; w+ u6 a6 T% _
4 P/ ~  I6 m' |

# O7 R3 W) @4 m3 c) ]需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。
( u, i5 o) w4 P  ~1 u  v+ x% O2 L7 h: H

3 `1 O! [- `2 {, ?2 J4. use 批量声明
$ s. b: d: \& m  H$ h! r
" _' r) j8 ]2 HPHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:+ L3 L. a* Z7 j! p8 d

( i3 b3 [! x$ A; [7 S7 `- a5 I. T9 `; @: O- i7 n

1 k8 y3 B, B2 k% l. C/ x$ L<?php) r3 [. S" z: E8 Q  W6 G- p
use some& e! B$ X8 d1 C: g& [
amespace{ClassA, ClassB, ClassC as C};
, z1 k9 N7 t3 a& b" C: \use function some$ o5 x5 [: L6 N2 y6 t) S1 ?4 Z
amespace{fn_a, fn_b, fn_c};
2 O2 W  Z% _% Nuse const some- A$ v- U! U, m; k9 D
amespace{ConstA, ConstB, ConstC};
$ r* y, N, B& q* N2 ^5 E/ `- Z# V( d2 g1 \9 [
7 @' n" [9 c3 i3 m* h
但还是要写出每个类或函数或 const 的名称(并没有像 Python 一样的 from some import * 的方法)。3 z$ W' N, u1 d$ H, x9 ?5 X

/ V+ O2 `3 c) |# _/ L
! m& \! t. O* \8 ~2 X需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。
% W4 y, h, l3 w. B
6 a, V+ E( s0 g  L/ L  C) V
  E) _" c  [8 {' h* s再来简单说几个:0 w+ E: h( _+ i- u
. w$ S2 W1 B. h$ H& F

) @) q; R5 x8 |) N; T1、PHP 5.3 开始有了匿名函数,现在又有了匿名类了;; ]  `# L; }2 z$ }

. t3 n' }0 P% H) C( s2 C9 E9 K; U; J
2、define 现在可以定义常量数组;
; F1 ]9 A+ s' z# @0 X: ?6 _- y
& x8 ?: G7 }; U7 Z0 ^4 o# c: L' W. ]2 H1 p$ o
3、闭包( Closure)增加了一个 call 方法;; D' T* m: }/ s) z. G( Y
/ e" C5 c; c% q6 `3 ~9 c" G* E
" F3 J& |- J: n. v
4、生成器(或者叫迭代器更合适)可以有一个最终返回值(return),也可以通过 yield from 的新语法进入一个另外一个生成器中(生成器委托)。; O% R; E2 C3 T3 H$ O; F
0 O/ _; T6 e1 Q! E+ }& V

7 L# w' Y8 [4 C7 X1 J生成器的两个新特忄生(return 和 yield from)可以组合。具体的大家可以自行测试。
( z& E0 y3 ?3 G- p
7 H  i# G2 V8 P2 J5 ^资源存放>百度网盘  C! D& G2 U+ L1 c+ Q  V
4 Z! h, z$ [5 |# G. z( }
下载地址, Z# G6 M. W  ^  {& M0 d8 v' U) G
游客,如果您要查看本帖隐藏内容请回复
6 t% M6 Y/ G4 X9 y  X# W6 i
VIP会员全站免金币. T2 T( A4 l3 y
IT直通车已为全国各地程序员提供上千G课程资源9 s9 P# Z; |; S* f' m+ K8 ~1 P9 S
如您需要购买本站VIP会员,请点击「开通VIP」享受全站资源免金币无限制下载!
& J4 w) t2 I% r6 Y" `$ h( w8 j; X. @9 [% l0 W3 E5 c. U
失效反馈
$ Q- b8 s; I" i9 L4 ?! {6 d6 N2 K1 dIT直通车所有资源都存放在自己注册的百度网盘,失效可修复,确保持续可用
0 K9 [$ A7 d  t6 e! e) X如您需要的资源链接提示失效,请尽情反馈给我们,将在收到反馈后尽快修复「点击反馈9 Q# _! G8 L0 x" ]
2 u/ A# J; J+ W1 P, l4 e
获得帮助' v0 h4 o0 v- t5 f0 E9 A" G. C
需要帮助吗?点击网站右侧在线客服,7X12小时在线!5 e2 S) q' G  R  W% @" s

6 Y' v: e- G- g: F" e1 y9 H
回复

使用道具 举报

大嘴997 发表于 2021-5-30 12:36:43
6666666666666
回复

使用道具 举报

笑看人生458 发表于 2021-6-1 15:18:02
感谢分享66666
回复

使用道具 举报

快乐人L 发表于 2021-6-10 22:11:48
感谢~~~~~~~~~~~~
回复

使用道具 举报

123457265 发表于 2021-6-12 21:33:34
谢谢分享~
回复

使用道具 举报

海田1 发表于 2021-6-14 11:30:59 来自手机
谢谢分享~~~~~
回复

使用道具 举报

二级传播盅 发表于 2021-6-14 21:17:54 来自手机
ttttttttttttt
回复

使用道具 举报

猥琐大叔求教pv 发表于 2021-6-17 09:27:40
好东西拿走了
回复

使用道具 举报

earth20011 发表于 2021-6-20 10:44:48
ttttttttttttt
回复

使用道具 举报

数脚趾头耍媳 发表于 2021-6-20 16:49:19
好东西拿走了
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 AD:IT直通车VIP会员全站免金币下载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

遇到问题联系客服

售后保障

如您充值或开通会员后资源无法下载

本站有售后服务,联系客服修复即可

[联系客服]-[会员充值]

更多课程

需要帮助吗?请右侧联系在线QQ客服

关于本站

VIP介绍 加入我们

售后服务

QQ客服 Email邮件

网站声明

IT直通车(www.itztc.com)是一个IT视频教程、软件、书籍资源整合分享平台
站内所有资源均来自于互联网,版权归属原资源作者,如无意侵犯您的版权,请联系我们删除处理。

Archiver|手机版|小黑屋|IT学习网 |网站地图

Powered by Discuz! X3.4  © 2001-2013 IT直通车 ICP证:粤ICP备13026616号 增值电信业务经营许可证:粤B2-20140196

返回顶部 返回列表