管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:" E5 s7 ~( f" x$ Y/ n- B' [' ^
$ z$ H. ~8 {" ?) R8 S
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:4 w# _$ F: @" F4 W
X/ W" X. `% v. ], P
: ~: v$ N1 W3 S# P, M
2 O4 Y' \' J, ?% F
我们来详细的讲解一下PHP中的命名空间:. K! v9 a2 o! h7 E- z8 K
( J, P3 S: ^3 _
语法:namespac_e 空间名\空间名;
9 `) g: E4 p9 m! j# D5 c" c
$ D4 \9 z9 d3 M3 T! n: B" a1 f+ t说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
. ^5 @- h: A; N1 E4 E' M% C- Y& N
----------------------------------------------------------------------------6 `" g* }6 R6 x6 _( p/ Y
, f6 B a+ K* _- ^. i& S: d
<php; v1 V; D* g9 h) i
$ T& r7 e! m7 x' F9 jnamespoc_e AA;
) M2 T5 F5 |& v, zfunctio_n showInfo(){
) x* }7 @9 \: y+ e0 G- H: p echo __METHOD__,'<br/>';
: e0 U6 [3 L8 { P9 H! [}: ] d& Y' o8 D
showinfo();3 M6 z% C8 q8 j! B' e, V: T' }
" }' A3 d1 z! f+ V. I# h9 A! unamespoc_e AA\BB;
: Y$ ^! v8 \+ b2 r/ _$ W# v
' _2 V3 s) F' b0 N6 k; x- gfunctio_n showInfo(){7 C2 c1 y2 q+ J7 i. q% ~+ ~
echo __METHOD__,'<br/>';$ M: t6 O$ I1 b1 d/ Q9 M
} b, A9 r @. n# _) t- a5 o
//showInfo();
: M- e( W$ `0 M9 h----------------------------------------------------------------------------
2 b$ S% R; R1 _2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const). f$ z; K8 L6 o$ w3 q& E8 n
* ^/ r. z2 ]' ]3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
. F5 f+ p- z& G; R8 M- e- w5 a
' W! i1 \, H0 W9 n2 P6 _7 n% ]! Q----------------------------------------------------------------------------+ u) y+ F) Q9 ?) }* y5 w
; g& [3 E5 P* N4 R* ^" z$ N
<php' |- @ t4 [/ T0 T: N" u/ z6 K5 h
namespoc_e AA\BB;
/ f) @3 S1 H* ]. @, c, Yfunctio_n showInfo(){5 b8 k- D2 r3 M( Y5 m6 @8 c
echo __METHOD__,'<br/>';
9 J; Y$ J# H* m1 w+ A1 @4 A}9 L w ~$ _, d
namespoc_e CC;$ i0 U! [9 E0 |6 {
functio_n showInfo(){
& v8 G% P( Y, h, |% s echo __METHOD__,'<br/>';
1 o& C: P/ e9 ^1 g6 o}
. S& } B" k2 \0 Qnamespoc_e AA;4 a9 G& u8 C( D( B% e0 j1 h
functio_n showInfo(){2 r. F' \8 \3 }9 F, |, m1 ~) A
echo __METHOD__,'<br/>';7 q$ |' g6 Q( M5 |( f0 m
} P' M ^: s) U( n% }+ U4 x+ l+ V
//非限定访问:用于访问当前空间中的成员( g! E: W4 h- W, ~# X% f
showInfo();% O' I) s' M. W1 q
//限定访问:只能访问当前所在的空间的子空间中的成员. \3 }; D6 v3 x% _
BB\showInfo();$ q6 [! ` z. \$ D1 X* f
//完全限定:可以访问其它所有的空间的成员; L0 @. O" [1 X H" J
\CC\showInfo();- Y$ i' G9 G9 x
↑根空间标识符
9 W' e( M D5 x( {2 q+ t. T% o# h----------------------------------------------------------------------------* ?7 K/ v2 k( {. a+ Z9 a n
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:! R, O8 Y) G5 R, r* K
7 R# q! w7 T' ^- k/ Z$ }当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
0 {% `8 c* T! S' A7 S1 l# O
' `. t. {' r, N* ^5 M代码示例如下:
6 ~# l$ ]& s. U# L6 y( F) \+ a! e
n3 q7 P5 C( h----------------------------------------------------------------------------" \" X6 ^: h' T6 m
4 f* y) q/ Q0 a( G2 W$ r
* b' `' B, f4 t4 T
04inc.php
. {) y' W4 G) i0 [0 \4 W5 _* s<php1 B3 _7 `! ]: c) ^9 k
/ @6 d" x3 D# [. q5 g; I( A3 I4 z
namespoc_e Core;
) }' d! P, Y0 D# o2 k- vinclude '05ou.php';' r) e0 m( ~2 d& s& a
new \AdminController();
5 S+ j- F3 D- l) `showInfo();
. x' |( N: y" c! Z2 E x0 i; ]; c2 N# |+ v7 }1 W' e! n8 O
echo P;
; F3 L) i' E. b# s' n A//根空间中的成员,只要类的访问必须加‘/’
/ d+ P L, i5 l" P# k+ }----------------------------------------------------------------------------
. M6 [1 u) O; D# y5 s1 ?; o8 f) N5 h: R0 x2 E1 E; K! S
05ou.php, x2 s: z9 n) I# h( d$ @8 W
<php+ v; o3 u" n7 ?9 P4 H1 Q
const P=5;& \! E8 `2 U/ D( O3 V+ N
' J" S, A, t; |6 y! ]functio_n showinfo(){( Q8 g+ g% x4 K3 p" o
echo __METHOD__,'<br/>';
8 C+ k8 x8 r3 ?- ?: O/ }. U1 x}# f( |; J+ m; H9 ^) i
( y& e% {4 }% U1 P; V, T( y
clas_s AdminController{# q1 g+ [2 B- k; P
public functio_n __construct(){$ {/ j7 d+ F6 C- Z$ A
echo __METHOD__,'<br/>';5 N& Q( m9 K: @. k* x' P
}% n% t1 r8 ]( ^2 ^' f( V$ u
}9 t5 N( D( O* @5 l6 `6 }5 I
. t) m9 H% k2 _8 T6 n `& m) Q: c第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
$ ]$ \* v% j5 S- q6 e! p& {: P$ `8 z----------------------------------------------------------------------------
( I- ~' K+ ?; `3 L04inc.php
; f& M6 }) j# v<php
& m- G0 I0 K/ `$ G: c7 Y0 s9 G$ A
6 G- L+ T6 p+ C! @; v2 Enamespoc_e Core;% S& Q! H" w$ n5 C# H
include '05ou.php';" B0 I' \- s8 [0 Y- f, T% z$ _. y
functio_n showinfo(){8 t- {' g% P8 v+ ]. L; i
echo __METHOD__,'<br/>';9 M, ?3 K# |$ D& u7 _' ]
}. s, j: d3 r/ n' r1 Z
/ C0 Y3 }) M$ h8 n# |/ W+ u+ G
new \Controller\AdminController;! x, j1 i2 }/ d7 w5 m* Y- R
----------------------------------------------------------------------------* Q) P# ]0 ^: g
05ou.php* h4 U0 ] c0 o8 d
<php
5 I* g; w. w+ B( T- hnamespoc_e Controller;- D6 l7 \; a$ r8 t( h+ n2 l' a9 n
4 R2 z# v+ [+ u" x& vclas_s AdminController{2 b% e5 o/ ~9 b# ?
public functio_n __construct(){
) m8 K9 r, ^$ ]# c echo __METHOD__,'<br/>';, D) S+ d3 [9 N( w
}
6 D r- \+ p2 r: U- K}
! d1 Q% ]7 M) i----------------------------------------------------------------------------' p+ B' O" S# c
# X& S0 ?9 ?6 \+ ?4.引入空间成员:+ K+ N3 |- Y7 h
4 Z$ M# Q/ D' o0 k. [9 a3 ?. ^1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
4 b- u: B! Y' l% }: ]
5 L+ p- |8 v e' }1 i$ R2 x3 G----------------------------------------------------------------------------; a% X" d8 P9 K6 ?
$ V3 Q$ E5 C+ j( ?
04inc.php
( [: R- p; j# @<php
2 u" U7 E) I3 c* tnamespoc_e Core;) F9 N# H/ v& M5 T3 Q" v
use Admin\Controller as con;% \$ @8 L2 _; C# E% s
* a+ E- k6 `" c$ O9 s" q. ~4 p/ Yinclude '05ou.php';
0 r" _4 U$ o+ ~; i
) P9 `6 E6 w7 m0 y! hnew con\AdminController();% h+ p3 R3 }& w- s
----------------------------------------------------------------------------
& b4 E, f: l" @9 R5 `05ou.php
d: M7 K7 L7 d/ y) F<php
, [( X% @" Y/ n, ?namespoc_e Admin\Controller; w3 A* a% C- o/ ~! n7 F
3 b7 L" A4 }4 |! |7 @+ U6 i: qclas_s AdminController{5 q& ?& u5 B9 h) A, f9 }. a& |
public functio_n __construct(){- |3 F @8 j2 D9 G7 A9 i
echo __METHOD__,'<br/>';* k b& W7 ]+ g' n
}
! I- {4 {& e/ ?}
u. [- G& L+ q ]+ D0 O6 ? ^2 l----------------------------------------------------------------------------
6 b/ P; a0 |- b: f$ k, I2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
- ^: y( @$ a, m+ d. f9 v4 ]: E( E
W7 R/ p6 ^) N1 Q----------------------------------------------------------------------------/ Y7 j3 k; y0 U* \" A
% ]- Q+ t) [ F, F, ~! \
04inc.php' e4 Z @8 b+ g2 o1 ^6 `1 i. t
<php7 e- J* q6 d2 V, _6 R
//引入空间成员类- w% C. a( ]) U: r
) n3 }% J$ Y+ d# I- C7 L, D$ c
namespoc_e Core;
. l8 T4 y+ u: Q2 f7 e" z% juse Admin\Controller\AdminController;
$ o0 Z- s- u$ D& P/ Yinclude '05ou.php';* t, p8 Z8 B: v/ l9 v$ \( t& N! Z
# j' }( U; q7 H8 Jnew AdminController();" I% b& K/ U, H
----------------------------------------------------------------------------8 O7 }2 W7 d$ G- o3 V9 Y5 K
05ou.php# ?+ }( y* @0 P. L/ b, }! c
<php- Z& F0 r$ d ?, ?$ u. B
namespoc_e Admin\Controller;
7 e9 E8 k" d+ k0 h/ E# S) x# i5 I, {, x* H
. t! {5 f7 t- N: x zclas_s AdminController{
9 j3 y' x0 o% e1 _- ]& R public functio_n __construct(){: m0 N( S3 ]& e
echo __METHOD__,'<br/>';4 s4 F9 x2 v. x/ K! c* t: u7 e# p
}
9 D- \, Q |9 ?# E$ y}
9 ~2 @" w7 Z0 ~' `----------------------------------------------------------------------------
5 K! Y! R- U+ ~' y5 }0 b8 [5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。6 z* w, ^# G ^9 ?/ L1 t% h/ O; q
% O$ ?% p) a' Q
9 F3 r9 c6 S9 R# I9 V. A这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
+ ?3 H+ ?; h% T( B, j$ {
, s/ Q! f i+ N3 l9 K8 p, @% [6 w% O5 p. x" P6 {5 Z4 a- K2 |
& ?+ p! G4 y! n0 H
- X, H9 `, q, i& h4 \* m d. A
5 n7 t/ v! z0 u1 `1 D- c0 H( v- D+ i: I2 P8 F
|
|