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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10529|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:( b, n: `4 C+ Z( E3 ?

2 ^7 c4 @) b) G; F  @$ M2 j在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:+ c- E9 a, }( N1 T
( l! B. ?- a% m9 L

' T! B4 x# Z0 D- J/ w) b
; D) C: R: [9 r: p+ o" w! W4 g我们来详细的讲解一下PHP中的命名空间:
: i6 G+ z% H9 ^, x* s" J
. A+ f4 {# M4 U: q& q3 M语法:namespac_e 空间名\空间名;
: {5 D; d% F( J0 d& p1 X# S* @9 P# ~8 R" `; u8 _# T
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
( ?/ P) d' [8 u3 X
! G$ a) W  L7 i; O----------------------------------------------------------------------------; H/ q2 _; f  R7 f3 e, o
' W, @2 [$ |% h! g) t
<php2 M0 Z( t" B3 f4 [. y* u1 K
9 a! u; K% ~; c% l9 z) W4 y, M
namespoc_e AA;
5 m* j- g$ f3 v4 A+ F6 [4 t$ hfunctio_n showInfo(){
! O2 H1 L! l. @$ j    echo __METHOD__,'<br/>';' v4 K- [$ ~8 \+ V# Z: `8 Q9 ^
}
+ s. m" o; W3 N8 T% O! qshowinfo();6 l3 b+ c" K8 R/ B
) l# X/ Y/ g4 M+ Q5 g5 _/ F
namespoc_e AA\BB;& c2 b% _, N( a/ G: I$ a
! B* T+ ~$ Z7 K. a" I! [0 O# T
functio_n showInfo(){) p: t9 T  [2 |9 x+ ^
    echo __METHOD__,'<br/>';
8 T9 y* v% U8 a% s6 D: j, c}# T; {3 e* v: ], E- r, Z9 d- t
//showInfo();- z" O! e$ A  }% f0 {+ q- Q& T! l; U
----------------------------------------------------------------------------
4 H2 {% _" {# T. }- J, X! e: Q$ {2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
1 O% d" U% @0 X; y% v/ ?6 [) e, w, Y+ G1 |( [  d* M; l! f
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。, H6 O$ Y6 e! Q5 T' W  Z( X+ X$ Z

$ D, c) E+ g* K* D----------------------------------------------------------------------------
. [( i4 `. D! s. z: d0 r. B" w7 s$ l; ]/ m
<php' {9 `, z( I0 Z* ~# F& F
namespoc_e AA\BB;
  J+ I# M% X, `: `5 A2 Ffunctio_n showInfo(){+ {3 Z: X( M& X8 O' N  N
    echo __METHOD__,'<br/>';
8 T4 I" @- s5 B% A9 O  ~' J) l% I}( ^( l+ I: `$ e. F" Q) n
namespoc_e CC;
* J) `8 E6 k* W& C$ r/ `functio_n showInfo(){
* ~0 u4 v9 r4 M2 p" O: Q# e    echo __METHOD__,'<br/>';$ z6 ~; Q1 L/ L: l- y
}
. n+ T. ?* Z7 Z; I+ R* gnamespoc_e AA;- X  {( Z0 g, ?% i) z3 @
functio_n showInfo(){* ]7 X2 f- }. u# O4 N
    echo __METHOD__,'<br/>';
+ f& K. E6 Z/ K* X; |( X}
! o' N& B( Y3 Q" e7 K* t3 L8 \, b//非限定访问:用于访问当前空间中的成员5 u2 @/ V4 q" x* x
showInfo();- x6 n' V' K+ J
//限定访问:只能访问当前所在的空间的子空间中的成员
5 O2 x, D; \; ~0 e5 l0 H3 \BB\showInfo();& H2 N2 h5 r6 P( f5 v
//完全限定:可以访问其它所有的空间的成员8 E9 \$ e; p- J0 m. }* k  i" |( o
\CC\showInfo();
9 ^' Y! ]2 e% v# A2 \↑根空间标识符) A; Q. C' b) @- p. r& i, y
----------------------------------------------------------------------------; S. r/ S; S6 e- r/ m5 t) U
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:) @2 _3 d5 r8 T' h' U9 ]4 y" Q6 y

