管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
6 `- Y7 E2 M/ F
# D" M5 U" n5 D' h$ E) P8 q在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:1 S4 U1 s+ \: h( @1 X, D
% q( [4 G% W' B. M) n0 L
4 w0 J6 e" m: ^+ O8 y$ j
6 o2 a: Q. |0 h$ I+ D1 Y我们来详细的讲解一下PHP中的命名空间:0 J7 d5 l1 _1 [. T0 ~, i9 c
$ _- W: T; o( s; Y# N" J+ x! \语法:namespac_e 空间名\空间名;/ H3 k, u4 G! ^9 R0 D: g5 I
6 J$ e2 {6 M5 F c4 X+ y. Q
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:6 y- q4 L8 ^6 \* W
! J- x/ u- ~0 b) g
----------------------------------------------------------------------------# f [* y9 G- P* @( Z" D- i
/ Q+ c" A. H8 Y<php
6 J( _2 A, _' k3 k2 q+ B( i- Q
C9 N9 t! w8 }7 e+ Y9 i, fnamespoc_e AA;
5 v7 K( k v' D6 L# I% L! K6 @0 F5 Jfunctio_n showInfo(){
+ D1 Q/ d% I$ Y9 J* S/ M echo __METHOD__,'<br/>';4 H/ [, k8 G. j8 J
}
1 h9 r; a) W1 @' p# o8 Pshowinfo();) d$ f! p" J. Z3 N! q! t \
, ]8 c- U' z' h$ N- c9 Z- \7 Wnamespoc_e AA\BB;8 A, ?7 X, { M2 y1 e! B$ h, _
7 n4 ]+ P6 K. b/ g' V% bfunctio_n showInfo(){
& O8 w, E. l* H* l: W2 _' B- w4 i3 R/ M echo __METHOD__,'<br/>';
) B2 E7 u% X5 z" j; {}7 i. K) O2 Q z k% g8 w
//showInfo();
3 ~3 `0 K$ f0 ]8 ~, ~' n! O----------------------------------------------------------------------------
# U- d, v. F x2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const). Q: B0 S0 [+ x7 _% G. S0 W! U+ g
# o! v0 S9 |# L3 \# G- m
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
9 R! k. [& b1 t* M" H' | r3 q2 x7 m- B
----------------------------------------------------------------------------
* B; w3 k# V; B0 c" K$ d& F
- T& O0 v# `6 w<php3 _3 ^$ ]% K. ^8 ^2 _# w' @
namespoc_e AA\BB;
, I- Y4 @( x0 y/ W* O8 ^functio_n showInfo(){
4 I/ Z+ O, S5 T" P, F echo __METHOD__,'<br/>';' E6 Q/ e7 H8 u+ Q
}! V8 i0 m. w7 K. N
namespoc_e CC;
3 B+ r7 D8 { K/ }8 _5 Pfunctio_n showInfo(){
: ?# H% k* f+ ` J8 @2 z. l( d( d echo __METHOD__,'<br/>';
# W5 X1 G( s9 v8 o y. E}6 Z9 H. ~, d9 D8 ?/ [
namespoc_e AA;$ t) c& J+ M, T' \2 S
functio_n showInfo(){3 ^" }! ^! w$ o2 |) d7 [8 V
echo __METHOD__,'<br/>';/ k8 w8 b& T! `$ G
}; r/ k" q- ?- L" p: n9 I, n& x
//非限定访问:用于访问当前空间中的成员# a: l0 A& k2 s4 R5 c3 r' [" `
showInfo();4 I% F# @7 E/ n# d: E {2 X
//限定访问:只能访问当前所在的空间的子空间中的成员4 R, v' n+ j7 \% j* z7 Z* i
BB\showInfo();
1 Q7 w+ m% `; H, v8 w" Z' H//完全限定:可以访问其它所有的空间的成员
- z; t5 V# w: y+ Q0 I. Q7 J" @\CC\showInfo();
* ~4 X' L6 I6 i, i↑根空间标识符
. D) @# _: n& n. _% ?% g! }6 e----------------------------------------------------------------------------; U2 [4 L, c/ Z6 E
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
D6 m; E$ e4 M! p a$ i0 y: g- Y. T4 b- l: D' }
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间) {/ }" P8 J. } [
4 F5 h/ y& R8 N" G- j8 ], ~9 |代码示例如下:
4 R) y" `$ F& c
) r4 ?0 z7 Z" a' v----------------------------------------------------------------------------- |) W+ V, E, N0 T$ [( W. H
9 H" O. a: `, z! e4 O1 \
5 S% m4 @/ G/ z) C0 u5 Y. E04inc.php$ |( m2 t- J9 g/ N8 T# b; R# r
<php
; ~' G' x( b2 [5 g7 R0 ] N: r" @( X- l! R- N
namespoc_e Core;
0 U; H/ @) O, ^' O( @include '05ou.php';
* _& {# o9 {3 G; H! {0 anew \AdminController();
+ q. O% N3 b- L2 gshowInfo();
% n- F# S" d* o! u$ F1 `% ^9 q9 E0 }' c- H* R
echo P;- Y; B1 C, X2 v1 \6 F! H- f
//根空间中的成员,只要类的访问必须加‘/’; B) p0 n$ c0 z) v& q1 m" i
----------------------------------------------------------------------------6 W0 o8 M: C& K. j
0 A: k: V3 y+ K0 N) R0 x& J
05ou.php, N5 l5 E, W; n2 C: h- v( L6 x! o
<php
4 I1 S1 ?; Y) T. Q0 Xconst P=5;7 N( ^+ X' p `9 F; X" l2 O( v
& t# I- ?* c ?functio_n showinfo(){
% k6 s$ m0 B+ X7 \# D+ Z; b% S5 ]/ B echo __METHOD__,'<br/>';9 W. y& n' N4 _9 U9 G
}
2 c7 n1 B) Y2 B0 ^- U9 _+ s
$ K! ~/ z6 _+ v( U; Z0 y+ N% Sclas_s AdminController{
% D! V: R/ n7 b. n+ k6 u public functio_n __construct(){0 E0 _6 V* u% S, W. o
echo __METHOD__,'<br/>';7 f7 ~# @! y3 ?' j. B3 e% C& T
}- _3 D: ^1 X% V8 z# S$ r
}! ^3 f4 J. g8 b3 n, e/ S
/ |& f; b5 u/ J6 j# C0 L" L第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。4 t' P4 X( p0 q1 E+ B2 m; ]
----------------------------------------------------------------------------! v( K' |, `6 R" g) r8 ^
04inc.php
% P/ y4 `/ [8 c% h<php2 _' j# A+ ^9 h
; K- ^9 W" a9 B$ |3 L" v# Jnamespoc_e Core;
$ B3 Q/ ~; w2 {. [include '05ou.php';
0 ~8 S# i; `7 m" Wfunctio_n showinfo(){
4 M6 P/ h( G8 P echo __METHOD__,'<br/>';
7 U. @* k6 m {3 a, k; D}) T. Y! p" F0 B4 m, z5 u
?7 K2 O! R& N/ dnew \Controller\AdminController;( ^3 p3 i8 f, k- e$ l; d- o
----------------------------------------------------------------------------0 F5 R. w9 q* @8 c8 k- c9 f, ?
05ou.php% L( R1 E1 C/ \! E) S
<php
. J4 R5 T* x$ {' ~- Z, ?- [/ j. onamespoc_e Controller;
* B( G5 v7 X6 L* ?, h9 [; ^
! O( M; @* R, ]4 _1 lclas_s AdminController{
+ P" U* M1 g7 U. O5 N3 `7 c public functio_n __construct(){
8 Q! E9 v, F" _/ S- n echo __METHOD__,'<br/>';
% h; E; Z4 p: C1 u. M4 S }9 b ?9 L& {8 j% `
}% G% k; ~ g" ^3 s6 x u2 a5 |
----------------------------------------------------------------------------
5 m4 S5 V! J8 L: s$ ]5 I! N4 f- G) r: U2 a& u3 z% _4 n
4.引入空间成员:+ ?1 D; S: {9 G8 U7 G5 ]
1 D" f6 T; ~6 ?. X0 F; y" x1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。# I! h* k/ A1 c7 a0 C' I. k9 ^/ Z
+ D- \$ H0 L. |1 d4 ~0 |----------------------------------------------------------------------------
' J9 R, j) e2 O& `8 V% d+ ~( Y$ u- T* K9 X0 {; x" P( j4 ]6 t
04inc.php
/ t1 E2 m ?$ V' `3 e0 [) P; E. C: w<php# W7 U7 ?( L9 u1 u2 I
namespoc_e Core;
* F; G# z/ i& k5 n" muse Admin\Controller as con;& k3 j8 D0 h( ]' l2 v" M
0 @) h5 m5 {, x9 w% W. i
include '05ou.php';# P/ n. o; I, [ u
8 D* B) f/ [3 |0 m' Vnew con\AdminController();
8 w$ _* t& w* O: U; l8 N& K----------------------------------------------------------------------------
4 f* _4 {1 D) {5 n, k% O2 m05ou.php+ I0 f. T0 H) p7 T0 m7 I+ \- k6 J
<php8 X% c- d* u( W+ D9 O
namespoc_e Admin\Controller;! W1 W. x' F2 S/ E* r+ `
, R# t, A- w8 u: D' [, ` P
clas_s AdminController{! { \4 `, W1 s$ K
public functio_n __construct(){/ {5 ^/ ~7 B* d
echo __METHOD__,'<br/>';. Y# G. k7 P3 t H* K. \) m, ]4 J ]
}" C) p# C2 x5 O9 Q& e5 Q3 r, \& [
}/ p2 D! \* P s# {) n( o8 [( n+ J
----------------------------------------------------------------------------
; Q+ Z. J2 L: m* j; s9 M2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
# p6 K N$ w( N6 R0 O( U
, z% G+ h6 \9 E* K- C----------------------------------------------------------------------------% W* j% t6 A+ h' J2 x
/ X4 f5 S6 n; D* p& e04inc.php
/ n) Y- k+ U2 Q* ?" F) w, Y2 Q<php8 D( i; k3 X4 d$ j+ A( ^
//引入空间成员类
& w% Z8 X% c% u8 e1 C+ ~
; r% {# c% p5 L( V8 J4 y( {namespoc_e Core;; H% ^' a' ~# H/ ^
use Admin\Controller\AdminController;" V E3 a& u* g/ T8 z" N+ L
include '05ou.php';/ ~4 |0 p m2 d& c
; B, t8 P9 ]( S8 D9 M: z( W; u! L
new AdminController();4 @3 b d9 P1 V
----------------------------------------------------------------------------' X: Z% y$ X; @2 k& j+ A
05ou.php
7 v; k1 |! y) N<php" H; a5 Z. n0 d/ P( {" w
namespoc_e Admin\Controller;
4 K* h: I, E d) V6 s) Z* e
# X4 b2 C& J" g, w% R" ~5 F" Pclas_s AdminController{: e i( y- J8 i) D
public functio_n __construct(){
/ w9 B, ]- m) u: A7 E" E echo __METHOD__,'<br/>';: {7 I. E& i$ k2 @. N0 }
}1 `: l2 e: B" s6 x
}
6 i, k* J% a( a1 Z4 L4 a----------------------------------------------------------------------------
# ], T5 S5 E1 I: \1 d2 W" {5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。, M+ B7 [: Z% e! y/ N4 e/ r6 ]
+ w2 H+ @, F' O# D
4 K6 e* Q+ E- t) @* H0 L/ }; ^: u这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% ~: K' Q7 w! t: I G& ?" T4 F+ G0 k# X+ u1 M# q& X! p
, v% f, N4 k5 R( U! \, M
$ q# M+ ~, \0 R% X1 @6 I; ~
# Z$ Q' B1 s* Q% y
9 [4 M; F/ |7 j8 X; {2 ~
0 u: E7 O6 c" X. i |
|