|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本文和大家分享的主要是php的命名空间、性状和生成器相关内容,一起来看看吧,希望对大家学习php有所帮助。
9 \" P) K$ j8 `; x9 H9 h 1.命名空间
- q, A/ N, c8 V) h5 _ 命名空间是什么?+ k& q* G6 y* J3 }1 ~
1).命名空间在PHP 5.3中被引入,类似于文件夹的功能。例如Symfony框架中的Request和Response,位于Symfony的命名空间下。5 K' E( ?, x( Y4 W: L3 p l6 j5 S
2).命名空间始终应该在<?php标签的下面一行。
- c+ e. ]" Z9 h9 x( A; R 3).PHP文件的命名空间和操作系统的物理文件系统不同,这是一个虚拟的概念,没有必要和文件系统的目录结构完全对应。虽然如此,绝大多数PHP组件为了兼容广泛使用的PSR4自动加载标准,会把子命名空间放到文件系统的子目录中去。
$ z0 b% K8 D" }7 w 4).命名空间只是PHP语言的一种记号,PHP解释器会将这种记号作为前缀添加到类、接口、函数和常量的名称前面。
- v2 `) g. s7 c Z1 U 为什么需要命名空间?6 V" a4 A! D0 R Q0 ^
1).命名空间使得程序可以像沙盒一样运行,可以和其他开发者编写的代码一起使用。确保了自己的代码和项目可以和项目的第三方依赖一起使用。, a2 `7 u) h# D& o7 ^. Y
声明命名空间, g7 T4 e/ L9 J( k& N: s# G
1).顶层命名空间经常用于设定顶层厂商名。
; F+ N$ E. p; Y& E& V! @4 U3 {5 P9 h 2).厂商的命名空间必须具有全局唯一性,子命名空间就没有那么重要,但有助于组织项目的代码。
% T/ i! }+ L" p8 `, | U 导入和别名
0 j7 N9 V+ a! K 1).从PHP5.3开始可以导入PHP类、接口和其他命名空间,并为其创建别名。从PHP5.6开始可以导入PHP函数和常量,并为其创建别名。- T% S7 | C! D4 ^7 F" R
2).使用use关键字导入代码时无须在开头加上\符号,因为PHP假定导入的是完全限定命名空间。use关键字必须出现在全局作用域中即不能出现在类或者函数中,因为这个关键字是在编译的时候使用的,不过,use关键字可以在命名空间声明语句后使用,导入其他命名空间的代码。
- U& i( A E! k) `! D6 o% _ 从PHP5.6开始我们可以导入函数和常量。* v+ R! }0 j0 `; I; i7 V$ r
<?phpuse func Namespace\functionName;9 D8 M- k4 k5 ?# k
functionName();
; l8 |( w! V+ K) l |- ^ 也可以导入常量,
( N5 f. z4 Y8 F9 i8 b. x- i use constant Namespace\CONS_NAME;% O4 c' K3 m9 ~2 s* y' Q* |2 W0 w
echo CONS_NAME;- F/ s: C- W7 F: a
函数和常量的别名与类名的创建方式一样。
' U4 Q! Y& X& f! c9 Q7 M4 T M }7 f 最佳实践
) i) h C9 r+ R' f/ {7 p4 s+ O 1).PHP允许在一个PHP文件中定义多个命名空间。但是这么做容易让人困惑,违背了一个文件一个类的良好实践。
. I; L2 t' A' G8 O9 D 2).在一个命名空间中引用全局的命名空间的代码时,需要加上\前缀,告诉PHP需要在全局中查找该类,例如PHP原生的异常类。9 N- `0 J' M$ V1 ^+ }
自动加载
1 l8 M# B0 P0 d, K$ c 1).命名空间为PHP-FIG制定的PSR4自动加载器奠定了坚实的基础。0 T$ l& x. v6 {; K" d8 p
2.使用接口 C1 l& H6 N( ], a4 V7 `+ l* ~
1).就像我可以选择开不一样的车。因为他们都有方向盘、油门和刹车,并且燃料都是汽油。( w* } t. ~& L3 G% S
3.性状
, B/ m" ~; K6 ?2 z; c 1).形状是类的部分实现(常量、属性和方法),可以混入一个或者多个现有的PHP类中,性状有两个作用,表明类可以做什么(类似接口),提供模块化实践(类似类)。
: J. j( r, ?8 r$ y1 a3 z5 ` 2).性状使得两个无关的类可以使用相同属性和方法。5 c) {1 n: f7 X E4 k
3).PHP解释器会把性状复制粘贴到类的定义体中。
8 A3 P4 C1 @# O! H 4.创建生成器
3 _: a2 w7 |& s/ k* E1 g, u: T 1)在普通函数中一次或者多次使用yield关键字,不返回值,只生成值,这个函数就是一个生成器。例如:
: \. S) T1 |% H6 B/ t! m b' t: G <?phpfunction myGenerator() {
8 R0 J. ~7 T% q0 F) `. Y yield 'value1';7 y; d% A1 q2 `* k9 d" ]3 {
yield 'value2';
' I6 W$ l; `1 [8 R$ z$ d; H } D8 [: p! U1 e8 }+ V7 m
调用生成器函数的时候,PHP会返回一个属于Generator类的对象,这个对象可以使用foreach()函数迭代,每次迭代,PHP会要求这个对象的实例计算并提供下一个要迭代的值,生成器的优雅之处就是在每产出一个值之后,生成器内部状态会一直停顿和恢复之间切换,直到抵达定义体的末尾或者遇到空的return;语句为止,例如:
3 F* s9 }; c8 N( ` z9 g* Q <?phpforeach (myGenerator() as $yieldedValue) {8 p* n" u' X2 C$ w
echo $yieldedValue, PHP_EOL;
0 S$ i( n1 k' M5 Y }8 q5 [: e. @( e( ^: \# L
以上例子会输出
+ p" w' F' w8 ~2 U9 _7 v% ] s value1
. Z7 P4 h8 d3 V0 {" X2 Q0 q value2
+ ?& {& q ?: B9 l. z 2).生成器是如何节约内存的?生成一个范围内的数值(错误方式)
* z; h9 C/ V1 S/ ?4 |- i function makeRange($length) {! y/ @. v" I' x
$dataset = [];
: X! r# H# p2 v. @ s% O2 S for ($i=0; $i < $length; $i++) {8 Y6 L- R: k6 O
$dataset[] = $i;
' g$ I1 ^6 @) L* w. H) L' ?9 ` }, t0 i. g, H1 b# F3 C
return $dataset;+ w& _. z1 M' P8 B6 F9 E) D
}& o2 g8 ]6 [6 d$ L: s! p* N; k4 i
$customRange = makeRange(1000000);foreach ($customeRange as $i) {! X2 {* a# B: j& B
echo $i, PHP_EOL;
8 d# p) g; ^8 u5 C: F* x. b* s }! y1 E% M# _; y. o: Z
预先创建了一个包含很大整数组成的数组,再看使用生成器的例子。/ M Z# u+ G: k( ?: S1 j
function makeRange($length) {9 y3 r/ v. G% c. e3 V
for ($i = 0; $i < $length; $i++) {
9 N# D" I- ~9 }+ T yield $i;) m* T7 N: p1 g a% w% i0 x5 Y/ D: p
}. R/ z7 K) }' `4 e) D" A8 ~- a
}
; h' s2 a: J$ w foreach(makeRange(1000000) as $i) {0 ^' ?/ j* @! P, y9 n' I' a5 V
echo $i, PHP_EOL;# H$ ]& D& j1 \( [9 ?6 n9 S9 L' o: a \
}
: i; n; g" w% `* a( q 在实际的例如迭代一个4GB大小的文件中功能中,迭代器大展身手。. h& V* N3 W" [. L3 ]# }2 S
function getRows($file) {. g& G J+ E0 q, ~7 ?) }2 s
$handle = fopen($file, 'rb');9 Z7 H, e$ s6 v$ e9 A5 }+ I7 y
if ($handle === false) {
* [/ y' e1 f# M6 Z( u throw new Exception();0 c& X; U$ Z# A, a7 C+ X! E
}
- t. o! }9 ~/ j0 Y$ j7 ^ //feof()函数检测是否到达文件末尾
# w+ Z4 v [' n0 z! i while (feof($handle) === false) {
0 D4 u) h) o1 a //fgetcsv()一次读取csv文件的一行% ^( p. N% f/ a$ e7 W/ S
yield fgetcsv($handle);. G; N% F7 p2 Z" M! D
}. o* o0 e. u% }, W- T
fclose($handle)
* t; h4 t$ J: K8 |! z: Z }, L) E$ V' Q, |0 |( w# I. O
foreach (getRows('data.csv') as $row) {
, a$ r) v Z7 C4 v4 c print_r($row);! V+ m b' l9 b8 e
}" z2 h! z! M5 p& t/ D
3).生成器没有为PHP添加新功能,需要实现在数据集中执行快进、快退和查找,最好自己编写类实现Iterator接口,或者使用PHP标准库中的某个原生迭代器。
4 @. L2 @- l% `
" Z1 G$ B" C" M! e- |9 N7 _+ y+ ]4 I& U L+ T6 J
来源:稀土掘金 |
|