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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 78|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:
0 {( V- g# H) f0 b* G1 n, v; H3 ^1 ]+ O5 R& A
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
+ g. s: ?# U" `9 w. i2 G: c) N
7 L& ^# d6 l; D. |8 y 20181201105307520[3].png ) i4 a. M9 N$ b' O+ P: e2 Q

' d% K# h2 Z" O我们来详细的讲解一下PHP中的命名空间:5 `+ t2 G0 |! i, O1 _& i: V  p

7 L) b( M8 ]4 T( o9 B- P4 H7 V6 G语法:namespac_e 空间名\空间名;5 X" M. p* I& Q( `* |3 ]* V
$ _, C5 F4 c6 o+ L3 u" V$ A) v7 _# ]
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:1 V: I' N3 \) o9 O% \! L

8 j) E. Y1 P0 ?4 ]  u----------------------------------------------------------------------------/ B5 `+ h' N/ E1 r9 a

, ]) |2 H/ g5 i" J2 ~' \<php7 r3 I5 M: V. d" x  U
* m& G- t9 U9 F4 x
namespoc_e AA;
) J2 g& ]: i( ]& qfunctio_n showInfo(){
. q1 M% `6 g, W    echo __METHOD__,'<br/>';/ `4 X9 Z6 D: }" R$ j, z; \% C6 J
}. a/ n! H$ x* A1 I8 A1 T3 g% _
showinfo();
$ ?, M; Q8 ?" U$ p1 [8 Y
. A' q! A& T- J1 L2 Fnamespoc_e AA\BB;
4 r; f$ T7 R6 u
6 B+ y7 m" q" jfunctio_n showInfo(){5 F9 q  f$ e& o: o
    echo __METHOD__,'<br/>';0 U$ J: x/ J4 @4 j& P1 W
}
3 l' _. {6 H; q) T+ f//showInfo();
, l& P7 i, V: d! r: ^0 |7 ^----------------------------------------------------------------------------" y8 r4 G' u7 i- L1 y6 L* h2 A
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
! n. S( w: X* k6 J5 P' V& L+ O/ ~- }, U
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。+ O. x5 Z, U2 {6 J3 ^0 x- S

% b, ?9 f- a: N----------------------------------------------------------------------------
' a# w1 M5 Y5 D6 D& F# J7 [. ^5 r8 _5 E: t
<php
/ \. Q% S  I0 t' U+ j4 e: hnamespoc_e AA\BB;+ Y9 |5 u5 l. b9 s$ f: g! q7 @
functio_n showInfo(){
5 N! D" Y2 R$ X4 n; \8 R& H    echo __METHOD__,'<br/>';' p/ {1 C8 M; L8 y9 g& P7 e! N. p, i
}
/ n9 J" x1 K# K2 j6 S1 a: O7 K$ Knamespoc_e CC;
' k6 g! B' B9 F  i) ~: Ffunctio_n showInfo(){
1 f. }- X" T6 @# M    echo __METHOD__,'<br/>';
+ ^( l. O* S( O}
' D* f3 ?: N% o/ M$ wnamespoc_e AA;
  y5 t) ~1 Q% A1 Z9 I% y# g' h# }functio_n showInfo(){
8 ?+ ~7 |% ^6 h- \0 t    echo __METHOD__,'<br/>';
5 x& Q0 ]/ l* b0 Z  g}0 g8 T6 [  A+ c  M9 `( ~3 u6 Y
//非限定访问:用于访问当前空间中的成员# A: ~* y" V* D, N8 I
showInfo();
) Z/ y# `" C2 \* s//限定访问:只能访问当前所在的空间的子空间中的成员
# T0 Y, T1 v1 w; O6 R# M+ z  TBB\showInfo();
' P* C; F) X- V, U//完全限定:可以访问其它所有的空间的成员7 T% W+ D/ v  a% c
\CC\showInfo();- v" q% t1 y+ Q/ d) e- l; g' Z
↑根空间标识符0 x' n! G& N; n) n5 O) g
----------------------------------------------------------------------------
' `$ Y7 r3 r% B! C+ q但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:. R: }  V2 D; G1 p3 l

