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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
: W: Z5 l, ^, t6 x) l8 H5 k, }5 n0 t( {# z
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
4 ?. N0 T' y. n* M" `
9 B; f: k- n9 s4 `& E8 H- \ 4 _' R: f$ Q$ B' G* u8 y

& u! y6 o0 k8 Y( B: U! x我们来详细的讲解一下PHP中的命名空间:
: N  q, h& Y; M; ~  f8 x( J9 b
% s1 o2 R) ~* G  v* [- s0 ]5 n: W$ W语法:namespac_e 空间名\空间名;1 Z; P! G6 @. y

0 @; m1 X" f1 m' _* x2 G0 F7 X; P说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
) _6 s% K* R, H8 u0 n1 l4 D7 F: Q! u& M! H6 E- p4 A% Y6 U
----------------------------------------------------------------------------
6 n# o8 m) x8 j+ }
8 w+ q  h) }% \# k6 t4 N% x9 \& L<php1 i! I& r( _. U. u. _
" Y5 _2 N3 H8 T0 |
namespoc_e AA;2 O4 \9 m: B4 t8 O" x
functio_n showInfo(){
7 V( J3 @0 x' A1 |9 }( O    echo __METHOD__,'<br/>';
% T1 ]: w! z2 c7 {' {8 \}
% L9 S4 p: u% A; g3 y" @showinfo();
. s7 ~2 F) s: N( T
+ x* l. }3 U" J3 S+ bnamespoc_e AA\BB;
4 h' z$ z, w- B3 w
$ b$ X" t& A# K( ofunctio_n showInfo(){) Z* H3 w: U+ I* i, Y' E
    echo __METHOD__,'<br/>';
0 M4 p9 M1 @% L& V}
, x+ `) s, W3 S//showInfo();
7 h3 c3 b+ k" k  J# F' l----------------------------------------------------------------------------0 n( i4 |) {; n4 [
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)) A8 Z) I$ C% d1 k! Q0 p
( j0 i4 w! ~3 r; O$ p  a" h- f8 U
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。; x: z( G) K3 ^2 X, q: f; J, q

9 \- H  \1 ]4 n3 q7 g9 C----------------------------------------------------------------------------5 M; |$ g+ C1 B/ ^" L: e  P

