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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9714|回复: 0

[php学习资料] php中命名空间(namespace)的作用和使用

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:% f7 I8 g+ Y# W4 G7 s
1 x. E2 w' U+ L( T2 F1 z, |
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
9 Q. Q7 B1 h4 U. p2 G( K
" w9 l6 ~, n# b5 ~$ B 20181201105307520[3].png 8 ^1 T) j- g" m1 a+ n
- Y# H% J! H& y
我们来详细的讲解一下PHP中的命名空间:7 D) E" ]7 v; i0 F+ J! v0 E
$ V% M5 C0 K$ H2 _. ]
语法:namespac_e 空间名\空间名;
+ n8 ?& i) v! E6 r; T4 m/ R2 W& S  G/ }' {* q! `  I
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
! D9 [5 z; V; X; S4 Y( Z# U. M$ H# P
6 ^4 k8 E* S8 }; [----------------------------------------------------------------------------
" F3 `! i+ h/ w8 E: C% p" R
- Q4 c' F& }( x5 N& W: H( F- l<php
! q' s2 ?! _* @' q& P3 f2 B' F( l3 F4 x3 ^
namespoc_e AA;: L- L4 P; I; Z" G$ n* ^4 R0 D
functio_n showInfo(){
" H( T9 U* V! K- n$ N    echo __METHOD__,'<br/>';: C+ i- o* J; s. r9 G, D* ]
}! b) \0 |$ U2 d5 T" ?0 f" {
showinfo();( v+ m, P6 k  ?; R. i

4 @& b5 O$ h4 B6 }( Z/ G/ wnamespoc_e AA\BB;/ H7 c5 P- e5 U, {5 {7 [0 n
" T2 P) O& P- C, q
functio_n showInfo(){! F9 c% G8 _3 W
    echo __METHOD__,'<br/>';
! a  r  [- P5 H1 ]! J3 _! H7 _7 u}# @5 x2 A# s) `0 S2 a, }, x5 J
//showInfo();( ]3 E  D: o+ o0 D6 O6 V1 o2 G
----------------------------------------------------------------------------* M3 G0 I& q; Q, i! t1 S3 o
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' m5 H) |  p6 a

6 L; F4 ?) i/ m  @, v' T0 C3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。7 S' {8 V2 A+ r; W5 ]% |) ]

* V7 X! P3 d" e----------------------------------------------------------------------------
! C  _! H1 o+ X! r# c$ o: t) w5 h8 T" R
<php  T3 ]* N: W- K. p! a( v! K
namespoc_e AA\BB;& u) J# _( x: r+ s) f' S' ?, j9 a3 ?
functio_n showInfo(){1 l- i4 @/ U; i% H' v! j
    echo __METHOD__,'<br/>';2 Q& {% g8 r: C
}" z5 k" n' {! j" I* g- n, X
namespoc_e CC;
/ T- ]3 C* F( y. zfunctio_n showInfo(){
/ l  D" T5 w! q; T    echo __METHOD__,'<br/>';
" Y0 V, e8 L7 X4 [' O4 ^}
- h; [) u% Z  ~0 [namespoc_e AA;
0 j! a- u* D( q7 d- h7 F8 ]- Ifunctio_n showInfo(){) o1 l7 N3 \; D" |2 U, e, m
    echo __METHOD__,'<br/>';
8 p8 ]* e+ F7 D# n5 l. q# c4 ]}
6 S0 s0 \' D$ x9 {5 ?3 L- E//非限定访问:用于访问当前空间中的成员
* S( X, D' ?( t+ j# L7 ~showInfo();
4 @  D1 x1 _- j( r& M3 X+ F3 B- P//限定访问:只能访问当前所在的空间的子空间中的成员( y) _/ Z3 H7 j5 t! {
BB\showInfo();% j0 b. e! E  H. A/ S
//完全限定:可以访问其它所有的空间的成员. v& C4 J9 ]( [0 F# E, N
\CC\showInfo();
4 v4 s1 m5 h1 w6 V. A/ e( E1 s↑根空间标识符& m' W; U6 P$ z( V4 j$ P5 C! f
----------------------------------------------------------------------------
4 E. [( e4 A9 Q( j' J8 t3 b但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:* p$ a. u. Z1 F' u6 b, r, x
, v/ x& o6 H' T/ {8 T3 T
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)6 u2 O+ `4 F; G2 Q' g# e
/ T, P( Y/ p5 ]7 u$ K
代码示例如下:
' C; u1 A! f4 y7 C- H
, I' l" Y( m! @' n----------------------------------------------------------------------------: S' c9 [& J3 O7 Y2 r+ m; K0 a
( Y% j* m7 }5 M2 e  h

. ]* g- K2 f0 `; w3 v0 g04inc.php- ]3 ^2 k" o7 q: b- u7 f
<php
& ?0 Z0 F4 F0 J* C' C! W: U$ U% d0 a+ {5 r* e
namespoc_e Core;. ^) Z( L9 Q3 j1 O8 Z# i
include '05ou.php';# M  O! M5 x4 L& ~5 e2 Y$ b: V2 G8 b6 s
new \AdminController();
: e& G9 l& w. t3 |( j6 N! ?showInfo();4 [: |" R$ J# S, `# Q, y* ?& ?
( H! G1 r. S$ \2 z6 h
echo P;
0 g$ V. }* a: h: m( G//根空间中的成员,只要类的访问必须加‘/’
1 ?, U4 K$ @; a/ f) Z3 U/ E----------------------------------------------------------------------------
+ o$ [  ]% @% n4 V# h0 R
, r+ v8 i4 [+ Y, ~1 W05ou.php( T9 R  ]. c/ J7 F* z
<php
1 p7 x9 P/ Y) y, \  L- }const P=5;
# L$ a% M8 ?8 K+ ^" E3 t/ @& y# e! K7 I* u; k  j# e; X4 C- n$ |
functio_n showinfo(){+ b' x& W/ g3 j& G7 S% X* d
    echo __METHOD__,'<br/>';& `' y+ E+ N5 D3 O  i, p
}# C' Y" L$ b+ J0 Q& B. f7 H

7 P5 }9 Y5 a2 W5 jclas_s AdminController{
4 a  V& b8 G  [- p/ g    public functio_n __construct(){
* Q3 j0 `8 u5 X4 D        echo __METHOD__,'<br/>';
, B" v* O. m8 c; x4 B1 a    }. g* E5 J0 [1 K5 k
}
  Z8 I" D# Z' J( t
9 c* Q! H0 Y, S0 u第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
; o; R# e& v2 }----------------------------------------------------------------------------
$ ?: K* y3 S1 b' e6 z: e( V9 E04inc.php
; D6 j7 H' \, u" x! x<php
/ ?) I- |  f* ^  r. J2 s
5 g3 L& a2 ]9 n1 k, d7 Enamespoc_e Core;0 D- d; D4 n8 `/ a! |
include '05ou.php';
& N4 O9 }% q" a( [5 tfunctio_n showinfo(){9 {" }2 Q% F) t6 }; q
    echo __METHOD__,'<br/>';$ I4 e' d% {5 i, U" [4 D7 x
}
; M& k, d, _3 u& X. d3 b. Q/ t) Z! Q% ~
new \Controller\AdminController;
2 T% ]/ H- {+ e# e0 q$ F3 T----------------------------------------------------------------------------2 D# \8 G0 M" E0 v
05ou.php
* n% x, c$ G. T: C<php
7 G, Z: v" O4 K$ snamespoc_e Controller;4 ^! z# O5 ]' `! `+ f# `
7 _2 F! [7 d0 G' O9 e
clas_s AdminController{, Q- N4 a  N# g) @" a0 S' o0 A
        public functio_n __construct(){
) t* d, h  \8 e( a) F7 V% W5 X( s                echo __METHOD__,'<br/>';+ H' e1 M- k1 J
    }
' e5 m/ E3 v8 h% H3 C% R( M}( F' m. ^/ h* C0 h! u1 O1 m$ F2 W
----------------------------------------------------------------------------$ `% Q  Q7 K4 c+ N

' ^" T. B) C8 L  y$ ]- N: r4.引入空间成员:
3 `5 F5 n  h+ v! ?  M+ I# I$ G2 E1 K
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
2 A3 R% B* d! J( h8 f. |, F: u: j% `- _( q
----------------------------------------------------------------------------# O4 T* g4 `6 N- ?4 E
* j9 {; L0 H% m" u9 ^
04inc.php) |0 x0 Y/ r4 q' ?
<php2 x3 R4 A+ ?* y2 Q% m( ?# T
namespoc_e Core;
& s* y1 f4 `& l9 duse Admin\Controller as con;
) C! L8 I! g. k' L. Y- n3 y; N5 h& T. F
include '05ou.php';. C% o% V" V- n) P8 E7 |0 Z
% w1 F+ s+ d, L
new con\AdminController();
' z% N/ {4 C; \----------------------------------------------------------------------------% G* I4 g% R  P& @0 }+ e
05ou.php
9 P! \9 y. k. ~- V. Y<php: H# e! |& W, ^7 S/ `
namespoc_e Admin\Controller;
) `5 l1 f  z' l5 l5 q* W  q1 ^- z% r# I0 |
clas_s AdminController{% B0 p0 o: w0 R
    public functio_n __construct(){
' ~  L8 S+ y! o/ |8 }        echo __METHOD__,'<br/>';
! }  G' `" F- G2 L/ U    }
& Z) R3 K8 q! h" i# ~5 a}
& B& j* x( g* w$ K' H  f----------------------------------------------------------------------------! Q- z. ^2 i& Q& X/ _* J  l- x2 W
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
8 A. R6 {8 t1 y$ q9 {
" |6 B  l2 p% i" U6 M% M9 a----------------------------------------------------------------------------
6 ~/ F9 b* j0 C+ E4 g7 V9 h' b& `+ c! {  L) }, b3 ^+ ^
04inc.php
) K' Y& m9 J1 u<php- p2 ]/ \% F  B* J* F6 L, @1 \4 e
//引入空间成员类* u1 j! Z" ]" a5 ^4 b: O
# x4 g# N# @$ B& n
namespoc_e Core;
4 M2 m7 Z& l& `& I4 ^* K4 Luse Admin\Controller\AdminController;. D0 @! o' ?; v/ t0 c, d
include '05ou.php';) Q! h% h) [( [8 H2 r8 g
. {. O8 C8 N3 q6 M. A& x
new AdminController();) S# Y& O( M1 w& V% `+ q
----------------------------------------------------------------------------
. f& v4 ]5 B" n, Z/ o6 f# P; c' ]05ou.php
. u# V' _1 Y# R4 Y. o# Z3 n% Y<php
8 x2 X/ K+ s5 a5 E0 Ynamespoc_e Admin\Controller;
# P  G7 q1 j! v; m$ |0 N6 M/ k% N/ b( `( ^$ t
clas_s AdminController{( h1 v: |  {  h! g! N
    public functio_n __construct(){: O) f0 Z3 D, S  T/ \1 E
        echo __METHOD__,'<br/>';
% M" ~: X, \# O: f% j; k, ]5 A    }! i- h3 @" X8 P$ k
}3 G+ Q, i# s/ F# r
----------------------------------------------------------------------------  @3 @5 n$ Y- X5 ?; ^6 ^1 x+ e
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
' @# `; j4 x3 l( C& O
  j  l! w9 e( b
# I, _/ \1 y; @这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
1 S/ N/ c+ }2 w0 Q" u: g
: L/ _7 F" K! f9 `
: h; Z. i5 h. M' Z6 p, V8 d3 ]; `5 k6 z& ?' g4 D' D9 u
. w/ Z# U5 |. x0 y! G
6 C' W, P1 ^- Y

: u$ w8 s6 _. O9 V9 C- v1 L6 B
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-3-29 21:33 , Processed in 0.137828 second(s), 25 queries .

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