; Z2 u9 s3 C1 T$ o/ U+ m3 @当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)4 y  p1 o5 @: a1 S4 L/ u8 W

/ J; Y  m/ L0 N1 v4 ?, `8 z& {代码示例如下:
( [5 A7 u. L- O7 m
, |7 t! o9 H' r% D, r----------------------------------------------------------------------------
4 {: T+ z& I4 Q" _& M# x
% W8 I! P: w" _/ p
. z0 E% I+ Y2 V. d; }) v% I04inc.php0 e  L9 k: U. h7 `: L2 s
<php- i" m/ _  \! w8 X, X2 \$ ^  C
, a' P5 K+ K6 w& X
namespoc_e Core;
! w3 a! f7 L* M6 `  i" C) ^include '05ou.php';
; T0 T2 V% I: k' u, B1 i; F7 }6 j" ?new \AdminController();
7 a* S6 p0 N: J7 p5 @) ^% kshowInfo();$ q# z5 A1 ~- K$ f6 D
4 R& Y6 J' }* w6 x' N
echo P;
# m7 o, E5 I! U& Z1 A* b//根空间中的成员,只要类的访问必须加‘/’
4 y8 _+ o8 f! R$ s----------------------------------------------------------------------------
  [5 ^( i0 l& i) }" s! @- }7 t0 T8 U8 r7 ~
) u! ~; o9 ]' L' K0 y1 l05ou.php$ _3 _- P) ~4 f" x1 m7 V
<php( C* E3 `" b) T1 L: A3 n6 k
const P=5;" n( }4 o' G3 r. r" A- F* a" y0 j. i; X

( J* G/ T5 B1 @" c% B4 c% U7 dfunctio_n showinfo(){/ o& N7 t$ W/ B, M& {6 X( ]
    echo __METHOD__,'<br/>';
7 F3 _# G; @, r% D& s# Q}
0 V0 d+ y. y) h5 o  B
( O, f( V& s9 S; w+ g* vclas_s AdminController{
. ]: x! A) o' E) S5 [' e2 c    public functio_n __construct(){
; }" ^9 w9 F6 Z: J" \9 A        echo __METHOD__,'<br/>';
+ B5 Z, u$ U7 c- Z6 V    }' I+ K% _. t& H3 R# R; b
}; D& A# I8 u/ i2 V! @$ @2 t

  ^& s; N3 o2 q' r3 R; I第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