9 J2 N! {8 d+ M3 q<php" h- S/ z2 H0 `* \. h6 D! I( J
namespoc_e AA\BB;, ^) g' @. R4 k/ A# c; d. r
functio_n showInfo(){
% Y" S! {  i+ S6 Z2 F2 X0 e( k/ m    echo __METHOD__,'<br/>';
& @, }: Z) d% Q3 c6 l}
1 R* @2 V, ~2 T9 ?. Q; Unamespoc_e CC;' k+ G7 D9 ]6 V3 {& v  r& d
functio_n showInfo(){
- F$ D; K8 H4 l9 ?( P    echo __METHOD__,'<br/>';
& @- W! K7 r# G: K. R6 H1 G& {}
8 T6 v! i3 a* f) C$ j% X) Hnamespoc_e AA;$ K- I8 h5 H2 V0 Y% p3 D  `
functio_n showInfo(){
( y' F( j2 h( o1 d    echo __METHOD__,'<br/>';
" O  j% T. s* L" l& E}! r9 {/ `6 b' J' `
//非限定访问:用于访问当前空间中的成员
# v2 b5 S+ m- g" R2 ?9 IshowInfo();
( {8 U/ T5 w" w$ X  O; L//限定访问:只能访问当前所在的空间的子空间中的成员
9 v4 ^2 a- I+ X! a' eBB\showInfo();
. |, l+ f6 @3 ~8 S9 c7 t, x+ A//完全限定:可以访问其它所有的空间的成员, K) N) u  I6 A9 j/ m
\CC\showInfo();/ ?, h' G0 c2 _) q4 E
↑根空间标识符
2 n2 k7 y5 w- t( E+ T1 {* R----------------------------------------------------------------------------; j6 y+ r4 H9 d0 t8 n4 F
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:4 ]4 d5 h1 B* z5 @
$ o& a0 m4 [2 t# D
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)1 v5 ^# e1 J$ D6 u

" ]& A) f/ g2 Z) b! m/ ~0 E代码示例如下:9 m7 `8 r: h3 j* X) @5 {
6 n( K3 S# d% w0 t8 _
----------------------------------------------------------------------------. g3 o! h" l0 W3 S( Q1 _7 V

0 p6 V! U5 H! K5 l4 {! r: u3 O, U
' k) W5 f+ h  z* O& H04inc.php- V9 @) U! i: C4 n9 N( i
<php
% u* \4 b" _' B' l' T: ]/ h9 l4 I9 z/ T6 O
namespoc_e Core;% W: ]8 l  U- ]
include '05ou.php';
: Z+ m, U+ e6 z% h4 {new \AdminController();6 d6 f5 ?1 p; H% C5 `8 e2 g
showInfo();& ~0 L- {6 W' {/ c$ j3 h# ]: F

2 ^$ R% Z  M$ {7 m% H- }2 necho P;7 O5 V% r/ T: h
//根空间中的成员,只要类的访问必须加‘/’' V, U4 b. u$ _- e0 ^8 H; X
----------------------------------------------------------------------------
7 w2 d  x( C5 K3 L. Z( G
/ G* O: l1 E5 _  z7 S05ou.php
! N  z1 o" U: _# m2 E<php
/ L) j! K$ Q4 o# J: Wconst P=5;
& W0 i0 O* n6 ~. X# @7 D! R) Q
  ~  j3 A: _8 j9 I; ^3 T. Vfunctio_n showinfo(){; E# Y! M, K1 F6 p0 S/ q
    echo __METHOD__,'<br/>';; o& x: e7 F8 T/ g+ R! L
}* \9 l0 s! z$ V( A2 u' }

( S- Z& e# i/ w8 f, ~clas_s AdminController{3 R/ |; w! W) i% S. w0 W
    public functio_n __construct(){& i9 x: Q8 _+ k  E9 v$ q# B! T
        echo __METHOD__,'<br/>';6 X1 `  h& ?2 ?8 d
    }
2 H6 B9 {8 g4 V9 ?2 [}
" z1 ^3 t& ~. {1 i
3 ^+ D5 e5 W2 a7 |4 l第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。5 w( D. O. @- P. [& n0 a- J
----------------------------------------------------------------------------
; e) b( ]. _8 g04inc.php% q/ I/ x& C4 i
<php
( V3 L. @" f+ I% }3 R! x" Z& A/ C8 C# j( [& a" P
namespoc_e Core;& J; h/ i, E1 n
include '05ou.php';1 `8 V. l! Q9 M1 |3 m0 W8 v& _
functio_n showinfo(){
" C2 a# e& k- y6 X    echo __METHOD__,'<br/>';3 m# ^+ O' J, b2 c4 ?" A+ F
}0 R+ O1 ^) m- h7 w' A( l

/ e, B: P* [: E: P$ M; Knew \Controller\AdminController;2 C* ~5 f( ?& g8 l& X) V3 s
----------------------------------------------------------------------------1 u( ?, g4 U4 f: g6 I
05ou.php( J# B3 S& S3 B2 s# |
<php
% G& \' K# P- v3 ?! ~& m) j& Jnamespoc_e Controller;. u  u0 B7 a$ }# ]
3 |/ m9 S) Y7 @% f* b
clas_s AdminController{  H$ U: }% K& k' L9 ^
        public functio_n __construct(){
, y, [7 r( r6 l% h& G, T& v                echo __METHOD__,'<br/>';
9 k- x6 ]2 c0 |* d2 J, i' w1 q    }
: _3 P6 |0 q/ ^$ F. d) q}
4 l6 n& l  L/ Q3 Q7 Y----------------------------------------------------------------------------8 C) N, T5 c$ X, C

' a4 x3 ^7 k" U9 a9 j4.引入空间成员:) S1 u& g& J6 I1 Z6 }7 q- h
* D8 c* [+ J+ S+ X/ v
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。' T% v! r' f3 ~3 V0 i1 i; n
* e- S1 `5 y! ?  Y! f- A. O
----------------------------------------------------------------------------, @1 v0 U7 r7 O
3 o0 p% t: F# ~% K3 p3 |5 g0 S- t1 _
04inc.php  [" a$ k1 `8 s+ F9 Z+ ^6 c! d4 r( S& H
<php+ N' q, W2 v! a2 n
namespoc_e Core;
1 J3 x; W6 d- {- ^/ h8 \2 h- E  r7 b" Buse Admin\Controller as con;% E. }& t" {6 C

# q1 S4 h. Q8 }2 |- oinclude '05ou.php';( ?1 w" N& S7 y- V1 r
8 ]  a$ b; g' O4 F* \
new con\AdminController();
* g# h- }5 l: c----------------------------------------------------------------------------
( ]1 V8 `- F/ ?9 _05ou.php9 Y2 ~+ [; b( I# N, `- b+ r
<php
3 H% X4 C& N& \7 V7 |8 o7 Gnamespoc_e Admin\Controller;
, d* h& B( L% O; Q: J* f8 F  A5 u4 A5 b7 R" N
clas_s AdminController{
8 P" `8 _% X- E* o    public functio_n __construct(){9 s# D3 ~2 k- ~$ q3 [7 j
        echo __METHOD__,'<br/>';9 N) v# Z, P  ~+ O
    }8 I$ r- O7 k3 x: P# d0 E  }4 O) \+ c
}  |0 G" r) R* Z2 N, _, r, n+ S. a
----------------------------------------------------------------------------. j7 N& K! h, G4 q* Z, X, F
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
. B. k' u# @. q5 m  H; {
4 z8 E: c. g1 A- a9 h2 `----------------------------------------------------------------------------
+ Q& {! e/ R/ y  ]0 U+ V& {1 H+ @5 {! B6 Z+ I$ x" q
04inc.php
! B% \5 N* T0 J, s1 F. G/ l<php
- {* w$ \6 a  _9 n4 f//引入空间成员类# r$ p- y% M' ]3 Q* l
* f9 o$ L0 C( Z
namespoc_e Core;
+ y1 l/ {5 B$ ^3 T' Xuse Admin\Controller\AdminController;" V. ^+ ~9 T! K) ^
include '05ou.php';
) \" l& `5 p% f' o2 H# l4 ^# }
. |6 o* W: W: O) \( wnew AdminController();1 Z2 t8 c" u4 I' j; e
----------------------------------------------------------------------------
. E" S8 y3 k7 a. O: m05ou.php
" Z4 C  |3 {: m<php
6 u( h3 S( |5 `7 Q, l/ hnamespoc_e Admin\Controller;8 D' q  q( n% U1 G0 w
) c: k# N: J9 G4 F/ `
clas_s AdminController{, r1 N$ o2 m* p+ X
    public functio_n __construct(){
0 R- D. ^5 L& m( ?        echo __METHOD__,'<br/>';3 M+ R5 A2 u% `. O
    }8 u- i, ~$ D% y8 Y* J! P- j
}, o" g6 E  u7 k; R
----------------------------------------------------------------------------
- e; E$ M! r! b" i" ^/ v5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。" F) }% ?5 z. l9 l

" E0 Q$ }2 I2 u0 J# v
0 d4 B: R8 z  J3 h- c6 I这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
- k  M" w" _9 {# t6 }- i, T1 D9 m5 p+ _
2 O  v8 a1 @0 ^# k  n
! Y  C2 `2 o2 U! H7 b! Z; t
2 h5 H0 U6 [0 b" L
% m+ }- m4 P# f) t

  l1 ~1 s5 @' `1 F! x% [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-28 06:29 , Processed in 0.114633 second(s), 23 queries .

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