您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

php中命名空间(namespace)的作用和使用

发布者: admin | 发布时间: 2020-7-1 23:13| 查看数: 8370| 评论数: 0|帖子模式

1.命名空间的作用:
) w+ u8 ^7 Q8 u+ L' y
! C  a" M/ m* Y5 |  [$ t- `. v在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
( h' n# ?7 h& D* u7 D5 T9 S( s; Y3 H4 }3 Y8 ?5 s
20181201105307520[3].png % H" a. H% S% s. [$ n5 {& v0 E4 [
$ o$ _1 _3 P  Z6 c/ C4 U4 B
我们来详细的讲解一下PHP中的命名空间:
" l5 \# h: [! }/ F6 I/ j
+ F) O. u& s  P2 ^, \9 P语法:namespac_e 空间名\空间名;# S' g/ c2 K. L$ ~# `- N

5 T( X# m& K2 W, m& r$ g说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:. K# u" h2 u  C" b) j3 R# B
2 n' ?7 {3 K' A! c7 `  O
----------------------------------------------------------------------------. P' ?' Y6 c3 ]4 c' ?( U
5 M$ P; D$ P5 W; `4 Y7 g& I
<php
* Y- j5 ~0 D" t2 R: I# S, T& e1 B
/ }0 S3 \. h  j. `* B: e2 w0 }8 |  Enamespoc_e AA;
" @) X' x0 O3 z8 d! O+ tfunctio_n showInfo(){- L$ z! _/ N1 K& G. o
    echo __METHOD__,'<br/>';
& z4 ^4 E3 m7 y9 ^5 k3 f0 v) L}
0 u3 O( O5 {) A) jshowinfo();' `$ C+ \- O: R& V# b0 y4 }