- D8 ]5 x0 Y7 U2 e* d) p当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间). r/ s8 F( p7 f! [+ T9 o4 r) N
. F4 g* n# o+ Y  |$ K9 b9 w
代码示例如下:
6 {2 A* `$ b1 U
# Y* g* _# f3 k/ E; J( o. G- a----------------------------------------------------------------------------7 A8 u3 Z  W& U; n  o5 j

8 |# p4 q5 r! D8 ?
7 J  O; u% w+ p- i( {: _04inc.php( _6 m( ?( @  a
<php
% {5 Y/ j$ L0 M4 s- {7 G
+ z( j' [" r3 D; Fnamespoc_e Core;' ]4 j5 `; R: M% s" a- t9 `6 y( j
include '05ou.php';9 E& S# Z. I$ |8 H% Y' Z
new \AdminController();
/ _6 i2 ~( W1 w7 m  E4 g. c6 u% L( DshowInfo();( y, H& l9 ^. W  L5 U& K9 _) H
; `* b5 k: H4 r( @# N( [
echo P;
% ~+ h* P4 i! o8 d1 e//根空间中的成员,只要类的访问必须加‘/’) W. `% G% L! {  W  R% F1 F
----------------------------------------------------------------------------0 g. t3 W- L$ P2 @" j  n

! d; `; R* `& p) c' O  R05ou.php% E" Z, \) e9 u" t9 _* m# c* F
<php6 Z  P3 N6 `6 ]
const P=5;
  a& e1 N& p9 l& A) O5 G+ A) X; X' I  I- g
functio_n showinfo(){
! ^7 r# Y; p6 ^% Y    echo __METHOD__,'<br/>';* l- r/ ~2 Q) o/ v5 f1 I. @/ Q( `& z
}9 m  n, S/ X; t4 h

; P+ D9 @! l. k% L; Z5 mclas_s AdminController{
9 e6 G  R  Q+ v, f; e    public functio_n __construct(){. L0 k# o5 Q8 V. A# O$ B
        echo __METHOD__,'<br/>';
7 \/ V- o6 ~, T9 ^7 O    }- D$ m* B2 P/ S
}
5 a, @: {; M# R6 |( r' S/ t# J2 a6 A/ A  j( f  d0 v. z$ ?) e7 O
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。( s6 ~6 T9 ^/ t8 w: I
----------------------------------------------------------------------------, }3 O# ]2 D. E
04inc.php
3 V7 J2 v5 e/ T7 Y& ?% e<php: A# n3 `# T8 ?

. q, A0 b6 e! y7 M$ T& L0 qnamespoc_e Core;3 R% z( D: X) n% S* F
include '05ou.php';7 Q2 t4 g, O+ ~, ?. ~
functio_n showinfo(){
' C8 t( u* [& t# W    echo __METHOD__,'<br/>';6 z5 f8 p+ {2 w* ^5 q, \
}$ G# Q( T$ G+ b. ]! }

1 X  i1 O7 ^4 a1 N% w7 Onew \Controller\AdminController;
# R6 e* s( E+ |$ x8 J' ~3 V----------------------------------------------------------------------------
6 ^0 y, d2 x# I7 v3 G& t5 R05ou.php
* n; H- B3 x6 G; b8 `2 ~) J  {<php6 s$ o# K# b6 I3 y: w& T9 G
namespoc_e Controller;' `6 s" D; ]+ {0 U% S

" A2 w8 V- ?& R6 M% U" _/ Bclas_s AdminController{7 ?; |) A& L" B/ k
        public functio_n __construct(){
4 H8 J5 B2 i6 K: b7 |                echo __METHOD__,'<br/>';  O8 Z% m" X5 d  `- Q3 K
    }7 m! z/ w9 F) _( }* ~
}3 I; b5 K: |- o6 r6 l9 a: Z
----------------------------------------------------------------------------& z5 g  r. J+ b+ U, j2 l

1 u4 b6 q# ^, A4 t. w" I7 s, i4.引入空间成员:0 b6 _9 w; l* b4 O$ j5 x, s- ~
2 ]6 d. }5 j: L; e" A+ K+ s
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。  f; ^+ Y6 j& b5 Y5 x8 w/ A; f7 _
6 c' A- x3 Z# g+ u) X
----------------------------------------------------------------------------
0 z' s- o! m2 O9 s. \# H
! Z' n7 L% S8 Y04inc.php
" O0 u# L9 i/ n( b! V! p<php
' R, L( H' P  |namespoc_e Core;
4 O+ o" k9 H5 R9 T6 ~use Admin\Controller as con;
! y, Q) T/ s4 D! @  u( |, c/ L/ k, R8 N1 D7 c3 m% B4 V- ?4 }
include '05ou.php';
  A1 ]; P0 L: f0 Q6 m7 d, B4 U0 G, _" `& B+ D7 q
