管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:2 p0 ~5 a. C O# s
- }: D/ \ w8 n/ c8 ^
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
X1 R2 u; f6 B( P; a
! U8 F- V: |7 x, ^5 f3 F+ \
* r g, G: T0 T# {. R7 c( s% S( R+ v, |% t# U; H
我们来详细的讲解一下PHP中的命名空间:
9 Y# I; {! d- D/ {/ u9 o& i: s2 a/ W+ k3 e! r! Z
语法:namespac_e 空间名\空间名;1 F& }3 H, ^1 a4 p6 J7 ^
" z5 Y. t1 V- A. m说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:/ b; u" R" Q* U/ P; f1 I
9 _, O9 q5 M' _& ]9 r5 }2 z9 ?9 ~----------------------------------------------------------------------------
% J# Z( [2 u7 c
* E' r P( G6 ~<php- L9 }3 E) a" e! T4 T6 w4 w
% m# T/ m9 C6 Xnamespoc_e AA;
# H) N( S' W4 a* d. |: s5 J; ~) Zfunctio_n showInfo(){
4 Z% l$ G: u+ O+ a7 F! T echo __METHOD__,'<br/>';
, x. ], ^4 Z" p6 [0 M8 J}
% Q! b! N9 y# j7 J M9 {9 c3 c4 w2 [& Ishowinfo();
8 b& x7 \# y0 h, ]& S5 d+ H% e
% B. ~. N- S* z$ q( N0 X7 @namespoc_e AA\BB;7 v" x, f ?1 y( V+ d: T, @
0 t K& Y3 U7 v' @" f, wfunctio_n showInfo(){
! v# |; [& o; N9 u2 {" D. D echo __METHOD__,'<br/>';5 n8 M" N1 i" l4 G% C2 F
}5 V, m2 N9 S( [4 Q$ _- N7 l
//showInfo();( u. v; z' Z5 b
----------------------------------------------------------------------------$ E1 R' K2 p S7 @4 l
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)& J7 e# g" W' F% ]5 r
+ S8 A8 @2 N4 M9 P9 G2 \ v2 ^5 c9 T+ _
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) |% _/ {" r/ G' |2 `( D2 |& p: v P q7 P. n
----------------------------------------------------------------------------
* i. S1 k0 f, w9 ^2 L2 @4 B: L+ J5 `8 S) L* y
<php
/ E3 D+ R* s7 f. Q# r# ]namespoc_e AA\BB;5 R) ]% Q+ R. J& Z2 ?- X4 `5 h
functio_n showInfo(){
( C4 P& |, r( I8 d$ G3 k0 F echo __METHOD__,'<br/>';8 q, g' w) k. Z5 S$ P
}" c' B: H$ ^1 u
namespoc_e CC;
$ L/ X! F9 i+ ?0 E7 \functio_n showInfo(){7 `) l; D0 C ]3 d3 p! M
echo __METHOD__,'<br/>';
7 a2 E( T/ _! V- n( `# I}' s8 p, @( [: \; R- k
namespoc_e AA;1 D6 x8 U7 K3 b9 ^7 w. @
functio_n showInfo(){
- d# I, u) r* J! H: P8 f- A# D" I echo __METHOD__,'<br/>';" W" V, ~* u+ _* [$ I0 M9 m b
}3 U2 i I- m% M2 d+ t9 H& v
//非限定访问:用于访问当前空间中的成员
: r7 _# K/ @" b$ }' m, HshowInfo();* y I# Q3 T& t3 ?6 d" x
//限定访问:只能访问当前所在的空间的子空间中的成员
& S$ t9 U' k$ S/ SBB\showInfo();; A* p( M8 {0 L6 y O: z. K( ]
//完全限定:可以访问其它所有的空间的成员 [; h6 t+ n$ \2 M! j/ k
\CC\showInfo();" G7 B" ~6 s, x. G3 t
↑根空间标识符
3 p# e4 h4 ~" y, n, O----------------------------------------------------------------------------
7 U L- k7 A# E2 G3 Y0 q但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:: Q/ |" b# j" @# @
$ F( H. E" O5 F) [当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)- `3 Y+ [- y1 u% i; h6 b& p+ X
" m% z6 Q t% ?. h代码示例如下:
! D; b" X* i& P3 x9 |4 I
" g6 T2 D+ J" U----------------------------------------------------------------------------' N4 |. E. O3 N5 w8 w
4 q, D. l) e7 U4 _
+ k9 _& g+ P3 S3 m/ W6 R& i2 F- S3 q04inc.php6 x$ Y8 o. z, M( |9 J
<php
0 j6 ^& S% \ W( V0 G# u. p" y. G' |* `+ d6 a8 D2 D
namespoc_e Core;8 I. D% @0 Y6 U
include '05ou.php';
% C, S# \4 K: Anew \AdminController();; Y7 U6 l/ |4 j q
showInfo();+ `. L# @2 ^' ?0 Y! |3 `3 i
+ g1 y7 I# m- U0 ^% `2 |
echo P;
- R2 K6 L9 |$ q g D9 O, ~//根空间中的成员,只要类的访问必须加‘/’: ^5 I; i) T+ |1 P" D; N c
----------------------------------------------------------------------------
! T' S# F$ |4 i8 }- `" P
! n( z7 r+ s; S1 l1 k05ou.php' n$ B0 F% \3 u* Q' D
<php
+ g% x, d0 p* }+ T/ ]" P" T0 Oconst P=5;6 R- a6 o* S- ? \
l2 D2 v: t, Y7 b/ U: }8 z
functio_n showinfo(){
% X3 b3 n/ R$ m; D; J+ J2 ` echo __METHOD__,'<br/>';
! v9 K. M/ b( i$ Z) J* N9 W: A2 A) i}
6 x- i( A8 w- m9 C
2 J: m, ~/ t9 C1 P/ n( J7 |3 xclas_s AdminController{
8 K: ]) d9 m+ `3 a public functio_n __construct(){
' T; d3 Y3 J, _9 p echo __METHOD__,'<br/>';7 c# U) P% g. u# w" w
}) t8 d3 h: e8 b6 L% A9 [) l
} ~. R& M2 N$ K Y
" l' \$ |+ O+ e# Z: ~8 N! I! c
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
G+ R$ m4 c6 A1 [0 b$ a----------------------------------------------------------------------------: H# W$ d9 h) q, x1 R+ Q1 j
04inc.php
8 V5 v1 e2 h4 K" z3 b. U<php
- F) R1 l9 d% N2 p8 m( ]! E
?0 ?! N& r2 X4 t$ y, Q. vnamespoc_e Core;, n" {( `2 x' W- M
include '05ou.php';
% b# R3 N: @7 `9 o" {: e1 ~functio_n showinfo(){& G n/ j4 }$ w x' h) I1 L: l
echo __METHOD__,'<br/>';
. q' S# \" ?2 F( s}5 u6 q$ n/ i. J* o- P
7 C3 S3 `: b3 X- f. |new \Controller\AdminController;
; m3 R, {3 z. ?: b+ f. O----------------------------------------------------------------------------
) ~' `& B: q9 `05ou.php5 x( ^+ I; i/ r* t
<php3 Y2 |( l& X+ @) s7 _/ A
namespoc_e Controller;- @( F' w. K* b7 O
0 @/ ]0 Q7 M1 p
clas_s AdminController{- r' S0 a# T% {" _/ l/ p1 g' o
public functio_n __construct(){
1 E; `0 S4 y5 v' Z- r- g echo __METHOD__,'<br/>';
/ k# e& M3 w/ ~3 p3 X- ~ }# H* i$ n9 r+ v; X( U
}0 N3 d0 ~) _* `6 @6 d8 u& D! s- G: y
----------------------------------------------------------------------------
* }. w1 \9 U7 x8 |& z% d3 ?8 a) h& ]. k/ R( l- O, j) ?( H7 o
4.引入空间成员:0 v! e$ R! f" ]8 S5 y
' j# x2 C u2 ~( _1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
2 V2 B+ ~, B' R
2 o) } }$ b& Y3 s# ?----------------------------------------------------------------------------! r3 ^( F% x' x2 y; a2 w# ]
! S% L' A7 z' b7 W9 u& v1 W# J7 L% W04inc.php
$ V$ h* s U) |4 }" _( h: p<php+ d5 x6 r. R( G
namespoc_e Core;
8 ?: H3 d" P6 A3 Q0 x' j& Huse Admin\Controller as con;6 k; s: r3 p" h6 C* W
* b1 h. w' W6 r4 _7 |, W8 C2 P7 Uinclude '05ou.php';( A$ F0 D1 v% \& b/ X: l
5 s, A& N$ M; D. enew con\AdminController();
; D n4 z1 b: S, n----------------------------------------------------------------------------
$ c J7 m* U+ ?0 c( Y. W( M05ou.php
4 {- T: C, ~$ b& B% s' `/ j<php" |0 K$ c- j9 D: E- v6 o
namespoc_e Admin\Controller;8 `5 I0 \7 G# z* c. c6 O5 W
% ?3 u- y' j+ E* m5 \
clas_s AdminController{& |# _: C; l/ `1 ^9 T( O5 q# A" |6 o
public functio_n __construct(){
6 Y1 i, |) X8 B" O q% {: F& s9 y echo __METHOD__,'<br/>';
2 Z4 q2 u K6 ~! G* j4 ?& u }& k! V, p# D' b2 c) V
}
, X% w2 o# C3 R. m----------------------------------------------------------------------------
5 H3 d1 P" u' E' q0 o1 U. e. E2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
) O6 n' R# O8 F; B# w- Q0 O+ W8 l4 V2 D
----------------------------------------------------------------------------
1 v/ d" H" C0 N/ I" {% N
3 t1 x" |! N @: T04inc.php7 i. }" V& }" {, p
<php
) P1 A1 ]# a3 z5 ?- r/ B7 C: p4 y3 X. |//引入空间成员类
1 [0 s/ H k" I- q6 v/ I) H
: l5 e2 B4 \. Hnamespoc_e Core;
3 h$ @9 E/ _) R% @- r9 Ruse Admin\Controller\AdminController;5 c" _/ y3 H$ |4 V! F1 V
include '05ou.php';" t5 t) h+ @3 J. D) d4 U
( ?8 x+ `! v2 z/ N, Z9 v, v+ p) C" c
new AdminController();! C( I/ E/ J3 [0 n0 n7 S
----------------------------------------------------------------------------* o2 N* b& {) Y% G
05ou.php
" Y! r! W* W- _! ^& U) O2 A, S<php* p$ K( Q+ V u
namespoc_e Admin\Controller;
: v5 G' X- c0 E( s# @1 c8 Z" `
( _9 a; [5 b. c8 O9 V$ ~( G" y3 cclas_s AdminController{9 o& w% C3 T( G) o9 j( K% W. e
public functio_n __construct(){
6 D9 {7 C1 E( Z2 Z echo __METHOD__,'<br/>';
3 c0 f% M+ ~# l }
5 X0 D& ^* O7 X+ |! q* c}
( H2 m6 }) k+ o4 V3 i----------------------------------------------------------------------------
D& m3 q: e3 U: K i5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。, K- M7 U7 T6 q3 _( O% i- h
; ^0 F) o/ f8 w- s7 T# y4 E
0 Y# `1 t6 M# A" Y6 }这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。) ?* U( m/ F( S0 g& t6 h% \- w
O8 n1 v1 i1 [2 B# W
1 M; s5 M% O5 c) @* x/ b2 N4 a
6 r/ a" l) t/ s0 R9 [0 o: }. g9 e
; W5 x! p/ O- C Q; v$ U0 E4 @
|
|