|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本文和大家分享的主要是php的命名空间、性状和生成器相关内容,一起来看看吧,希望对大家学习php有所帮助。
& N s# t4 a: T; }1 z" [ 1.命名空间' ~# ? j8 U! n, l
命名空间是什么?, o o2 R2 A. N8 R9 O5 `
1).命名空间在PHP 5.3中被引入,类似于文件夹的功能。例如Symfony框架中的Request和Response,位于Symfony的命名空间下。! j5 N# O |) b3 D9 e( c
2).命名空间始终应该在<?php标签的下面一行。/ {3 F/ ?8 V5 u. Y1 h# s) q0 r
3).PHP文件的命名空间和操作系统的物理文件系统不同,这是一个虚拟的概念,没有必要和文件系统的目录结构完全对应。虽然如此,绝大多数PHP组件为了兼容广泛使用的PSR4自动加载标准,会把子命名空间放到文件系统的子目录中去。
4 I' K# s- y# | 4).命名空间只是PHP语言的一种记号,PHP解释器会将这种记号作为前缀添加到类、接口、函数和常量的名称前面。 a% T2 L- q% S z1 ?
为什么需要命名空间?& K/ `3 i* S3 [) |
1).命名空间使得程序可以像沙盒一样运行,可以和其他开发者编写的代码一起使用。确保了自己的代码和项目可以和项目的第三方依赖一起使用。
) p, b( G9 j) N1 D1 f& {1 X 声明命名空间' k9 ]* m' w+ ?# G
1).顶层命名空间经常用于设定顶层厂商名。
* N: N1 A3 T1 I% S. E. l- T 2).厂商的命名空间必须具有全局唯一性,子命名空间就没有那么重要,但有助于组织项目的代码。) H% f* k9 k+ a( U
导入和别名1 V. h( \1 a: H2 `1 ^
1).从PHP5.3开始可以导入PHP类、接口和其他命名空间,并为其创建别名。从PHP5.6开始可以导入PHP函数和常量,并为其创建别名。( b/ C; ]- G0 m
2).使用use关键字导入代码时无须在开头加上\符号,因为PHP假定导入的是完全限定命名空间。use关键字必须出现在全局作用域中即不能出现在类或者函数中,因为这个关键字是在编译的时候使用的,不过,use关键字可以在命名空间声明语句后使用,导入其他命名空间的代码。& L5 z: p% C+ v" p
从PHP5.6开始我们可以导入函数和常量。
5 m' I3 M, w% Z3 O' D* x1 m8 | <?phpuse func Namespace\functionName;0 [# j# ^3 P+ L4 n- K; ^ J( W
functionName();) q8 \9 {1 P7 W
也可以导入常量,. D/ Z5 V1 A4 p" M. d# E% O
use constant Namespace\CONS_NAME;
# V7 r/ r* J* g2 y7 s( K0 X/ z echo CONS_NAME;
- Y) _& j! d. `" o 函数和常量的别名与类名的创建方式一样。
! g; G- g0 X `+ i1 D2 c( J* X 最佳实践
+ j' o2 k6 P1 R0 M: s9 ?& b/ R 1).PHP允许在一个PHP文件中定义多个命名空间。但是这么做容易让人困惑,违背了一个文件一个类的良好实践。
8 x c1 U4 Z5 y- V7 |& J 2).在一个命名空间中引用全局的命名空间的代码时,需要加上\前缀,告诉PHP需要在全局中查找该类,例如PHP原生的异常类。5 Y9 q; |6 k# Z6 x
自动加载
1 t0 ?4 o% E' Q0 p- @+ Y1 Q3 m( k, Y( | 1).命名空间为PHP-FIG制定的PSR4自动加载器奠定了坚实的基础。; E9 q6 v0 X. A0 s$ G2 B- t
2.使用接口" y5 o- C8 k, b1 g W" R
1).就像我可以选择开不一样的车。因为他们都有方向盘、油门和刹车,并且燃料都是汽油。, b9 n0 y1 y; d' t! t
3.性状
8 M/ n) x4 E5 j, J- y- X 1).形状是类的部分实现(常量、属性和方法),可以混入一个或者多个现有的PHP类中,性状有两个作用,表明类可以做什么(类似接口),提供模块化实践(类似类)。
4 C5 c2 X6 g% K 2).性状使得两个无关的类可以使用相同属性和方法。
( D8 M+ [; O2 v9 R 3).PHP解释器会把性状复制粘贴到类的定义体中。/ T: R) ^# L8 C( E P' z1 j& ]
4.创建生成器. V3 L. x; c. X1 c8 `7 z9 I9 L
1)在普通函数中一次或者多次使用yield关键字,不返回值,只生成值,这个函数就是一个生成器。例如:
. w. b% M4 j7 P3 b) w2 |6 s' n& O <?phpfunction myGenerator() {. Y% L6 R; B0 o/ z! D( h- O
yield 'value1';
* t5 C7 i) |/ O- g# }$ k yield 'value2';
2 @+ \" l0 y* z* C: I1 A }
; M) p; X; o2 L4 o- o( p 调用生成器函数的时候,PHP会返回一个属于Generator类的对象,这个对象可以使用foreach()函数迭代,每次迭代,PHP会要求这个对象的实例计算并提供下一个要迭代的值,生成器的优雅之处就是在每产出一个值之后,生成器内部状态会一直停顿和恢复之间切换,直到抵达定义体的末尾或者遇到空的return;语句为止,例如:' \- R* _! L/ d8 i3 k; k
<?phpforeach (myGenerator() as $yieldedValue) {
2 j7 {$ D+ ?( m% S. M& F echo $yieldedValue, PHP_EOL;! [: O# ?* B( d) [. C
}7 T" @( I3 x$ O5 Z" B* Q! t: {# X
以上例子会输出) W- c) ^' A) l' P
value1
: W$ ^/ ]6 W: L- X8 k; |9 N- c" e value2
8 ?" b$ d! o3 f$ i7 E( i9 h 2).生成器是如何节约内存的?生成一个范围内的数值(错误方式). I f) _, }$ N1 ^0 J
function makeRange($length) {
: f6 K: M) L; x# u% a6 Y2 Q3 j# j/ x $dataset = [];
; O. l+ c) V, v, g for ($i=0; $i < $length; $i++) {. ^& i# i y7 @- X7 n3 o
$dataset[] = $i;+ v4 y8 D* G/ a
}( A4 P* Y M; G9 Y1 i- u. j) l Q
return $dataset;
- g# b* b" ^/ C6 T: i }: x0 q; {' o+ |" j; Y. b7 F: W% H
$customRange = makeRange(1000000);foreach ($customeRange as $i) {
) g1 J- W' m% q5 S P1 w2 t echo $i, PHP_EOL;
( B! `+ _# e; ?; z }
- u1 e% G3 m7 X/ {& |2 A, a0 _ 预先创建了一个包含很大整数组成的数组,再看使用生成器的例子。0 P2 Y# e( x, _ V' C
function makeRange($length) {- j7 I. [& o5 w- X
for ($i = 0; $i < $length; $i++) { d5 j; v8 E! R. i; e2 Q) |( z% t
yield $i; ^* S9 v. d8 Z6 P+ {
}5 e7 o) _3 P' z/ T& W
}
$ e/ K2 d6 h. p! S7 a foreach(makeRange(1000000) as $i) {
- p/ b, _1 _- J O# e0 w echo $i, PHP_EOL;
/ {5 k5 a3 q8 Q3 I& i }$ z6 M$ c# j- w- ?1 R" j
在实际的例如迭代一个4GB大小的文件中功能中,迭代器大展身手。
1 l, R1 f( a1 U+ G- O' _7 v function getRows($file) {% q% z& m& g9 p$ @2 }
$handle = fopen($file, 'rb');" n0 Q G' p: g1 q" Q @
if ($handle === false) {4 D: B' U; l2 O! ~8 f, p% E
throw new Exception();
; J* `( o: |9 n. K6 v' i }
) ^$ h! |# b; K0 z8 R" X //feof()函数检测是否到达文件末尾
7 Y0 S, H: l" P$ v, E; V: K6 Y, L while (feof($handle) === false) {
7 D: C- {3 n2 ?7 g9 }0 n% ? //fgetcsv()一次读取csv文件的一行8 O# U3 D! h6 ~: \) Q. U1 O
yield fgetcsv($handle);
) N4 r$ ?$ v5 H6 q# f' y }$ y& m# ^& u) ^+ a; G
fclose($handle)5 y+ E3 [6 [4 a0 g+ k3 g
}5 U) q! O6 s. |
foreach (getRows('data.csv') as $row) {
2 d# e5 x' X; [& o# v0 W print_r($row);
; b8 u0 Y; s9 ^8 Y. [ }2 M V; Z, o( y* J' [$ N3 H
3).生成器没有为PHP添加新功能,需要实现在数据集中执行快进、快退和查找,最好自己编写类实现Iterator接口,或者使用PHP标准库中的某个原生迭代器。+ J( e% } w1 ?: }, E
" s, D( D* D# B9 ]/ Q1 |
7 d+ A. s( t# t5 X c. }
来源:稀土掘金 |
|