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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:/ N; ^. a& }1 x& D" T% P
8 [) N3 l% ?- w$ x1 w$ ^
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:' I0 c; y6 S2 ^  @# L( ]9 v) [, ]
+ n! E0 x' e1 t/ ^# Y8 P* g! b
$ U2 C; Z/ Z( I3 B. c1 ~$ j

, T" L  ~: H$ N" l  @# ^% e5 l我们来详细的讲解一下PHP中的命名空间:2 p  Q9 V$ n; s$ n( _

( L: N1 v" T3 R# f- Y( [3 X/ {+ c语法:namespac_e 空间名\空间名;
8 o1 B5 V5 D( e8 m8 f+ Z3 @% |1 g; H- R
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
+ w7 |% x# g7 l3 Y3 s4 c) R; Q
$ }8 C  W  p6 ~5 _1 \----------------------------------------------------------------------------2 y; J3 u" G- C' h# S3 o' s( x

, E5 h4 s* _% {5 J( ~<php; j8 ^0 h  h. H& s' D2 t4 S' P

( |! j4 \2 P1 e' Bnamespoc_e AA;! t" d' L; T2 N8 n! @: C) f7 g
functio_n showInfo(){
7 V7 O1 i4 B- C9 G1 k: p: b    echo __METHOD__,'<br/>';7 o$ U/ n# g. r3 Q9 {! C: z
}
  Q% Y5 `- V0 e' d# N) \showinfo();
, d" g/ I% O+ ]6 w% F: B; d# e1 [  V. K
namespoc_e AA\BB;
* X, r7 @5 O" L; M; E" i- a  k- P0 V8 ]
functio_n showInfo(){" n5 y% T% e. z+ R: P! M6 V
    echo __METHOD__,'<br/>';- \+ v/ t  V% m1 L
}- y9 q# f1 z6 k# I# V* |! b
//showInfo();$ {1 G3 k; ], M0 v  o8 q
----------------------------------------------------------------------------. h" @2 u) G+ T
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const), E* W% r# f7 t( U% B" V

# g! C. i: o; j9 w3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。3 e+ n- t: b# q" l( Q
  F  ]$ e5 D/ c: S- p  X
----------------------------------------------------------------------------
& P2 x' f% Z/ n3 \5 l7 n% j& [4 x3 v" O6 W1 y- e$ M5 E0 x2 X
<php
2 c& z" p) [6 H8 Ynamespoc_e AA\BB;
/ D; u0 M3 F& a# q# _, Mfunctio_n showInfo(){
/ d, _. @$ H, z7 X& w8 n    echo __METHOD__,'<br/>';& H# F9 l7 R% u7 x* l" E; @
}1 q. y# I, {* R9 Y; ^4 e
namespoc_e CC;
& f  x! m5 `. Z- Bfunctio_n showInfo(){: v) d7 r5 f7 b+ J0 q: D$ P' e
    echo __METHOD__,'<br/>';: B. i* o4 U! B  h
}; l( G8 P3 p9 U' N) v. r* G
namespoc_e AA;
* i6 P# |( \* ?, Z( s. Afunctio_n showInfo(){+ i. [6 U) G$ c3 H3 I2 j6 b# I
    echo __METHOD__,'<br/>';
' |, `* @- A. }  o0 l}% m/ Q, K/ u6 N! G$ ~1 q& k" K
//非限定访问:用于访问当前空间中的成员) O& P- a& o2 H- Z2 G2 ]( ~
showInfo();& L4 [8 b+ [. y$ U5 @
//限定访问:只能访问当前所在的空间的子空间中的成员" x5 \. T8 r3 b: Y$ n* H
BB\showInfo();
) E; W9 s8 G- P! D//完全限定:可以访问其它所有的空间的成员
2 N7 D; ?( ]3 K: g$ Z% L\CC\showInfo();
- ~4 I0 c2 [6 D! n% ]↑根空间标识符
) y9 e6 P9 @/ Y. P! Q----------------------------------------------------------------------------( j9 v; V# U3 m0 ~" m# T. s
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:% u1 I2 Y1 F* ]! S$ f- ~

" d, S- _6 Y& Y3 \当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
" Y3 v5 f) g5 X! x% v, J
9 u: |, j7 N& h* b代码示例如下:. w( t: V/ I8 p' z4 g: _8 T- S+ W
1 b( @3 @) |+ g* d* g1 k  {
----------------------------------------------------------------------------3 T1 ?; g! ]  l1 K- ?* d
9 W, V( I% o) D8 J0 h7 u% I

- C8 c2 c- U( k04inc.php: ?; D% ~; {/ Z3 L' E3 ^
<php
* r6 W. k9 |; r9 P; p$ ]
4 ~$ I- g6 E. E& E$ ]* E' C7 m0 {5 fnamespoc_e Core;
+ J, o. Y0 \  z9 A# yinclude '05ou.php';9 U* n( H+ K+ q" X
new \AdminController();
/ D) m( V6 [) u" X4 n" R, V: ^showInfo();# x8 G2 l: n9 P! N( N1 N% S1 a. k- T
7 Z+ j2 h; h9 [2 w' o: G
echo P;1 \) ?/ _# B7 A7 K) W% e
//根空间中的成员,只要类的访问必须加‘/’* o; ]5 q% {. A6 t
----------------------------------------------------------------------------
0 K% ^& M0 r5 Z  M
4 G' L+ D% e( H' K4 [" |05ou.php
" f; [7 ?  v( p+ S1 S/ r. ~- J; _<php# Y0 q" s2 ?! o- z7 t1 h
const P=5;. _# z3 O# Y) P' H: S

* [& A8 x2 n( a- U4 }3 ]6 e* s3 Yfunctio_n showinfo(){
1 c) L$ c$ d, A6 c2 a# l% w    echo __METHOD__,'<br/>';
$ y$ U" l6 a" ~; t- Y}+ C/ N2 [* R+ f% i: U2 O& t

$ Z, _$ Z5 W7 eclas_s AdminController{
  i* B4 o$ |7 X2 m    public functio_n __construct(){( t0 j  @9 l: W7 |2 G
        echo __METHOD__,'<br/>';
' z0 m7 d5 c8 t7 y    }
( y1 W7 Z& V! D% Y2 b# i}
; I* C1 ?1 ?0 ?0 l9 a  A! Z
# f5 U/ t- X& [2 U/ m第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。. D( S4 |- Q" E0 W5 X" H* @
----------------------------------------------------------------------------
$ J3 F, a; Y) v; R: u# q1 g# x; f04inc.php
, f6 x. K( u  i2 V9 M6 u<php
5 X- N! h! R0 I; `4 E7 q. |- K" @
& f! b4 [2 ]/ I2 W! `namespoc_e Core;' @( R* b8 [9 P+ b  \1 e4 C
include '05ou.php';. l& g: f& i- T5 T; E. z
functio_n showinfo(){' A) n! E$ m) N, {% _
    echo __METHOD__,'<br/>';
% i* T0 G5 Q% I" ]" y8 L}
( T; Q# \2 v0 h3 q& o: X4 j+ D: ^# d' s
new \Controller\AdminController;
3 ]+ h# w, g7 w----------------------------------------------------------------------------
* ]5 I& q2 I5 x* R05ou.php
* ^( z" y$ p; I# Y: e$ Z6 S<php: U. \6 ~4 u! s- G  d+ @
namespoc_e Controller;
8 h$ J0 o5 g, Y; z3 C, ^. U
) r$ M7 Q: M, ?* V9 ~3 Mclas_s AdminController{
# a2 b! i* @* e0 ?        public functio_n __construct(){
) \& l+ s$ I1 w+ _2 I                echo __METHOD__,'<br/>';
5 l4 B& z* `0 J! e" L( b    }2 G; N) p# }, r# ]
}
9 T( y) f$ D& ]- Q----------------------------------------------------------------------------
# q2 C% D" Z' Y4 O  V3 d) j0 r2 C! V; S7 m. j
4.引入空间成员:% v5 `+ }) h+ s1 k% M) V! g5 U5 m" e
4 b- G( Q' \" Z+ L. m9 d1 H
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
9 z5 v" Z) X2 D3 A0 U
& {* j7 v9 e2 `; [/ v- b----------------------------------------------------------------------------
8 c7 j: Z5 v( ]) X# h
- {; k0 k' B4 _0 L# w04inc.php6 ~% j+ o; `6 r
<php5 _1 a6 r6 K2 x' D& z
namespoc_e Core;
% }! T1 F& }% @+ A# x& M1 Kuse Admin\Controller as con;
7 Z+ k9 T* w$ s
8 m0 q$ u1 T/ A1 x' x3 t  e+ minclude '05ou.php';% |6 v: o( e3 S4 U) T9 s

! ?( f4 e4 Z( {0 [/ H8 r0 Hnew con\AdminController();
/ Z' ~; P3 h4 U& c" S----------------------------------------------------------------------------) y! o% D( w: f2 D
05ou.php
( W' w% C  o3 B' o' w3 s- g<php
# M. q; Y8 w5 \' m: Nnamespoc_e Admin\Controller;* o# P8 X# M2 w! q! I. ~
2 d7 v! V% a3 `
clas_s AdminController{
& c( f3 E7 E9 I" @    public functio_n __construct(){, ?) o& I4 z/ G4 ?
        echo __METHOD__,'<br/>';
6 M. U, q( C7 r" u- ?, @5 v    }
$ Z0 u5 m  F" f  M! ^3 v: ^}/ a# X+ a5 [3 o5 e
----------------------------------------------------------------------------
' M; m0 ?  X" f- K& ^9 t, R2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。% d  Q, h* C% V7 M- V$ M3 t& M+ v

; v: f4 v% [# k2 y* F, |/ f: I----------------------------------------------------------------------------
- E) q6 ?3 N& a2 P, z, u$ i
( U( v* q$ W. R04inc.php8 C1 n$ {# _# q% v7 \7 K7 {% P
<php# p) u/ g+ c, o
//引入空间成员类
- n& `/ R+ B6 X2 ^
+ i* o: L: g3 x- Bnamespoc_e Core;
2 U6 h% E# B& z5 ]7 ^/ Euse Admin\Controller\AdminController;
& ^: c) w+ c4 I2 f& oinclude '05ou.php';4 f! K# |" C4 p
6 ]( k! a; s# B6 `) X2 |$ F
new AdminController();
, H% g8 P3 v) u1 @----------------------------------------------------------------------------
* g2 k0 x) a; P05ou.php
" G6 k2 \/ i8 |7 y0 j<php
# }' H' O, n5 V8 {$ O  r* q3 m5 Knamespoc_e Admin\Controller;
4 W+ Q1 [& R) O+ `* X6 G* m4 \0 J1 ?5 f& m  w7 p  C
clas_s AdminController{
: D" L! _! ]( r6 f9 G( o8 c6 o& B9 e/ b    public functio_n __construct(){8 j: z  |" }0 ~% |
        echo __METHOD__,'<br/>';
6 i+ Q& q* N7 x, |    }
1 |2 @% V4 U0 T  L, z7 G# I- N+ j7 G) P1 l}$ N/ W. m) v1 I8 G, y! k
----------------------------------------------------------------------------" A! r( s- u/ a* `& }8 q- `. K
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。6 k3 d  v9 I4 M" s! j

' |& J: a- C& A: A+ x$ g( r: ]" h4 q
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。0 A) U& q: m7 c+ S% z% |3 o
7 n: T2 ~! @( N+ k3 Q

' Z' |5 ^5 P7 o# g9 W' q- ?% T; {4 ?$ l6 F$ e0 a# m

$ f7 ^! P+ `, K3 F/ N) b3 \. h6 I/ a0 H2 o! Q  [
( ^% |- D5 O; `. j

最新评论

GMT+8, 2024-12-21 19:54 , Processed in 0.127725 second(s), 22 queries .

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