% z* H1 |  ?  Q! e----------------------------------------------------------------------------4 e1 {' ]+ {- `( E7 s: T
04inc.php; ^& C/ r" w8 S; n0 F1 t
<php7 d3 l7 x4 \, o8 l& Y8 Y/ L
0 U: f5 _' M( v$ L7 Q* n% }
namespoc_e Core;9 Q; M/ @$ d6 z/ i" t$ |) O
include '05ou.php';
+ Z+ u1 _1 y0 w) ^* b: Efunctio_n showinfo(){
* v, ?/ A, R: k) q4 I* X    echo __METHOD__,'<br/>';
: R) \, i8 T9 H' F7 W8 E$ U}: u& D- P# Q- s, G2 m+ G* B9 p, V
& B9 ]' Z+ N' G/ @- ~: J
new \Controller\AdminController;
% w4 |4 j: e" h3 j5 p+ J3 U----------------------------------------------------------------------------
. B9 E5 D6 |3 E+ ^05ou.php
, g. r* y; W& C<php. r. E( L1 N& v' C% c0 d
namespoc_e Controller;! q5 M6 r4 b0 {/ b5 q, K  U
# H4 C1 x, V( y
clas_s AdminController{
% [4 a5 e. k# E8 U" U4 `        public functio_n __construct(){9 a" x7 _$ E8 T1 T
                echo __METHOD__,'<br/>';
( {; ?' T. M- t8 o    }
2 s3 _( K, ?  |0 U6 _# o}) @8 z4 ?$ l2 e" f) I& U' m
----------------------------------------------------------------------------
' v+ M8 f+ W2 M4 X% R  ^: J& [) h7 x7 ~0 l' n& Q7 ?
4.引入空间成员:9 d4 m% H: O; R" B* y3 _
+ Z& j( Y! W" }2 o! N+ R8 {- ?. @
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。) C: o* A0 \  d5 t, n' w! @

  n# W& w6 w8 U9 X+ D# H, F----------------------------------------------------------------------------! I3 O0 m  Z/ t- t

# o& C' n. t* ?5 v1 R' d04inc.php8 V$ o1 \5 m* o. ^9 @. j) e! P- R1 v
<php, u: l6 Q5 i9 t* Y: [
namespoc_e Core;
, n- T( ]3 A! U. suse Admin\Controller as con;6 f7 m8 b2 M& a: C

/ O( q2 \# p% ]+ Z- l" y3 w! finclude '05ou.php';3 g4 r' v! f  R
4 k) W2 W+ b- [. E
new con\AdminController();8 Q6 Y2 b4 c( O$ }$ H
----------------------------------------------------------------------------
  P9 s, y/ Z- E1 _2 T05ou.php
* \9 Y. N: T) Q- U- n<php7 B2 H# K. t, V$ F9 ~* g" O# t
namespoc_e Admin\Controller;+ [, [! o9 A! S

% j1 l4 s; `, f7 ?6 Fclas_s AdminController{
+ [* ?" m& z; B& j9 e7 n    public functio_n __construct(){
5 ~( X% u, h4 D        echo __METHOD__,'<br/>';
; s% P+ H! f/ b  v  Y$ t, o  M    }
' h% P) U& }5 @& h: W( R6 I- c1 J+ N}
! _( o" }$ o/ C' I- Y! n----------------------------------------------------------------------------, Z" ^- ]3 `* L; i9 m
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
8 v8 D. C' a( p6 N+ F
6 y! R. g3 Q# a' [( {4 X+ @----------------------------------------------------------------------------/ P7 r( T7 E( a- l% q, |# S
5 b- e3 w9 m; O" O
04inc.php+ L, u% k0 {+ ?$ l6 K5 q
<php
0 W. l3 C: k$ U+ J' U4 ^//引入空间成员类, O1 A* V4 @5 A0 c. P' F2 `; W
- f/ w) C$ J- H3 p$ F) `  J4 ]
namespoc_e Core;  X* Q; M9 p, |% n
use Admin\Controller\AdminController;
/ d9 p9 @" F5 d: M& cinclude '05ou.php';
% ~. p2 L7 P% ~  |
7 ^* D5 ?7 \0 P) U# {9 Xnew AdminController();  }, b4 J$ I9 d, F
----------------------------------------------------------------------------
" U, d6 \6 s* u4 N5 {- T05ou.php- B( r6 e9 @! Y" B- Z
<php
8 G' ~" R2 u1 ?% X* Cnamespoc_e Admin\Controller;" B% z8 t# o3 M) D+ ^

9 C0 }" J$ T  p* Dclas_s AdminController{
/ t* ?5 S7 v& v! R    public functio_n __construct(){) X. @$ H  v" D4 J+ O
        echo __METHOD__,'<br/>';6 j- a) _  b5 f$ b. F: z- i
    }3 N  I0 P7 @9 G# X8 g& b) P
}
8 C& Y: h3 I4 j  V7 o3 f& p+ b----------------------------------------------------------------------------+ I. D, x8 K, g+ k
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
$ g4 N7 b& K1 \7 z4 I, s
' k0 @( W; T; B9 ?8 y7 W5 q# w9 _" h
( |" H) U* K2 @1 y; |- \) R这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" X$ a: `0 R2 s- l4 [! r5 u! x( K9 C6 i: ?7 [
/ h  X2 j$ ^: V

4 x5 k  n! }- v! q- u0 r9 J0 b7 z8 V$ R2 p* D6 U" X/ |( i; E/ K( r
, e/ G4 R3 ]6 _1 O: {2 {; J1 h

0 u5 y0 \: c; l7 f1 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 21:00 , Processed in 0.133408 second(s), 24 queries .

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