|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本文和大家分享的主要是php的命名空间、性状和生成器相关内容,一起来看看吧,希望对大家学习php有所帮助。' F9 i9 i8 U' q3 } w8 \
1.命名空间- M- {/ o: Z4 H7 `+ |+ p+ h+ w6 x
命名空间是什么?
% Q8 y3 @$ b3 R( C! f S# u9 B6 V 1).命名空间在PHP 5.3中被引入,类似于文件夹的功能。例如Symfony框架中的Request和Response,位于Symfony的命名空间下。
( n& w3 |* E' I; o 2).命名空间始终应该在<?php标签的下面一行。
8 B8 V% U3 c- @ 3).PHP文件的命名空间和操作系统的物理文件系统不同,这是一个虚拟的概念,没有必要和文件系统的目录结构完全对应。虽然如此,绝大多数PHP组件为了兼容广泛使用的PSR4自动加载标准,会把子命名空间放到文件系统的子目录中去。3 |* [& u Q% S
4).命名空间只是PHP语言的一种记号,PHP解释器会将这种记号作为前缀添加到类、接口、函数和常量的名称前面。) ~. w; }1 I& g! l; e
为什么需要命名空间?
7 J& `1 t3 I6 U2 c! ~: B 1).命名空间使得程序可以像沙盒一样运行,可以和其他开发者编写的代码一起使用。确保了自己的代码和项目可以和项目的第三方依赖一起使用。3 S0 e$ o, g- {7 G( g
声明命名空间
5 g1 H" }# I0 ]9 j 1).顶层命名空间经常用于设定顶层厂商名。
$ J& O: p5 |, n& j) {7 k' ? 2).厂商的命名空间必须具有全局唯一性,子命名空间就没有那么重要,但有助于组织项目的代码。
" C- O4 q" G& f 导入和别名$ L% e2 n* ? R5 l7 s
1).从PHP5.3开始可以导入PHP类、接口和其他命名空间,并为其创建别名。从PHP5.6开始可以导入PHP函数和常量,并为其创建别名。
1 r" u9 g Q2 Q; c2 ~! x 2).使用use关键字导入代码时无须在开头加上\符号,因为PHP假定导入的是完全限定命名空间。use关键字必须出现在全局作用域中即不能出现在类或者函数中,因为这个关键字是在编译的时候使用的,不过,use关键字可以在命名空间声明语句后使用,导入其他命名空间的代码。7 C! v, B4 s0 U4 @9 D* g- }
从PHP5.6开始我们可以导入函数和常量。4 L4 R% k) h3 I& m
<?phpuse func Namespace\functionName;
) ]! M. Q4 H; y, H& j/ `6 E9 _# _" [ functionName();6 L( F; A" P# p v3 T0 y: M
也可以导入常量,! Q- a. R( h* l, `. N0 [ s! e
use constant Namespace\CONS_NAME;
" T2 d' |, c, i3 L, | echo CONS_NAME;
, H: X o* h/ l 函数和常量的别名与类名的创建方式一样。
( {' u2 i- `4 V" b 最佳实践6 F# `- G, K7 @& A! m6 Y6 v3 p
1).PHP允许在一个PHP文件中定义多个命名空间。但是这么做容易让人困惑,违背了一个文件一个类的良好实践。
& \1 C6 f- Z6 a$ w2 v v: p 2).在一个命名空间中引用全局的命名空间的代码时,需要加上\前缀,告诉PHP需要在全局中查找该类,例如PHP原生的异常类。
$ b/ F2 q" m P9 H$ h 自动加载6 z# z$ P8 i* r( P9 M
1).命名空间为PHP-FIG制定的PSR4自动加载器奠定了坚实的基础。
2 L0 D0 w/ _4 a1 h/ ?& c$ P4 z% N 2.使用接口
% ^* t+ ]# i& j 1).就像我可以选择开不一样的车。因为他们都有方向盘、油门和刹车,并且燃料都是汽油。7 n% l; d+ _3 B: n) D0 U* x' T
3.性状
( }( C5 m3 A$ U6 A 1).形状是类的部分实现(常量、属性和方法),可以混入一个或者多个现有的PHP类中,性状有两个作用,表明类可以做什么(类似接口),提供模块化实践(类似类)。' L, Q9 \# t( m* X2 K5 A6 S" f" M
2).性状使得两个无关的类可以使用相同属性和方法。9 P& b: T) ~$ y3 T$ Y4 ^% `' D
3).PHP解释器会把性状复制粘贴到类的定义体中。
, I+ I% q9 S0 N/ O) e( ~0 ?1 ? 4.创建生成器4 B* v, ?, \( ]: |
1)在普通函数中一次或者多次使用yield关键字,不返回值,只生成值,这个函数就是一个生成器。例如:) n6 w1 N" @: m: l7 z3 Z
<?phpfunction myGenerator() {+ M5 r7 h/ |9 a- N- ]# M7 ^
yield 'value1';
0 F7 r9 R+ X0 o2 {4 g, h% Y( q( Y% | yield 'value2';3 M8 }- m7 j6 B( z8 W
}
' [0 Q2 y3 {2 g2 I 调用生成器函数的时候,PHP会返回一个属于Generator类的对象,这个对象可以使用foreach()函数迭代,每次迭代,PHP会要求这个对象的实例计算并提供下一个要迭代的值,生成器的优雅之处就是在每产出一个值之后,生成器内部状态会一直停顿和恢复之间切换,直到抵达定义体的末尾或者遇到空的return;语句为止,例如:1 \: q, d5 y7 h$ }8 A, ^2 \
<?phpforeach (myGenerator() as $yieldedValue) {
5 h3 ?0 c8 I5 K4 G echo $yieldedValue, PHP_EOL;
. E4 p# T9 t6 q' M; b% R1 ~ }
4 k& Q0 o4 k4 T% N# d8 G! N ]& A9 m 以上例子会输出8 d0 t( @9 ~* U5 t
value1
7 ]! \3 H7 k5 P value2- n) H+ j2 H3 V! n4 ~+ l4 R* c, `
2).生成器是如何节约内存的?生成一个范围内的数值(错误方式). q" b8 R+ u" K
function makeRange($length) {
' Z/ i) r {# Z/ O5 B $dataset = [];) J$ K: D$ C1 V9 h9 B
for ($i=0; $i < $length; $i++) {# M* s2 r' U8 ^" p' e
$dataset[] = $i;9 o X5 P. H7 O
}, y# z9 c3 L/ L6 \4 L
return $dataset;* x+ b$ G0 @8 B# J5 \: _
}/ F" V7 D5 X* F# A q' B4 A+ g/ B
$customRange = makeRange(1000000);foreach ($customeRange as $i) {
5 b* u% F2 Q: @: H echo $i, PHP_EOL;# o, y) ~4 P: D. [3 z: r7 K
}
% e6 d" I: B( m' ^' z 预先创建了一个包含很大整数组成的数组,再看使用生成器的例子。9 }7 M1 j2 I! e" f* a; D
function makeRange($length) {, p) Y5 J" e4 E- H6 [5 a/ F
for ($i = 0; $i < $length; $i++) {( Q; p. j$ A7 D N
yield $i; h- ?% ?3 ?4 ?) t: a) A V
}
. r9 _' d/ D1 l- w" p }
" W9 J) S: O; Y foreach(makeRange(1000000) as $i) { j, P) ~: \0 ^ j5 w% Q
echo $i, PHP_EOL;3 R/ {6 d0 U( g* w3 [
}: b$ ^- T. x( V! ?2 ]+ P
在实际的例如迭代一个4GB大小的文件中功能中,迭代器大展身手。2 w9 W" J7 D8 h. [$ K7 N0 n
function getRows($file) {% x4 p v# G& ]' {7 r
$handle = fopen($file, 'rb');
: ]9 b @8 Y' _" Q5 i- Q; f if ($handle === false) {, j+ h; t' H! o3 [2 Y6 N2 H5 D+ z
throw new Exception();7 K2 j; U4 j: |0 h( B
}
/ r6 B: K; E+ f# p //feof()函数检测是否到达文件末尾! k: l" y8 h% _4 @- w- K
while (feof($handle) === false) {$ q. s5 L! O4 \9 y3 T- c
//fgetcsv()一次读取csv文件的一行; A' I" g8 F% W! w: t
yield fgetcsv($handle);& e" J9 i+ h! V5 T1 ], J( y
}
2 z& Y( V& o* _; K- T. p9 L& ?6 e; F fclose($handle)
- G5 z4 h; t% l7 m }$ d2 R. M3 W5 r& n
foreach (getRows('data.csv') as $row) {
; r- x; L1 t1 b0 K2 l+ F# N* u print_r($row);4 C6 u7 L7 X1 r! d! N) B" h4 C
}- |) B! }" ~% E( U1 g- I3 z+ y
3).生成器没有为PHP添加新功能,需要实现在数据集中执行快进、快退和查找,最好自己编写类实现Iterator接口,或者使用PHP标准库中的某个原生迭代器。' L9 m# M. T3 F2 F/ h q0 ]
, M; F1 X6 {* `2 H' h/ t0 _* |* o9 _! y1 Z
来源:稀土掘金 |
|