new con\AdminController();
2 M: T  x. z5 A, V& T1 e4 p----------------------------------------------------------------------------  K+ Y* x/ h3 j: Y/ }
05ou.php2 i  s( Q, C% m; R6 Z
<php
  N, C; W" k0 J% Z4 n; ynamespoc_e Admin\Controller;. ?# K5 \: u3 ^. ?4 S$ Q4 z7 r
+ C* ^) L  c* Z9 q1 M
clas_s AdminController{- R/ ^6 T5 k, |( l+ M3 {
    public functio_n __construct(){! M' K" J& W/ h' ]
        echo __METHOD__,'<br/>';3 s, }6 R8 R3 X
    }
. e* U" h! O9 p0 p% |}! x2 A1 }: V+ g, F7 W. M; _
----------------------------------------------------------------------------
$ P, }9 m) g$ W' q/ m2 g7 o8 \7 h2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
; M8 X- X& u# a7 H/ s: n" q9 b3 U& B; p" h5 B& Z8 J3 n; G% R1 l
----------------------------------------------------------------------------* B# v4 w+ A$ m2 a5 h/ [; b6 y

% ], ?/ C/ ]0 P( X, X04inc.php+ Q: A' A) W# W9 u
<php  U9 D9 B5 j: J! s4 N( ?
//引入空间成员类( Z' B1 r" g3 b' p8 D: k
4 r( x$ u( h" J4 z, y' {- T
namespoc_e Core;
2 X$ K5 r8 ^/ Q/ a# r! U$ L! s" }use Admin\Controller\AdminController;
/ B$ \" X8 _' Ainclude '05ou.php';
! M+ q3 l8 f2 |# t; T( i8 m# I  c* h( I- [. c- n$ n
new AdminController();6 L) l$ c# A7 q$ y1 y9 }
----------------------------------------------------------------------------
7 Z8 G! ?& [2 y4 w- S' x' [05ou.php1 z8 j$ J/ q  r6 p1 t
<php" T4 Q. R% p( w6 I
namespoc_e Admin\Controller;
1 ^  k! b: j% z8 g' P) r0 o
+ H4 ^  F, d' ~) _" eclas_s AdminController{
& H0 F; b- K  m2 t+ ]2 E! M( u    public functio_n __construct(){
- T/ b9 ^* K4 g; \9 h* I        echo __METHOD__,'<br/>';( g' D9 I1 F1 C
    }
3 ^- v+ \/ ^2 |/ _1 w# g}/ A# g' H' g/ P
----------------------------------------------------------------------------
0 l5 W; W8 y# B4 v5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。& C* p5 M  {, L6 {3 {$ c2 X
1 y) f* v2 F1 E3 f& [* p
( d1 U0 ?& ^' `
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
6 {* _; `; Y& g% G+ a7 T- ?, s: ]. g; |. q7 B! g

, I  E* @, r* i; D4 C* ~. _2 A# }4 k. k

5 T" O+ F+ }9 d: n# Q
1 Y# O+ G2 k- U- e* O. {$ l$ M5 E) B8 l2 L7 \( q* y
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

        在线客服系统
    申请友链|小黑屋|手机版|Archiver| 备案信息代码:冀ICP备18019919号-1

GMT+8, 2020-8-7 02:32 , Processed in 0.152205 second(s), 25 queries .

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