管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:" t8 e) U8 P/ ?0 z1 y) T
5 \% c" J5 f& `' }6 W) f( m
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
: _; ?6 H8 V- X5 l9 n) p
. Z) f$ D3 ]6 W& Z/ I4 @( z: U+ z
, J' j( P% A* k& S6 |! Y* |* @
! p f* S/ T+ U- u3 d' u$ `; ~我们来详细的讲解一下PHP中的命名空间:
; q, R6 F$ M5 `( ^( G, k; L
1 K( [+ w& O1 `' z5 A语法:namespac_e 空间名\空间名;, b# D3 m8 B @1 g: X3 c8 I
4 b7 ?7 C: Z3 m! l. ~( G" _% c) B- } A说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
8 k2 d5 X: k8 A* Y' `8 Z) G! h1 m
6 w" z- T( ^" Y% u7 k----------------------------------------------------------------------------$ T( I) j+ {5 L
1 Z* p# s% M9 b* q
<php
) O7 s2 p( X& K- @% N6 C, X
, n) o' E3 r% w3 S- c; t+ O, w6 nnamespoc_e AA;
c* n. _3 c# Nfunctio_n showInfo(){
, Q* g/ v" \9 o+ d5 C3 D" H; k echo __METHOD__,'<br/>';
2 ]( f! X/ v5 y8 h}" ^* L. M8 i* e0 K' i# [
showinfo();
7 ~4 \8 E* L3 d* t9 P* N
: a" P8 Y# v/ T* Z8 p* E5 Inamespoc_e AA\BB;
7 Z( Q5 ^2 U* O" _
& H6 i T/ {; j1 h! W( ` ~ \functio_n showInfo(){ N4 n- ?9 u. B* L1 Z% r# {
echo __METHOD__,'<br/>';
) I4 k6 R- ^! `5 w1 |( K3 a3 J}
' ^- m0 T: x. m: J! S. w! F. D. ~//showInfo();- W ?( h! c1 U
----------------------------------------------------------------------------
$ `& ?3 n2 f* Q( ]% ]2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)( V3 b$ c& p4 E
% {( k2 N* F# t2 |5 c7 D& y
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。- l/ l) r( p: i" A$ S
6 C8 s& R: y0 ]# o6 u----------------------------------------------------------------------------
! u7 a: F, x7 T# q ?+ w6 H4 c/ N6 \) |' O8 g% N
<php
* c" x) Q0 d; B( @namespoc_e AA\BB;
- m* f8 c- i% _; O2 z f+ N7 `1 T9 Zfunctio_n showInfo(){# p }' A% m% ?! \0 m
echo __METHOD__,'<br/>';' y0 [# l! A s, N) ^; Q
}, [3 Z L5 D. L7 r/ G! s1 b- p
namespoc_e CC;
1 D6 J N# h) Q1 H. Afunctio_n showInfo(){
" s3 G, Y, C& F echo __METHOD__,'<br/>';
. D e: `: F7 F}5 m; @: ?1 O+ c6 D6 M/ t
namespoc_e AA;1 j6 I2 v# B0 ^1 |' S# Q, o
functio_n showInfo(){5 _7 Y+ R9 g' q7 i0 F% E$ f
echo __METHOD__,'<br/>';0 V) q" J' k: `" f4 M; L: K4 b0 ~
} r& B, K* _2 v
//非限定访问:用于访问当前空间中的成员+ s @% W& M! R* p
showInfo();
' s2 \9 d0 M1 X//限定访问:只能访问当前所在的空间的子空间中的成员4 W& Q& {3 @' p1 k) H& ?
BB\showInfo();
: j5 X( @- n; K$ I. L8 I5 x//完全限定:可以访问其它所有的空间的成员
5 \# W( [; |, j9 Z ]" P\CC\showInfo();
8 D! R* G9 s' F" l% X! Z7 V↑根空间标识符/ O/ ?! a6 ]8 ]8 q2 U
----------------------------------------------------------------------------3 t j/ b, r' S! t& m
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:" y; m/ `6 T4 m( B
9 a( X( S. q/ q) Y! K! g当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)& T- H6 g, l7 e+ Y
7 O' f& I0 D+ P3 |
代码示例如下:: f |2 G N6 o D% v
! Q3 S4 Y! Z+ x5 [3 ^
----------------------------------------------------------------------------& }3 p6 ?( E8 G) z& }# v
0 r6 j+ Y& v: O: h: h- R1 ^
; K% ~9 m" b M. v. b/ ]3 S04inc.php. L: [; {7 ~" A7 z& v. e
<php
% V0 P. A0 D+ i ? }# D R0 s4 k l6 L
namespoc_e Core;
) t p- N1 h$ h$ ginclude '05ou.php';
8 V+ i9 T+ F) \/ ^new \AdminController();4 J- O( j6 R# g0 V3 i+ f/ g8 Q! @
showInfo();
. P' k1 m6 g6 g* Z' b/ v2 t; T
; d6 ~4 m8 V8 N& T/ ]echo P;
: e. q/ z) i9 q: Q$ W: R) u//根空间中的成员,只要类的访问必须加‘/’4 P$ D5 \1 W h/ i: V5 N% Q
----------------------------------------------------------------------------9 w& ?/ y. r8 J; `$ E
1 j* r7 d' T! d* a. y N* j05ou.php% J& C7 E$ u, P5 ]
<php& h5 B" B, y Z9 h: u
const P=5;
( y' o8 F1 C. U6 X' e: G" e% ~4 O! `5 P8 `9 Y5 d! j
functio_n showinfo(){, q# ]; p! a4 O/ Z4 `
echo __METHOD__,'<br/>';% z4 p# z2 X5 D0 n* Y% H4 V' }
}+ Q' ^4 E+ A; W9 J7 p0 i: O/ X0 p- s6 F3 P
) s4 t* m7 m, N4 C: ?7 |4 w1 N% Y% fclas_s AdminController{
, l# m- x4 n# z2 `+ M9 Q8 p public functio_n __construct(){: k Y5 D* Z( P
echo __METHOD__,'<br/>';2 W3 V6 x( x# v5 M
}
; ?5 q) i, ~9 r0 N7 P}3 M, i8 Y8 O! Q$ _ I5 |
, F6 y$ H. e% R ?& a第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。1 M: i+ s, W) Q7 x6 c' D/ Q
----------------------------------------------------------------------------
' _( v5 C* O' b& [; S! X) A5 j/ u04inc.php
* B+ R% w+ k/ z0 c: F2 m<php; P' K8 d, l5 { Q
" e3 [9 {! N) d5 U, D; ~5 L& A: }
namespoc_e Core;
+ D7 W% S d/ f- Minclude '05ou.php';& k9 Y; J+ ?* p2 W, @' O( {
functio_n showinfo(){+ P" T: m& C5 @
echo __METHOD__,'<br/>';3 _/ f3 }- h7 k" F$ p; b
}
7 ]6 B4 |! Q; S
]' \$ i* ~3 e8 S# \. K# [new \Controller\AdminController;
1 t3 U+ Y% C/ y B$ x----------------------------------------------------------------------------5 _ X4 e; A; `/ }. j/ H/ m4 y- l
05ou.php
% e$ f4 P& m8 }# n% [<php. M4 v, q/ y# T2 C$ b; C4 o
namespoc_e Controller;9 G; v6 C o- v, W$ Q$ w& e* C
4 |1 I. d5 I q/ Iclas_s AdminController{
g% ~. N8 d( a public functio_n __construct(){! W3 l& M+ l# p5 y" d
echo __METHOD__,'<br/>';, M4 s9 j$ M/ @1 h8 T; c/ T
}
" P. ^' K5 l; `! O- U}
: i& g) s' F* n( I----------------------------------------------------------------------------
' d' B( Z. `( m% C) s2 b8 s4 x
) E2 ~2 A: v2 }9 ?4.引入空间成员:
0 `3 P. W9 [, K& C
& Z% s! _& q. _9 A1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
+ B, R- }6 r8 N, m0 W" D& ~5 \7 J+ q. G" J' ^6 @
----------------------------------------------------------------------------
r- n' N4 Z, p* q1 x5 h6 m' }' J* @& T: B& e
04inc.php& P& T" l4 E5 [: K) V7 J
<php
) U! C j3 l' E& f* b% Unamespoc_e Core;
. H0 C1 g( E2 z% ^5 n. Guse Admin\Controller as con;
- W8 b, a6 b8 h+ H% X _# r N& [
7 ]3 S# @( r% j- _$ L9 m+ Hinclude '05ou.php';- G7 k+ A% R9 N7 b
u8 `6 | X! e/ o' ]0 tnew con\AdminController();
2 x: [, M! L' u( u4 X1 u2 B6 e----------------------------------------------------------------------------
1 U _$ q4 W6 D05ou.php% x3 D/ q$ Y) j& m) h7 @
<php( d4 J3 A- T3 ?
namespoc_e Admin\Controller;1 ` e+ k' @# }6 h% l% Q% K! P3 c
0 X; u, H B; x; i$ Tclas_s AdminController{
@0 _3 i# c. V, i+ g% b, e: I public functio_n __construct(){
( e# |& Y5 T8 W4 M9 u! p+ u$ g7 e echo __METHOD__,'<br/>';! @) Q1 q3 b$ q/ }, b7 L) b
}
3 i9 W0 ^0 A# u}
0 C& a7 ~7 c- j! K----------------------------------------------------------------------------. D7 m* I. o/ I" y8 G* X
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。" {# }1 S! \, h& H* R
, S8 ]1 i4 w# d% p
----------------------------------------------------------------------------, X7 P4 W- I" M* X* g! _( T9 N% |. X
Z: V$ P0 D7 p1 G5 ]04inc.php
, g5 o4 O+ E- v! ` ?<php8 G1 {4 N; B2 K* o; ]
//引入空间成员类, y, C! {' S6 O: ~
8 `) Q% v* V) O$ b; v( _
namespoc_e Core;
- S' F7 Y0 O8 S: Z2 Ruse Admin\Controller\AdminController;1 `7 ?' `# L1 U3 H+ } \5 @
include '05ou.php';
! J/ g: e/ d( D4 y
# q2 j- W) v+ V! Tnew AdminController();! [+ }6 s- x; E3 l1 H" G
----------------------------------------------------------------------------
6 j) h5 v1 Q, o/ F4 Y% E05ou.php9 ~9 }2 A$ m# Y
<php/ p6 C2 \; S9 p' F5 k/ z
namespoc_e Admin\Controller;" G; F3 C5 c- e0 h5 ^" B, X( R
/ `" p0 T' @# B6 tclas_s AdminController{
6 z! D# U9 a- _1 n2 u$ a( o k public functio_n __construct(){
# V* e% h* F6 W+ F$ Q echo __METHOD__,'<br/>';
+ o- Q( G3 \- {7 ]/ R. f6 V }
1 N% n) t- B5 N3 z" x5 w}
3 G0 z( n, z Y. b7 |8 d. J----------------------------------------------------------------------------5 d) N9 `$ e) ~- b
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。" p$ X4 ~& q8 _. T. D
9 _) a4 y# |+ \
% R$ A+ |- P+ u% k* ?* [4 Z l- h这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" u( d# n: G4 v, Y. s
3 v1 P1 t9 M$ H! f% N' q
* G% U1 [, t+ H
7 B6 \% h! _% U* T. j/ p# B8 ^, M1 z3 N; H
& z9 V7 y' a. B! M& l) s
0 z$ J3 c5 g! @% W, z1 G
|
|