管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
. b5 O$ e% G1 Z" X7 {9 I: P9 l7 I; s; ]1 V; i
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:9 @( _3 L# O8 R
7 T) I% F* o% t/ y- X8 |+ L
" i$ P' K7 Y4 r5 W( K1 {
, W( V6 f7 D# M% U
我们来详细的讲解一下PHP中的命名空间:
" y& b% v4 e [, M5 X. I9 j. Z) ^* i; b& i6 V# _
语法:namespac_e 空间名\空间名;
: u$ v- Q9 @- X- l3 _. K
* ~& V0 O: e. I8 P* O0 U说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
$ ^5 a5 h2 a# b: P! M8 c$ e! b& a6 J' @5 C1 K3 { E
----------------------------------------------------------------------------
* L( T0 k. C& J3 p# K. u/ O9 q4 ]
0 |2 K1 J& \& E2 `, V F" J6 x<php
) B5 i7 u5 }6 l8 A! w/ Y+ e
# j6 Q( d; X' F0 z6 Lnamespoc_e AA;' Y8 r9 ~ \2 ?# ~' g7 J* P
functio_n showInfo(){
0 w6 S- A5 u: n, P' K echo __METHOD__,'<br/>';
& J- C9 F: g0 L/ o+ A}
* |# s3 y- M+ C4 Cshowinfo();5 X0 [% |: X; P% x1 Y' t( i
( e' C( W5 X8 v/ f* m
namespoc_e AA\BB;
! Y! ~) T+ @7 c' X9 u
' d- ~4 Q8 V2 ]6 j9 Y* nfunctio_n showInfo(){
' _$ |0 b2 L# V$ l2 J3 a echo __METHOD__,'<br/>';
& d/ q- u T4 g# c}
5 x. R4 k; W; V: H//showInfo();- Q! x* s. t1 ~
----------------------------------------------------------------------------
* ?" F5 h4 ^7 x2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const) p; x5 c/ A# `+ ]. |
# ~# j5 G# }" U3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。1 ]6 S2 V3 I* ?: ~" x
. c0 l3 a5 g* Z, R: D----------------------------------------------------------------------------
% o: j, ~$ Z( g0 i
$ e& V& g! R: n* n+ O& {# v, f<php
1 ~: m4 g& B$ m% Pnamespoc_e AA\BB;
3 i" Y# P; Z2 l4 B8 ^/ K/ Ufunctio_n showInfo(){
- J7 v# `. z/ B+ K7 ^( _' h W echo __METHOD__,'<br/>';
! q( d U0 a8 P8 g% {4 L6 }}
3 n. A6 }! b5 F0 {# k: B1 K( ?namespoc_e CC;
9 ?# A: k- ? ?functio_n showInfo(){+ S$ }% q3 G5 V* \
echo __METHOD__,'<br/>';
a! H- d( s7 }* r}
$ n# P# c$ h4 ~9 \+ P+ onamespoc_e AA;
1 @, S8 ]2 V9 o9 V( Gfunctio_n showInfo(){
( _) }$ M8 h7 _6 P echo __METHOD__,'<br/>';7 {$ T: O t: }8 B
}
V0 ]1 ~ t) P9 c5 z1 u//非限定访问:用于访问当前空间中的成员& }! d6 u4 |" o, [
showInfo();! y) B' E1 d5 }- z/ {8 i
//限定访问:只能访问当前所在的空间的子空间中的成员/ A" q \0 s0 D+ u+ `) ~4 a
BB\showInfo();
1 r0 z% L3 v. [( \- h# O$ _7 ?//完全限定:可以访问其它所有的空间的成员
% q+ H A; U; d+ h, U\CC\showInfo();
: d1 c0 G$ w9 ^↑根空间标识符
" e# ^, {& u, ~; @8 _5 q----------------------------------------------------------------------------
) Z. t) G* q2 E4 K& N但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:: f) c1 ~, `/ d& [7 u
! o/ e- H7 q1 _
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间). j& Q, d6 w" N
0 F$ f' d" F, J" j, ?7 y9 V$ n! W代码示例如下:
* t- O& I( _" u. ]: W# q8 U
7 n H! |5 h7 o7 f6 ^( H----------------------------------------------------------------------------
# X a6 t; P, f$ X* i5 W- D
- K; [9 } ]7 g; N! j
2 j: H2 |4 S/ |8 @* X04inc.php
* `3 s! C& }0 r: _3 A/ S/ s8 |<php
7 e, k8 `* r" G/ S( Z `2 S! R' h: A. n3 k" K6 |4 Q% C( x! |
namespoc_e Core;3 r: e" H! R4 e! x, u# f
include '05ou.php';
5 i, ^3 L* A2 b) Z+ Q, gnew \AdminController();9 m# I; N. D S; T$ J# g
showInfo();6 C& j, r. N# o
4 H' y5 o/ V1 U
echo P;
* p, o. s) y! |1 t" i* @4 M9 m# S) Z//根空间中的成员,只要类的访问必须加‘/’
_) n$ A. L ?0 M! ^! \---------------------------------------------------------------------------- d/ P: l3 W$ k n5 ]% Y6 r; |3 V. M
9 v) _& z& k. Y) K B0 J0 c# i
05ou.php- \1 @; c3 D+ a7 M* S
<php& ]' R \4 q9 V) G i9 n
const P=5;% k1 C" x" U* d/ h+ y# Q
9 J8 ^9 M' c; k7 l, V- i/ y
functio_n showinfo(){
; U+ \: D, U- k X r2 P& \, K echo __METHOD__,'<br/>';
- i" F; V6 f7 x6 w}6 T+ j+ _8 \) v- S _6 o
* ~5 w: a3 \% B8 t
clas_s AdminController{
# X: p: w8 V' A) I, D public functio_n __construct(){
. o- m/ }3 V+ Y3 k; J echo __METHOD__,'<br/>';
; N. @+ j2 H% V4 z" M6 t6 S3 G }% ~7 m' Q4 q! r# {
}: e% F; \# T) M4 |# N2 M
1 D2 P* P* t9 n3 [第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。0 S- l" P/ P6 g2 U
----------------------------------------------------------------------------) Z, T' t* }' G& q* B9 G3 K I D4 Q
04inc.php G4 B" G% ?- G* A8 c
<php* ]/ t- w+ L+ m6 X
( n- d( y9 m3 t4 ^" i5 H1 ?' Onamespoc_e Core;7 r8 q* Z1 l7 {/ o- y
include '05ou.php';) f" G9 F" T+ S+ ^: }' m
functio_n showinfo(){
1 F7 ~ E l; [ echo __METHOD__,'<br/>';( b4 [5 O: W, ~6 H) y8 n) \& U
}
2 I+ A/ x7 Z! _8 c& W9 s7 g" [" h5 i7 H* g, X! w- ]+ E- g' D
new \Controller\AdminController;
$ D" ~: Z2 H$ p2 y4 k/ n+ _' \----------------------------------------------------------------------------
) C7 U0 D) M9 `8 }05ou.php. ]& ?8 M: y: ~8 J' a- _# A# ~0 \$ r
<php
8 U9 M+ ^0 J& }' M% S+ N2 lnamespoc_e Controller;
: K) o+ i. G5 @3 N5 I* R* M
! U+ i" k4 R3 n$ N$ b+ E2 ~; l$ G eclas_s AdminController{
. X) l" ^( _ M0 o. x( J3 r! W public functio_n __construct(){5 p- z" T! ?% n+ h
echo __METHOD__,'<br/>';# u4 k* s$ ^0 [1 P$ \
}+ M8 n+ U0 Y# a1 E
}7 P, `. {3 e; H% r# U0 v a, j6 j
----------------------------------------------------------------------------
' Z7 @, q! r0 [; B
, H2 |$ y- R: Y/ K7 N4.引入空间成员:
# R5 C8 c! U, K1 l4 k: @2 `8 ^2 s- M" a8 }0 g/ f
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
5 o) C/ l4 a* S) V- E6 r
X. I+ B3 k5 s) L* d----------------------------------------------------------------------------4 F. b5 C: H, @. N; k B2 s
/ j, }. y4 r5 @4 A6 S) e( ?
04inc.php
6 ?* p8 p9 h8 @. ]<php
; S$ z: _% l6 a9 G% W2 fnamespoc_e Core;9 D/ G: H8 U. a. ?
use Admin\Controller as con;
8 g' T8 x- Q7 ^/ _5 p k4 A! ~
8 H$ ~$ i, f8 ainclude '05ou.php';
3 F* }' P- @% Z4 g- R5 S+ S
7 g3 b+ l" o/ Y0 c; Jnew con\AdminController();6 \& O; }. }: x4 I
----------------------------------------------------------------------------
& a# `7 g' L, [# d1 D) @# K05ou.php% p) ~! F: a# E8 ^' {
<php7 z/ l4 I* y+ d3 n
namespoc_e Admin\Controller;
1 L L& B8 Y( a1 M7 Z; c$ [, T
. z% Z: D0 }7 D0 `* wclas_s AdminController{
: R1 o" u4 M/ }( c' ], g public functio_n __construct(){- v! v9 n) ?% l8 R7 p
echo __METHOD__,'<br/>';
/ }- S. b* i% w4 P; F q& i }2 h( L& q# U9 j3 j
}+ C3 C' W# W* R" N! W5 ?6 r7 n
----------------------------------------------------------------------------9 q8 B( t$ l s) i$ @3 T" y3 ^
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。, o( u" O% ]) y. r: N+ t
3 _1 h4 B" a5 s( r' d
----------------------------------------------------------------------------
+ x: c% B1 ?4 G) J$ n' k) T1 g$ o- s: |
04inc.php
) O g$ ?1 v) |$ t<php2 x) f3 o$ P! w3 O9 Z& b
//引入空间成员类
6 t4 V3 O3 }; D1 B1 `1 S8 q0 S$ N1 c. }! s. I
namespoc_e Core;
/ B2 q/ R. B; c, ~0 m$ Cuse Admin\Controller\AdminController;
) c x1 `6 u3 [1 s/ u3 ]8 P l( s: sinclude '05ou.php';
) [( l0 H, A+ I4 I! s) L# b/ W. ^1 t% C7 u$ |
new AdminController();
+ c' Z" L: s4 q% D+ h8 l1 A1 P----------------------------------------------------------------------------
" z9 K% J: E1 B- `05ou.php
4 a# c1 ?7 I( u<php Q/ U' ^2 Z S2 p( u8 i
namespoc_e Admin\Controller;# z% u5 T7 z0 H
/ i" p8 h, c$ F! V6 f# B
clas_s AdminController{/ O+ `& s9 W; z; @% Z3 C. v
public functio_n __construct(){
! ]4 x; \3 C- _ echo __METHOD__,'<br/>';
; \8 Z% X$ z9 D- S6 r }
* U5 ?: y# R8 V" X, e9 l}/ m/ H; Z: |9 V% e8 W
----------------------------------------------------------------------------
# S% U6 ?; p4 Q2 l2 ~4 C5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
7 f. j& \; G6 T4 T3 O) Y+ G. z0 D% q, {5 u
" A: z' G) r0 X! j7 x8 o1 w
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
8 k0 X7 ?9 O" g$ [
. d* Z/ q) s( t& x* T* s& x
. {6 F% y1 a! ~- P
1 _& q; d7 w @. T. V+ X' s/ J8 V4 g. d" ~2 x! p8 r
! d$ Y8 H# |" j
+ Q9 N+ O t4 x v |
|