8 {+ d+ T1 H2 W2 V; {- F* l" znamespoc_e AA\BB;8 Q; I; P+ e. R1 `' k) v5 V- O& r* ]
' V, Z! i6 Z6 E2 o. ?" ]. l0 ]0 L8 W" M
functio_n showInfo(){3 P; I8 X+ h6 w" g, Q/ |/ b! `  f- H
    echo __METHOD__,'<br/>';9 Y0 F/ |7 Q9 S8 [$ P7 M0 ^
}
, [0 G8 {4 j; y//showInfo();
. \% M' _  j+ y0 l4 d' Z----------------------------------------------------------------------------- Q. s' [$ ]* U6 r
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)% o9 B( S+ f  g* M9 o1 x( \. b

5 s1 W+ p( O, N6 P; T* Z3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) Q$ i7 H4 p  a* F! W% M9 Q; V8 c
; K9 T: I- X; h* C) O----------------------------------------------------------------------------  {2 E: d& b7 h* i/ s

& D* G% f0 N. V% ^& V<php! r. {* ?7 H/ ~+ v; w1 [* |- o
namespoc_e AA\BB;
* z2 J+ ~  m2 \functio_n showInfo(){* U* H9 W3 }1 K' S7 P
    echo __METHOD__,'<br/>';
! y; ~. d9 E0 Y3 G! e! S}% p& h6 S4 S+ T! M4 b2 j6 P
namespoc_e CC;
1 [( ~% i6 u" o: |) |: p/ V1 qfunctio_n showInfo(){
) Z6 j0 \5 z0 F    echo __METHOD__,'<br/>';5 W* y% A8 l! H- M  d( u
}
/ M- a8 Z, y8 ^0 Fnamespoc_e AA;. H* T0 n. v% i* R3 j) n
functio_n showInfo(){8 B7 G' Q. T1 p; d, t% t  I( A
    echo __METHOD__,'<br/>';  n; ]6 [( h5 [( X( R1 Z8 b
}5 K5 d6 u6 G2 h4 {% r
//非限定访问:用于访问当前空间中的成员. G. G- }! U) }9 J- @
showInfo();
: N3 r2 @: q# `! j//限定访问:只能访问当前所在的空间的子空间中的成员7 R1 ^  E2 M: R3 a" w9 M# x4 Q
BB\showInfo();6 c- y* H1 X/ ?0 G3 _8 r
//完全限定:可以访问其它所有的空间的成员8 L9 P5 h7 R* g& J
\CC\showInfo();
4 \, ~, v; x+ B# T: `6 G6 k↑根空间标识符
  n: G4 u8 r6 \, f& n----------------------------------------------------------------------------
, }* W+ @# K9 ]# ^- C# v$ i但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:6 }" `) d+ f- A
+ }# }/ b* ]% S8 i* l% r( t
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)( A' [0 L& |3 }' E1 _7 Q
9 {+ z) d' f' `1 e
代码示例如下:
( J' o& l: k) ~' ]" d2 ?7 A3 a: c% }- y. l" L
----------------------------------------------------------------------------8 w- J4 k0 I) t" R1 v* y
; i. w6 p5 T/ a3 _
- T" P( g5 }  O8 A3 Q% H/ B
04inc.php
' s9 y0 T5 T7 x1 `1 V9 O  J<php
1 S6 O+ |  w$ w8 [5 A% M1 P
% w. V/ ]( s- o. f0 s3 H! Bnamespoc_e Core;
! I. W, k7 H: F. H8 K' uinclude '05ou.php';
" r" v1 d! K2 L7 ~new \AdminController();
, {: u/ n3 c  |showInfo();
+ b! ~* I2 d) Q
9 p8 g. }2 _; {7 P7 K6 P5 K  Necho P;  w: c/ @$ c3 ^$ Z
//根空间中的成员,只要类的访问必须加‘/’
- k% D* ~$ ]$ L9 S  z. e0 C' O5 e% f----------------------------------------------------------------------------
, t8 o. m* C7 Z4 x) b) h; Z+ k3 u, a4 D: K0 T( k
05ou.php
5 G6 }8 x/ B  S" `, o+ b$ d<php* y% a$ f) o8 S6 P
const P=5;( u0 M8 }' H5 B) {5 r$ w
; F2 B& [( J# v  d. D& n. E
functio_n showinfo(){: ^# M( V6 `  e: }$ H6 V
    echo __METHOD__,'<br/>';
4 y3 n2 ]4 b, W# K* D, `8 {1 Y}; @; b: x+ ^0 Y* T: h. @+ e2 a

' u: E' o7 q4 o! b/ T3 ?8 kclas_s AdminController{
( u6 R! v! v# q0 j. ?( [0 s  [% |1 y    public functio_n __construct(){  y6 w5 [" C* r* u- A
        echo __METHOD__,'<br/>';% R1 z6 A: Q$ A8 M
    }
7 q6 k& E3 T- P: w* X/ P$ [7 W}
, N5 s4 N9 w3 @1 Z  B, d3 m; I: @. q  Q# o% l4 s
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
  ^6 p! Q2 |" j0 C----------------------------------------------------------------------------) P* k, k% |2 ^' u1 b# S! q
04inc.php
- {- Z6 e2 j& _0 V7 _<php: H0 D7 R8 \5 d! v' A4 p# f
7 _: d1 _/ z% N5 m
namespoc_e Core;
' J  m9 ]+ L6 j6 H0 L0 w4 t8 d) uinclude '05ou.php';+ y- E& N6 @* C
functio_n showinfo(){
  i% D. V' ^( L" ?$ W    echo __METHOD__,'<br/>';
0 c0 ^. t+ w9 R}+ i4 Q4 C( E' {/ f5 Y

6 g8 z3 k# h9 e* o3 Lnew \Controller\AdminController;5 y: s5 M# H6 @5 C* t
----------------------------------------------------------------------------
# q, Q, l2 X! T05ou.php- W) w: g0 p' h- o9 e
<php
3 y& U, A* V2 ]2 H1 [; ~$ S- [. ^namespoc_e Controller;8 O: ~6 c9 v0 h5 z) A1 z

2 E: ~3 \' g. C; f; kclas_s AdminController{
4 P% S- O' i3 E6 e+ E        public functio_n __construct(){
* T- }9 j1 {# u0 Z7 a                echo __METHOD__,'<br/>';7 c, c, I  e' ?
    }& ^' y% e. n& b% |0 m8 {9 a! S0 ?
}
" b- c# G, g  {. d4 h- k8 G9 K+ q----------------------------------------------------------------------------- }" J# ^7 Z4 J% l. }' I

* ^3 L1 C  X. t9 z+ I" L4.引入空间成员:8 }0 b/ L  D& Y8 d: Z0 H
+ _( Q/ O% p) f$ I4 ~
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
  t9 T) N: [, ^" D$ l' m: B# `0 ^+ y  F0 h, d0 x
----------------------------------------------------------------------------
! V+ z6 Z, I: @, R( j: ^: k, h2 i+ g: h- K7 C1 [# F9 j: A- n/ O5 @
04inc.php, R6 Y# \% ?7 |9 A; X
<php+ g; V  B: h3 [- d  i7 [6 A3 V
namespoc_e Core;
, k% M% F+ A9 U; Puse Admin\Controller as con;; W! i9 w. P3 v% [
0 }6 B+ d* v1 b& N6 `0 b
include '05ou.php';
% N- b* H% X2 Y6 e( B4 b
  G1 M. R2 E3 K, Dnew con\AdminController();% }8 j, ], T& A* P. ~  @
----------------------------------------------------------------------------
& W. r/ n2 I8 [05ou.php, `8 V9 \9 L& G6 E
<php
* E* _/ p' m* ?% W$ V' Q  nnamespoc_e Admin\Controller;
2 O+ q3 D2 i- F' O; `9 m7 Z. b
clas_s AdminController{5 }! j: ?6 ]( i2 F& E6 Q
    public functio_n __construct(){
" _3 I; p8 l" R5 a4 e        echo __METHOD__,'<br/>';
- P3 E6 H! c- R" e: C8 D) S    }
/ F; A6 i9 L/ ~6 v. ^: p2 R}) p4 Y- A, i! Q6 h0 Z- t
----------------------------------------------------------------------------
/ d( n* \* P) r; e2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 K  w5 u4 k# y( y) o& Z3 p  q  T5 y
! S2 L: R$ s8 n, h; N( N2 r1 M----------------------------------------------------------------------------2 b: u* M7 D" a, M7 f" G9 v

  f) w* {8 [6 q5 N* K. }04inc.php$ _; Q! p; n1 n/ w) J- h
<php7 d% x& K" d2 T( H
//引入空间成员类9 N0 v0 u+ w( ^' ?" K: j

4 c; J5 P) P4 ?  s. [namespoc_e Core;: C; {9 ^3 J5 T" Z) R
use Admin\Controller\AdminController;+ H6 k7 y' |1 @3 R; w# c
include '05ou.php';
! k' ^7 |8 `: m) u# F
7 c" w& e: B5 B$ fnew AdminController();
: `6 i7 {+ v5 t----------------------------------------------------------------------------9 P' \6 g2 {" ?, P7 b7 T/ D0 V$ H
05ou.php/ _0 A# l) n; r/ t6 ^
<php8 ~4 [$ F% P) _3 l# ?: p0 z
namespoc_e Admin\Controller;6 g- u, D9 S, U

" f) T+ {0 @- Gclas_s AdminController{
8 I6 @3 @8 r. y, D1 e7 W# j; _    public functio_n __construct(){
& h7 g' f# z6 z/ {/ s; J; p        echo __METHOD__,'<br/>';
, }3 b' V3 g% y9 H  E! I    }
2 N3 Q3 ^' c, T8 j- ]* \}& N; d3 D& p1 `5 k3 M, `
----------------------------------------------------------------------------
9 ?8 e7 I5 G3 C5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。* Q- B! h7 }1 s5 P- P) _
! P6 m! f( Z) V2 `; [6 P1 Z- L
0 U7 v& J8 o: d# M& e3 t
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。2 j. z! |7 E8 T, d; {% A4 @

# c0 V7 X6 T( v! y* g5 N/ y, Y8 x& C6 ]
/ {- d& \- s- M) \$ z
  G: H" q( Z, K0 u: ]% A0 A, V1 d
( w' `# U( Q* b# {7 Q4 S2 I
9 A" A0 N, r7 W* c  O# E$ b

最新评论

GMT+8, 2023-9-30 07:57 , Processed in 0.120017 second(s), 25 queries .

Copyright © 2001-2023 Powered by cncml! X3.2. Theme By cncml!