1.命名空间的作用:' }+ K+ n3 Z, ?/ k; `
1 M9 B8 S+ I, ~7 V) c在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:$ i9 T9 r1 e8 ]# A" J% l, R" \6 K
5 T4 @6 X; T8 \9 [9 [6 H
- `7 i1 P0 I0 W" W
3 R- m0 @7 }4 t
我们来详细的讲解一下PHP中的命名空间:5 L5 w5 d9 \+ T4 Y) Q
" u& s4 ?; u% c; ]: M
语法:namespac_e 空间名\空间名;
( ]) W( S* s% |6 l3 r
7 Y0 S: k) Q7 e" i5 v# i# ]' [说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
3 h# _8 L/ l3 Y+ E$ {' \1 [7 G+ B) W2 s3 x
----------------------------------------------------------------------------
9 m! j( q, E- u4 N, s* m- T: z/ d% Q# m( ^/ [) r
<php/ U( _' y- O2 Q3 J, v
5 }1 i8 H; J( ?0 w4 M
namespoc_e AA;
' D& I$ |+ h3 N. Y4 u u+ yfunctio_n showInfo(){
0 N( E% Q6 s2 d6 t! K echo __METHOD__,'<br/>';: ^0 C2 c2 E s5 `+ f
}
' ], B1 D/ ? L; b- |showinfo();8 g4 y% ^6 b# D
! b& \3 p, }* a$ o
namespoc_e AA\BB;; {& h: S: ^7 t; c5 h; o; [/ Y. i* x
$ U/ H$ R5 m0 U- Y, U# P9 X) A
functio_n showInfo(){
5 \3 b1 j! [( R! u4 i echo __METHOD__,'<br/>';; M" {. ?( q; ~$ X$ D1 h; @; b
}+ F! c, ?$ _7 {' |6 J! i
//showInfo();
. m: G2 r- ~% S; Y8 ]& D; }----------------------------------------------------------------------------% o1 c' P/ V2 W+ D" y& N \% J
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)7 {* |, T. b, j- b1 C
% o$ z- Q. V3 U0 |, M3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。# G) ]7 Q2 t; w
2 V6 v9 ~5 [0 q% b, K----------------------------------------------------------------------------) z3 I4 J" d6 M* N6 C+ D' Q0 r' ^
2 S; @& ?; p) R$ n) a<php% y, z7 z' y+ o, s( z, i
namespoc_e AA\BB;
5 w# F& B: T5 u* i t. T5 `( u4 ]functio_n showInfo(){
8 ?/ r' C- x: i1 s5 G0 V echo __METHOD__,'<br/>';# h; Y+ w8 G) H% e
}
p$ y* P3 e& Vnamespoc_e CC;
+ _) U& S: r+ V. j$ efunctio_n showInfo(){
8 }0 g! G4 K0 w2 `- M8 P echo __METHOD__,'<br/>';7 P# n e; e9 E' N3 R/ }
}
3 p/ _2 K, ^9 Nnamespoc_e AA;# D/ k6 H6 s, N0 R/ o
functio_n showInfo(){. B" `( p E( | a- l- X2 }) ?
echo __METHOD__,'<br/>';
' I }: [, C' ~}
( Z5 f' U5 \0 G, Y' G//非限定访问:用于访问当前空间中的成员* p5 `% ^6 M- c2 C, `! J
showInfo();/ n8 U5 V, @3 k( o6 P
//限定访问:只能访问当前所在的空间的子空间中的成员+ D2 ^+ s/ [ ~" { Y
BB\showInfo();
( L4 B# H: g1 V* q0 H' `! n//完全限定:可以访问其它所有的空间的成员5 W d3 l4 m& L/ O# P
\CC\showInfo();3 W u5 q: ?$ |+ V
↑根空间标识符
. G5 A, z" x) r) `9 h- W----------------------------------------------------------------------------* b$ e. _3 B3 o9 X
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
: M1 @' ]6 K8 t9 O1 Z9 T0 F% h6 `$ \& a# @1 Q, g# R: w
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
' [3 j& B4 E+ W1 j8 }2 t- @" V& K) p v
代码示例如下:$ r! m/ x+ s& y
0 L0 A0 B$ h. T
----------------------------------------------------------------------------
( r K( |9 [4 j+ X
4 ]$ g' |$ S4 L1 l* O( @( [4 O* m
- W$ D7 Q9 \) M- i$ R04inc.php
+ i8 d* W3 \) e% z<php/ f( f' ^, b6 w" @( m/ i
: N5 g3 m Q9 W# o( g2 |! i
namespoc_e Core;
) R+ y. g5 g, g: T) z+ F$ a* @include '05ou.php';
$ `9 R3 @" e! a; Cnew \AdminController();' d% ?# `& E+ s. W4 o) u0 k
showInfo();* _1 H( @9 x! m: j
+ d' M9 I) }8 s: l5 ]
echo P;
m$ E$ [+ C1 {: j* J! \//根空间中的成员,只要类的访问必须加‘/’ U2 y1 Q5 o: r4 y) j6 [' f1 {
----------------------------------------------------------------------------
# r3 P- G2 D' Y1 f4 n+ F6 H
7 Q9 P9 l3 N1 y$ L* {# Y |, y; |05ou.php/ @! I! x3 i. u+ D& r
<php. B; b$ ?$ c) a: `
const P=5;
: U! m9 M$ ^/ \3 N- z l& `0 s" C4 K! W( v. J: K; a
functio_n showinfo(){
# b$ Q6 t, n) r& m4 N) W/ s echo __METHOD__,'<br/>';$ I4 e$ W7 H$ e" E/ \
}2 }: D/ @& Y9 W& V
1 `7 T* W5 D/ ]% D* y" Pclas_s AdminController{# {& A8 f# H4 l. m* J- }
public functio_n __construct(){( X* y" \: {- P1 u+ a2 [7 M
echo __METHOD__,'<br/>';- z3 c0 F/ r0 u# E+ S& V& R# T
}
' S* T* F: G4 \- c o+ \}2 o/ ]5 i7 Z9 W E+ v
: }* L1 @7 h5 `$ ?0 Q7 o# s第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
, u2 b, T) H4 Y3 ?! r----------------------------------------------------------------------------/ y: ^' x7 m1 E+ n* C
04inc.php1 D, R/ w% F/ }( h- S1 I' r
<php0 V/ Y/ _, G+ N0 t% ?9 M- _
$ E) e! N' `% W% e% [# Jnamespoc_e Core;
# b2 I4 R$ U8 Tinclude '05ou.php';) K4 A* u( A+ l: j* H& ?. q6 K
functio_n showinfo(){
- ^( Q* n' D+ m6 f echo __METHOD__,'<br/>';
1 R, ~! O3 k6 T1 m}8 O, C) H, v/ K, {9 d0 d
; [8 u+ s* l7 T1 anew \Controller\AdminController;/ t. W# b. B. p9 O
----------------------------------------------------------------------------- r5 Z/ c( v9 n5 @8 \: t
05ou.php# B. C7 S* F w9 A& z) q9 f: f
<php* _( N# v( j) D% U$ o# M- H# V
namespoc_e Controller;
2 {% d8 Q: J# V8 M2 _' x
% e+ l( N6 W+ [- fclas_s AdminController{
H7 s2 n9 Q$ }5 _* q3 J& B' o public functio_n __construct(){
. A# t6 p) N) v: m3 R6 z echo __METHOD__,'<br/>';: d' E$ I0 @* X# q
}
* z: r) x6 i# I' X}% M/ k$ d v4 y, J A
----------------------------------------------------------------------------
7 N- F4 u* C4 s& C8 \9 \) L; ?( ?9 l0 c9 d4 ^2 F* ?
4.引入空间成员:* s7 i1 T$ X ^/ W g* z4 A- g
+ X4 t& b# G `. W1 F1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。9 c7 C8 o. |6 P' s, k
4 n5 v5 L; h% z! F3 @
----------------------------------------------------------------------------
* [+ R9 t6 |0 X7 ?' \$ w
- Q1 s" r* E& t2 P/ l* S04inc.php# _! [$ J- Y0 U, y3 q
<php
7 w1 T6 T3 U- u4 T' b8 ], f- Bnamespoc_e Core;
* A# A1 J# a5 i3 r C& b( Nuse Admin\Controller as con;
* c7 h, B( n' ~4 [
8 Z: V1 ]+ q6 A. E d6 z1 X M6 sinclude '05ou.php';
5 b( m' G/ P; x) N
: B# [4 A3 ^: U" ]" Fnew con\AdminController();
: \% A) y) J: G8 Q3 [- q6 c----------------------------------------------------------------------------
& \5 O- a, m9 c3 J3 I& `05ou.php, S1 y8 u% I3 c$ S8 n( X
<php
/ D/ S5 n- S4 l4 snamespoc_e Admin\Controller;; v& u. _6 `% V6 I( b, M- h
4 [, {; z' M+ Q7 F2 J- {, d7 \clas_s AdminController{
5 s: N6 V( E0 s2 B% a$ O% f0 u public functio_n __construct(){) ^9 V8 E* I$ M( r5 t
echo __METHOD__,'<br/>';
0 k+ ?7 N0 _5 u }5 k/ u6 ^1 P* C! V- T& Z
}
4 q* U4 U1 R& M( K: h+ ]9 H----------------------------------------------------------------------------
( \; V# X' z9 j7 i5 s0 Q2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 U- O1 p+ r0 t) T0 _# c1 _+ x5 u2 E3 N( F; p9 I3 W
----------------------------------------------------------------------------
. _/ n. z- ^1 c3 @" C" a& A4 o9 ^( ?0 K5 u; W/ z9 C% H' C* C
04inc.php
9 ]+ }0 l3 x7 r9 g& k<php# p5 J: H0 J1 B/ r% ?2 `( F. e$ J3 O x
//引入空间成员类
- x+ g# ?( |- o0 z
& D5 F) R" c' ^& I+ znamespoc_e Core;% V! G7 o b; R' _9 [$ G* m! X
use Admin\Controller\AdminController;% N9 P$ i7 w+ v: L$ y7 u2 c& f
include '05ou.php';
5 r, O! I4 z$ @$ Y9 Y" ?* Q. j# p& s% P1 o' D
new AdminController(); ~3 M% f8 C9 e0 a8 o( V
----------------------------------------------------------------------------3 |9 M' E2 j- D/ ?& B3 N# r5 }
05ou.php9 _- V4 X2 `/ a) B) g- K. A
<php2 L+ s A9 l% T* ^( F; u: Z3 y
namespoc_e Admin\Controller;
; z* C" H/ g# F6 D
9 E9 l( @1 l6 M/ ?$ Gclas_s AdminController{- l+ t* M5 V' a/ G l* }
public functio_n __construct(){
( g1 i5 N4 z/ ? echo __METHOD__,'<br/>';
0 u# g0 u/ {' i8 t) L }
' G- C4 r, T- e: f) q1 ]}
. Y( E; O, a) n4 m* ^; G) `+ Z2 N----------------------------------------------------------------------------- F4 V! I/ g) c' f1 G* ~
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。 u7 R7 E4 w f
- G6 I% l t7 g" C' C# r I- o4 ?: e% W# D+ _4 U1 H2 D
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。: x2 \- g% p2 P0 @7 U9 ^
) \% ?0 f, ^" G# V7 u/ q- O$ t. q
& T% v9 E7 i; j) C# T: o
$ M, m2 X4 q j6 a }/ k: ~1 }
& T! A: w4 p" z( D3 h `/ z. Z( w6 G* e7 C* Q2 v
7 B+ y% c. \! |, ~! W |