|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本文和大家分享的主要是php的命名空间、性状和生成器相关内容,一起来看看吧,希望对大家学习php有所帮助。
5 t/ X" ?" @1 B0 ^: p# t, I6 o 1.命名空间- w6 T' m" S9 z9 Z+ D: |6 C
命名空间是什么?: q- V) b+ n2 x4 D5 h$ E6 h R
1).命名空间在PHP 5.3中被引入,类似于文件夹的功能。例如Symfony框架中的Request和Response,位于Symfony的命名空间下。
) p5 k0 D W+ N1 J" c8 [ 2).命名空间始终应该在<?php标签的下面一行。+ u9 _. U7 H+ J7 a j& j- U
3).PHP文件的命名空间和操作系统的物理文件系统不同,这是一个虚拟的概念,没有必要和文件系统的目录结构完全对应。虽然如此,绝大多数PHP组件为了兼容广泛使用的PSR4自动加载标准,会把子命名空间放到文件系统的子目录中去。( [" ]! l. {' g3 A) o
4).命名空间只是PHP语言的一种记号,PHP解释器会将这种记号作为前缀添加到类、接口、函数和常量的名称前面。
4 l/ b8 \( u- v+ x& w 为什么需要命名空间?/ _9 r7 K; D/ y, P6 [6 {* y
1).命名空间使得程序可以像沙盒一样运行,可以和其他开发者编写的代码一起使用。确保了自己的代码和项目可以和项目的第三方依赖一起使用。
3 U- M0 P& a9 t+ g G# [ 声明命名空间
4 D8 S) e/ W: a" J9 Q9 v: ~ 1).顶层命名空间经常用于设定顶层厂商名。
. Z) ]" d! C& S* `: c! E 2).厂商的命名空间必须具有全局唯一性,子命名空间就没有那么重要,但有助于组织项目的代码。
* I/ c. [& `& T# O5 h4 } 导入和别名
: M! O! d9 L% ` n9 f- f 1).从PHP5.3开始可以导入PHP类、接口和其他命名空间,并为其创建别名。从PHP5.6开始可以导入PHP函数和常量,并为其创建别名。
: c5 Z0 N7 e; r$ a 2).使用use关键字导入代码时无须在开头加上\符号,因为PHP假定导入的是完全限定命名空间。use关键字必须出现在全局作用域中即不能出现在类或者函数中,因为这个关键字是在编译的时候使用的,不过,use关键字可以在命名空间声明语句后使用,导入其他命名空间的代码。* m, ^3 \& q+ r" V! W
从PHP5.6开始我们可以导入函数和常量。1 Q2 W+ ]4 V/ \, f& A; y
<?phpuse func Namespace\functionName;
- Y: X' G* ]+ Q. R0 c functionName();2 t! E& x- G" Q" m
也可以导入常量,
8 f: x0 P9 n8 E2 w use constant Namespace\CONS_NAME;) m' c# @) ~2 J8 t' r: i. Z
echo CONS_NAME;% b7 h. }) W, ?$ ?+ W6 y
函数和常量的别名与类名的创建方式一样。' `' ^5 i7 K, k" h0 F0 n
最佳实践1 m9 {. e( U% ^7 s9 S& g& l
1).PHP允许在一个PHP文件中定义多个命名空间。但是这么做容易让人困惑,违背了一个文件一个类的良好实践。
5 Y& C0 p' d) c4 J# {0 h$ I5 U 2).在一个命名空间中引用全局的命名空间的代码时,需要加上\前缀,告诉PHP需要在全局中查找该类,例如PHP原生的异常类。
5 x! R2 x$ D3 h* ] 自动加载
8 ]) Z& ]1 y1 n3 ~" n 1).命名空间为PHP-FIG制定的PSR4自动加载器奠定了坚实的基础。
5 w) b1 S( y) u0 [: `$ g, Q( b5 J 2.使用接口1 h1 |- x% N- W: y, H
1).就像我可以选择开不一样的车。因为他们都有方向盘、油门和刹车,并且燃料都是汽油。- B8 G: _, X% ? ]) {/ m
3.性状& }- a4 p2 j8 C3 S2 L' ?
1).形状是类的部分实现(常量、属性和方法),可以混入一个或者多个现有的PHP类中,性状有两个作用,表明类可以做什么(类似接口),提供模块化实践(类似类)。4 r! B1 [ _3 K' Z
2).性状使得两个无关的类可以使用相同属性和方法。
( c& a/ S# W" d& D 3).PHP解释器会把性状复制粘贴到类的定义体中。
0 |4 ?. V* q0 X1 }7 E 4.创建生成器
' s a* y) l$ c! q2 B) ^. j 1)在普通函数中一次或者多次使用yield关键字,不返回值,只生成值,这个函数就是一个生成器。例如:
' [0 ~, g. A' T w/ k1 E <?phpfunction myGenerator() {
# }2 o9 D2 v7 f2 |3 A7 g5 N' X yield 'value1';
9 S/ |& M- M% w( B yield 'value2';
5 [+ o4 `2 p0 @6 w3 d }
u! _: z1 P& l. I& b/ } 调用生成器函数的时候,PHP会返回一个属于Generator类的对象,这个对象可以使用foreach()函数迭代,每次迭代,PHP会要求这个对象的实例计算并提供下一个要迭代的值,生成器的优雅之处就是在每产出一个值之后,生成器内部状态会一直停顿和恢复之间切换,直到抵达定义体的末尾或者遇到空的return;语句为止,例如:
7 d" h: s6 @5 j6 D2 g6 c$ w* o' G <?phpforeach (myGenerator() as $yieldedValue) {
9 F" j; ^: c( U! r2 p% e echo $yieldedValue, PHP_EOL;% o) b5 Z e s. s" L
}) ], B+ `( j2 D( m& s
以上例子会输出
% j# \& ~* w" F# [+ e value1
$ V* e* X0 [1 [' _3 j value27 C5 R6 B& B f( @0 W6 V5 M3 n
2).生成器是如何节约内存的?生成一个范围内的数值(错误方式)
" G8 M" x8 E: `+ K4 D8 u8 H function makeRange($length) {
4 U0 y1 R3 {7 W $dataset = [];8 r) s% r/ |6 ?* R9 I/ z+ z
for ($i=0; $i < $length; $i++) {2 ]$ _- ?5 T7 U! \9 r
$dataset[] = $i;
?% V* t8 C# y }
; Y) Z8 {" ^+ s9 _ _ return $dataset;
$ [# M3 m/ v6 M8 K X }3 Y3 \) `2 G! t6 S5 B9 l( y2 y
$customRange = makeRange(1000000);foreach ($customeRange as $i) {
3 t+ U& H8 B0 b/ b' X echo $i, PHP_EOL; | g/ U4 D& d0 w7 @5 @0 J
}" c! t# I& o/ {% w/ Q( c
预先创建了一个包含很大整数组成的数组,再看使用生成器的例子。
3 }3 v' D) n$ d3 T; C, a7 q function makeRange($length) { \& n1 `8 d, i" c- U; k
for ($i = 0; $i < $length; $i++) {
( a4 a# o8 Y' m yield $i;
6 ^5 O; z9 A. ]" T1 v }) m) H1 z3 B( Z- U2 y8 C# K
}/ i% N! d! X5 X- y2 D
foreach(makeRange(1000000) as $i) {
6 F- f+ O" B3 j3 R; ^" R% E+ O7 v echo $i, PHP_EOL;6 c+ {! C) \, G! y& F2 X
}0 J5 A7 C+ c5 J3 u
在实际的例如迭代一个4GB大小的文件中功能中,迭代器大展身手。
8 \4 T- J* H0 Y0 h m: w1 Z function getRows($file) {' y0 C3 {" G7 t) x
$handle = fopen($file, 'rb');: j& i( ]7 I/ o, ~" K: H) a
if ($handle === false) {
6 c* F ]4 }: e' F y: q) x throw new Exception();
9 Z9 o/ N% R- j9 {! Y# G9 ? }
! P& X+ a1 t& @. m //feof()函数检测是否到达文件末尾
0 E4 R/ q" r% `' A while (feof($handle) === false) {
h& _; I$ Y# p8 N% x3 K% K4 | //fgetcsv()一次读取csv文件的一行2 e7 r% ?2 d; s4 e5 u+ e3 |
yield fgetcsv($handle);6 n7 @. z" t: `3 }) M. Q
}: G6 v# E/ X: \
fclose($handle): e# [1 H/ w7 N3 n( m4 T y/ o
}
8 M& Z5 J* w% X( u. a foreach (getRows('data.csv') as $row) {
; s2 e1 i- y8 \( x- ?8 f9 G print_r($row);" v1 H/ ~ @' d) W) l/ {: q
}( n: X- x- E& H9 }
3).生成器没有为PHP添加新功能,需要实现在数据集中执行快进、快退和查找,最好自己编写类实现Iterator接口,或者使用PHP标准库中的某个原生迭代器。
# {4 R- N$ ?2 c h D
5 c* V5 v1 p9 M7 j
' p2 z8 m& h' R/ m+ L" ]5 A来源:稀土掘金 |
|