管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
. B9 W* x0 v5 w% n, [: \4 w5 y0 ~) k: S4 P
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
1 o/ j# T! H0 k6 a2 S4 L
i5 e: K' o1 H! Y8 w# _% I8 K
) G: }* _8 T# K* l8 Z T7 F! ~, a5 s& f! c; j9 l9 e9 k: a
我们来详细的讲解一下PHP中的命名空间:
" U9 V/ J( `) P, x& w7 v
( V a0 O1 Z. D; [* m* S语法:namespac_e 空间名\空间名;4 R4 N& w3 T& C9 _
0 F2 T5 C& a& f/ w5 L; @' Q说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 ~: t2 O8 X# B- b, }. L8 m! q
4 {- z3 O: D3 k8 S4 H- h* f----------------------------------------------------------------------------
+ ^- f$ a# O2 G: V
$ r. ]2 v8 {6 u) t% V<php# C" v% X2 M5 z6 `! E* e- q
# R& y, k7 s9 @$ f/ n2 e' r0 Fnamespoc_e AA;
9 `! c8 ?. x+ y% s( {functio_n showInfo(){
& e. P; x( g5 u) u5 U echo __METHOD__,'<br/>';6 b: [! \0 j8 o; S. a0 A! @/ j: m
}" B- ]) P4 ^& N2 s/ J
showinfo();% r$ t" ^; i4 t4 ~
' B# O1 e0 F0 c8 R9 m$ t
namespoc_e AA\BB;
3 z! i) R& r0 u$ }/ M) ~4 v6 S$ P) [- v& l! X4 ~' ]: g
functio_n showInfo(){* v x# x& l' N0 z7 E8 y% j
echo __METHOD__,'<br/>';
3 u, z$ S! G- Y5 w& O9 n$ b}' [( o7 h: C* q/ u( L
//showInfo();
/ C* S1 H* i4 |; q: \6 q N5 ?) ^----------------------------------------------------------------------------
% O; O$ ^* }4 `, q0 L8 T! x$ {2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
+ q$ h2 q5 M8 S# { Z8 R5 }
; n _4 S( O2 `* r: T0 i3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
7 m2 k7 G2 l; H$ w" W2 W( ?4 O: K7 n R6 t
----------------------------------------------------------------------------' @+ D- F5 ^5 P: x$ {
6 p( Q* I0 C$ Z* z% N1 I: l1 \<php
+ ?* g6 C5 ~, v4 l' snamespoc_e AA\BB; I- ? `) x" ]1 P$ ?/ ?( |: x
functio_n showInfo(){
( i1 u4 _$ Q! G( J2 z# W echo __METHOD__,'<br/>';0 U4 @7 U0 c* h
}
3 c' n; x7 t( G znamespoc_e CC;! T7 \7 @/ w6 u2 W
functio_n showInfo(){/ x4 H9 A2 ]; g7 m
echo __METHOD__,'<br/>';
% D% P% ]- r7 P8 k' A b}
' _. S M0 q: {namespoc_e AA;) u' B; P( Y7 \; M
functio_n showInfo(){" `5 d8 x+ m' q! ~# y
echo __METHOD__,'<br/>';: E4 [: m! f1 v2 g' P$ n$ F
}
0 n9 C N! y2 H% L* s C//非限定访问:用于访问当前空间中的成员. z+ d1 R1 b. o
showInfo();
1 Y. k; }* P3 u, Y3 m9 d# N//限定访问:只能访问当前所在的空间的子空间中的成员
, @1 ]1 n) E0 |+ tBB\showInfo();" `6 G" c2 O% I; h, J2 Z
//完全限定:可以访问其它所有的空间的成员
, p8 w, w: M+ P, S0 |1 A3 [* [\CC\showInfo();
3 `. k7 w8 ]7 Z) g4 Q5 w: O% g↑根空间标识符: \+ A |, r5 j
----------------------------------------------------------------------------% L: J0 |- m; \3 V, E0 t8 Z, [
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:! O' A& a Q& f( D+ o
* j8 K& i6 g# T, f
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)+ t( x: s' f2 l; s
/ W8 r/ ?; g( q8 G( o5 M代码示例如下:# q$ h# h3 G# r9 {+ j& @4 I7 A: @
. J$ D3 Z* d: t# ]8 o# n
----------------------------------------------------------------------------
+ B+ D! o+ Y7 M0 q7 w) q1 i/ f: Y6 h1 x8 N( y
" c: R! p" {$ D- f" |( g8 L, u9 A, n
04inc.php! l; d+ E. V+ }
<php, ]$ P) f) {8 E4 N6 F$ I. A
( `/ w" Q& @' [& k
namespoc_e Core;# X5 l5 X5 ]5 i% r7 _$ x! t( Z6 v
include '05ou.php';
6 z$ p% u, f/ |8 c, ?# H) unew \AdminController();) m: i# s; ], Y
showInfo();/ z l: E( R+ c- B; r
( ?. K& |. k0 c9 y8 Secho P;+ {$ [* I$ I' B+ n$ p4 K2 k
//根空间中的成员,只要类的访问必须加‘/’
9 }$ F% O' W4 w' H% ?----------------------------------------------------------------------------
2 Z+ h `* W s( v. ] W+ G
4 F- }) v+ W$ ^- e4 V05ou.php
+ Q0 `! P) l1 T<php
0 h4 V5 p$ v- X3 R7 y, b9 r5 Mconst P=5;
( T H0 U% Y4 x8 j( r6 V& @
: Z" j" T% c' ^5 }9 { C3 S9 s5 b/ ofunctio_n showinfo(){
& F0 G/ y- M l' k1 M$ { echo __METHOD__,'<br/>';
: l+ F% l- q$ @3 ?, c& G2 n}
( H+ v1 U! {1 Z$ ^% w5 r. | _: f5 S: e- p0 M y4 L, ?
clas_s AdminController{
- v0 ?/ {5 N5 h2 i9 ] public functio_n __construct(){, ~4 c* A2 A/ F( f3 t# Y
echo __METHOD__,'<br/>';
: Y( b$ z; c8 V% O }- A0 H9 M/ p+ G' y
}
6 S- c% h8 e2 i$ q/ S& y' J2 E* M/ H( o# n
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
6 ^; y4 Y; J3 B----------------------------------------------------------------------------
# m/ t+ L+ \# `; p5 x' @0 u) c04inc.php6 }7 J7 W- s5 r/ J" z
<php
* C. t, r' \3 B! |
" P9 R* u1 e+ D1 F" |namespoc_e Core;
! Y0 g `: ~# |. a# v8 V0 q8 W9 }include '05ou.php';! F# w# |8 k' N8 S- I. O0 R* U% \
functio_n showinfo(){+ ^) I. Y% D7 m5 ]: C1 q" u$ ^) i
echo __METHOD__,'<br/>';
" [1 O% b. Y3 N2 {}! T9 k7 E# r6 C0 G- G" {; f) w
, c7 y0 S' ^0 g" y( i- I! V( Unew \Controller\AdminController;
6 U E. @8 R. y& K* k( m----------------------------------------------------------------------------
" h2 V% n0 f6 c, `9 W05ou.php
[6 E0 |0 n# b) q* k<php
+ B& Z5 I6 D+ w: Xnamespoc_e Controller;5 {' C8 S% n) N! u) `; D( s, X
( p. O- A# K: h8 E
clas_s AdminController{
2 k6 F( }" D! o2 D public functio_n __construct(){
5 `; q5 O ?. D3 Y; C# J8 |4 x; M1 h4 c echo __METHOD__,'<br/>';+ }. u) g& F" S- G
}; P! X, e: L/ h, q- ]* ?
}4 d5 B' l- u2 s& x
----------------------------------------------------------------------------
" o& e/ ~, {* M$ b9 ?4 ^4 I5 D6 X& I3 t- w7 V4 _
4.引入空间成员:' t/ ^" L3 o6 ]6 k3 c+ m% N- }2 g
0 V5 }& W" R6 M1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
7 Z& b% b( r: S3 n# y( O2 k+ { O' d# h7 ]/ u) i
----------------------------------------------------------------------------
4 |) R6 n& P/ n* k1 G/ m5 W# Z2 w. W! F4 O6 S0 w9 s; c
04inc.php/ ~9 g. ]- T/ b( C+ i4 R
<php
1 G" V8 G. ~1 Z* F( j( }4 S$ g+ knamespoc_e Core;. r# r' S \* o$ h
use Admin\Controller as con;
5 k" Q; l/ o: m% A) L$ w& a+ `! d/ c8 Q! h# p; W
include '05ou.php';& s1 @" c/ J( P
0 t2 D3 ^+ g2 W: w9 @
new con\AdminController();/ B. K3 O8 J+ u5 e* w |
----------------------------------------------------------------------------
, O" h/ y6 _0 J1 Z+ M! Q. X05ou.php( Y8 |* s& r4 u. z0 g
<php
; q3 y3 n9 C9 t6 S, Wnamespoc_e Admin\Controller;
: _* K) L0 ]5 @- m, ]- ~4 B* ?( c7 W7 ~/ r
clas_s AdminController{
/ a" {/ |; l. ^6 O; N( d' P public functio_n __construct(){2 l2 l" u- x; d: z5 w5 H
echo __METHOD__,'<br/>';
|' D) W* F3 N3 k6 P }
+ E4 h, R5 X1 N; f4 H2 X ?}
4 y/ q9 }+ p3 c, Q, D----------------------------------------------------------------------------
( P$ r8 r# }- B0 e, k3 L7 \2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
/ ]: f% Z- P2 g, A0 H" o
: j1 h R. \) ~$ h6 u( i# q; @& Z----------------------------------------------------------------------------9 i4 D2 }6 r3 c( @! N1 U7 _$ x
7 { S/ ^2 Q) d' J0 b$ i# H
04inc.php9 a6 }9 [# a- ]' X0 w: F- t
<php
+ Q; l; W( O0 u( w" E+ o4 W//引入空间成员类
+ I9 s8 W* [( G U$ @, `) B9 \; m! Y) J2 I9 H+ ]9 y3 Q
namespoc_e Core;/ V# ^. m0 }2 T. ]$ O1 B
use Admin\Controller\AdminController;! w. Q2 L4 e9 }) a" b
include '05ou.php';7 { y4 u' g' x3 E3 \7 e/ I
) p+ |' x) ^- B# tnew AdminController();! g8 t# H* e: F# ~
----------------------------------------------------------------------------
+ b: ^4 ?$ m. I" O1 x6 b) x05ou.php$ N' `+ K; T# g& x
<php/ F8 E: i8 x8 H L& P& k
namespoc_e Admin\Controller;& [9 y4 }8 d* y" _ e1 l% I. Q/ J: c
0 \) ?3 _0 K% ]clas_s AdminController{
" ~, s( |! t4 D; `* ? public functio_n __construct(){, C9 l. E; T4 i* s/ T8 L3 _
echo __METHOD__,'<br/>';
" m) X4 j8 y0 s }- i2 ~5 m9 [* L8 ?! R# L
}
) `5 [% _* E( _8 n----------------------------------------------------------------------------- {" r9 }, }; F+ d$ L
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。& A% l0 g$ T) ?# N4 x' i5 R* I
2 Y1 u3 J* A7 P$ N; |4 M% y2 i" L6 Q5 M- M
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。6 B% y; o) @$ C0 M
- l, I( [* _0 N+ P8 o: F4 v) o
( ~3 c; e1 u7 n6 D4 a; r3 ^% }: I# }0 ^, L! C
% o2 S1 ^# s b9 s2 d. }, s: w! a# C& x% N# t0 @9 P
9 z6 T* y% \/ ~* |& O9 @
|
|