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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
- K8 T4 p- U( b! ^4 X1 _. H# t1 H0 a! ?' O% W
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
# I7 `. F1 ?6 b* H; J0 V, t1 X- b. O* I
/ ]# S' G9 |% m1 p

& R/ p9 P* u, ?. V/ v我们来详细的讲解一下PHP中的命名空间:
3 z7 v5 _/ W6 J* C( v9 v, S
* o/ Y- z/ Z9 O  d/ z语法:namespac_e 空间名\空间名;+ K2 K7 a& o' Q6 h9 U7 t+ q1 ^
4 ]8 u+ m( [: u1 I
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
# C% u1 {2 j. d" y1 ~2 D  `& Y
8 b# j1 G' R8 n: |3 T* G----------------------------------------------------------------------------7 [6 X5 x% h8 j& T/ H8 A, V
1 G" q/ d+ N2 v6 Z0 _
<php  l: J) d" ~, J8 N8 r

) K4 B0 l$ T' o- d0 ~namespoc_e AA;
6 D/ ]' ]0 z! i5 P5 N' ], j: s5 vfunctio_n showInfo(){& f2 O6 ^  l( ]% U7 C
    echo __METHOD__,'<br/>';, h- t+ r( S# u; q/ I: x( M1 x
}
5 V6 W  o/ I  S) Z' cshowinfo();
4 ]* g: J* ]% k# L, l9 W: U% ]: b- R5 V6 ~+ B+ D' K( K2 S
namespoc_e AA\BB;2 g" h& r# z- U  I' D* Q

- ]' C# j7 `( jfunctio_n showInfo(){
6 A* H1 g! R+ H+ t* O    echo __METHOD__,'<br/>';: x- F* |! v1 R( V6 r! H
}
: X( p3 M& _3 d//showInfo();% z# [7 L5 x4 r+ |: ]0 l, W4 z
----------------------------------------------------------------------------
  G, r/ Z% N6 Z* W. T' @2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)4 d6 C3 e! ]. B3 y9 P& p& a4 o

0 _2 [( W4 F: }8 C: K( h2 R0 |3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。" ]  V3 e! [  q+ ^
$ ]  K8 @6 o! y# C7 Y
----------------------------------------------------------------------------; r7 ^, s8 C% p% R6 @4 r

) g: m1 P0 d  ?& a/ T) n<php3 f: B1 ]# G" _/ \- [3 ?  H
namespoc_e AA\BB;( B4 t! o  k/ k! }; n. H( j8 V3 ~$ V9 _
functio_n showInfo(){" I4 C/ k" E" x, P0 ]
    echo __METHOD__,'<br/>';0 H* \/ d# \2 }1 A: \. j3 Y
}
6 K4 o$ I5 B6 e+ Dnamespoc_e CC;
! F) Y& o5 E2 E6 wfunctio_n showInfo(){
8 F. y1 }- f! `# [7 \    echo __METHOD__,'<br/>';8 V& x- B/ G5 ]- S" j
}. a, W2 r9 e' M" [2 j8 V) v
namespoc_e AA;
# s. \) S3 m  t4 s0 e$ kfunctio_n showInfo(){) Y6 Z# W" p4 G2 M8 V
    echo __METHOD__,'<br/>';+ s2 m( |' s& z6 O
}
, W0 l( q' _: i7 l, `7 `6 a//非限定访问:用于访问当前空间中的成员: z4 M' r/ ]9 U
showInfo();, T3 q7 }% z6 t! ~0 ~! A  N
//限定访问:只能访问当前所在的空间的子空间中的成员
6 }4 F8 j) v' l3 Q" G" Y# I. XBB\showInfo();) @. x. {5 z( V$ n& G
//完全限定:可以访问其它所有的空间的成员
: n5 ~/ b2 [/ E7 ?& r' o* Z\CC\showInfo();
  I1 p4 q, T( R- z# [$ ?↑根空间标识符/ `5 Z6 F+ ?8 z" r' z8 a
----------------------------------------------------------------------------% D9 \+ z9 }3 ?/ f9 `! f) {3 j1 X
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:) ^1 ^( {7 L. ?7 d, q
+ E7 K# {: v( U5 \& G) G
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)! b8 r' Y6 _: N' k

4 ^5 ?2 V! g) U' N* B代码示例如下:
* p* p$ Q' i  a0 |
/ T+ V& ^9 s/ S8 V----------------------------------------------------------------------------- _1 [0 T% A" Z9 D" R8 U; c

+ c2 }6 F7 D  Z' ~* K* z, W  ^5 J  m/ Q2 |5 ~4 Y
04inc.php1 F4 j8 f$ ~& v; s$ x7 P
<php2 B  O; T3 t, h- z$ t' P* R
% G% H; d" r, p
namespoc_e Core;
; x  p) q4 S3 Zinclude '05ou.php';
9 L' l: b9 H! U0 F$ j: Ynew \AdminController();: Y6 w6 p* ]" ]' {6 D! \; W6 X
showInfo();! `. R6 v( R+ m4 a) p; U* K

& c) U, x; a' ^- ]7 l: c* Eecho P;
" v5 V# o( v' q6 r* A! l//根空间中的成员,只要类的访问必须加‘/’0 j# U- p7 ?% ?& p! H7 M9 ]% o  l
----------------------------------------------------------------------------
  s( s- o) ]% o- o3 z; }8 j
3 S: l8 C) V9 k* k! r3 s05ou.php
% L- l: A3 ?3 f+ B, ~& ~, h+ Q/ ?<php
9 n! `3 H. X+ y& o$ F! pconst P=5;# n, q( \7 U! X: E, x  O8 D) e/ o

6 m# {3 m1 B& c: [# w0 s$ Ofunctio_n showinfo(){2 h( c/ s( S' l( N& x, v; p2 t
    echo __METHOD__,'<br/>';
. R, x5 |: C' k  V" D2 w}
/ W# M4 r( r7 r2 v9 j. ^
0 a! n! X/ F0 p, ^- `5 Pclas_s AdminController{( x* }/ D2 t) N0 u9 `
    public functio_n __construct(){6 Y/ T+ @# [" j6 z: k3 Q/ ~6 n+ D
        echo __METHOD__,'<br/>';
9 u3 O  |- v& h    }; `) v/ K/ I+ x' P
}
  G4 `7 O1 d$ H5 T* |0 P- Z; J, j9 D+ D) `" [4 h
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
$ s  R+ G9 y* N----------------------------------------------------------------------------
/ P! B! A9 H/ @* o0 b' _9 q& z9 G04inc.php& w/ P. I2 i- @, i4 s
<php
& ^6 e; ^  K8 O. M: s+ C3 z- G# w4 p8 ?& ~, X# s8 Q
namespoc_e Core;* C3 D! w' q) [! n0 E
include '05ou.php';( Y+ G0 A- l8 W& ~5 ]) {6 n
functio_n showinfo(){
; X5 I3 j! X: y# x% H7 d" l    echo __METHOD__,'<br/>';' W; y4 }1 |% g9 n- [2 n
}9 v) l: p4 }: e/ a% F
( v5 u  e( h8 @; I  b' a
new \Controller\AdminController;3 \/ P7 p1 D" ~% }
----------------------------------------------------------------------------8 C) G% q3 y) |. x! k7 {9 T
05ou.php
! b7 {8 I' G. T0 y- \, P<php& z0 ?. \* c5 I8 O* t8 R. K3 t
namespoc_e Controller;. w6 ^: T6 Q! Q3 }4 E6 Q+ @3 g
5 u5 r" ^. ]* J! b5 `
clas_s AdminController{9 M  n3 D. j2 W6 E3 |
        public functio_n __construct(){& z7 ]7 _' q& K( d# k5 Z
                echo __METHOD__,'<br/>';
' V' h9 Y# v$ a  }9 m2 {4 M    }1 {6 T& r0 b# p9 T# _6 p
}7 c8 }7 v; C- ~7 q+ l
----------------------------------------------------------------------------0 X# H; L. \3 z9 c+ K3 [% l
8 r1 s$ l! O0 p1 U8 M* C( W
4.引入空间成员:* j2 `2 G3 _$ G* u% H; J
4 |- Q+ z0 L" i7 Q, G7 a
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。! ^( W" b: H7 w1 r

& n# C  w# |# X) _----------------------------------------------------------------------------+ I, X$ c0 T8 L/ D8 D5 E

% M- J2 E3 B2 T& v4 j+ a- r04inc.php+ M* y0 z' T/ L$ v* R+ o
<php/ u9 t. N: D% T1 L( x
namespoc_e Core;7 h% R5 R) l; R8 }% l) N
use Admin\Controller as con;8 v& n  [4 t) I
3 o& p  ?% k( G& H# r( g* }# J
include '05ou.php';
. |/ k$ Z1 k, n" i* T/ v; {
( L, l9 T/ W" _3 w) h+ Snew con\AdminController();
! \8 t" f/ b. R; d( g: O----------------------------------------------------------------------------7 W7 p- v9 b1 f( E8 f% g2 X& a
05ou.php, Y8 B+ o& F% U0 C
<php1 L0 z8 @/ \+ \  r: h% R3 |2 Y
namespoc_e Admin\Controller;3 _- A1 `' l; ^( J

( z) t4 m5 o7 @0 Y; j# T4 oclas_s AdminController{
8 W5 ?& D! [& Z9 Q( j    public functio_n __construct(){0 g+ I2 Y( ~% i8 m' L+ Q
        echo __METHOD__,'<br/>';9 u* L0 E4 t0 a  D5 B7 Q/ m2 w. A
    }
) b% j6 U' Q' w' I8 w/ G" V- n+ v}
3 j1 s* v3 L& m7 S----------------------------------------------------------------------------9 j1 ?. m  M" _- F
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
* F7 o3 R) _: L" a7 {5 B* e; _
0 F* q5 L1 _2 J----------------------------------------------------------------------------1 O  M+ R, B/ _  a. ^. A

2 ~( _) E9 ^1 R# ~' D" z- J' v04inc.php
3 S1 M! [3 y0 T8 S7 f<php  X; f" E, m3 r/ N% U
//引入空间成员类
5 C5 e: m5 @; Y% Z6 P4 B1 S4 E: K
+ [% J; F: ]6 o! C/ Hnamespoc_e Core;/ P' ~0 V& D5 P+ a5 _" ~7 s: q( m
use Admin\Controller\AdminController;3 j1 b* I: T( h3 u* n: v9 ^! K
include '05ou.php';
* \( L+ c& D; c6 o1 z4 G
) j3 |6 U$ [7 {% Y( v( n+ Gnew AdminController();, E  J6 W' \% a2 |6 A
----------------------------------------------------------------------------/ x4 Z* ~5 x9 c# |
05ou.php
' o+ C+ ?! |* g! t9 @8 u- w1 {<php& `* y+ L; E3 i: _5 Y' ]
namespoc_e Admin\Controller;
: F; h4 b$ a; X; S& J8 J+ s6 [8 v7 c/ c; h4 H4 {) t+ A/ o
clas_s AdminController{
( b% q2 @; X% V: s2 {    public functio_n __construct(){* }; t3 R3 n1 x9 p% n
        echo __METHOD__,'<br/>';
4 m! Y& i! _# f4 Q    }/ n3 f+ i% }0 x7 i
}) Q8 l. E( ^& E" K
----------------------------------------------------------------------------
1 ~* g5 Y8 y8 u$ P! F% i; f5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
( t/ F/ E2 H) K7 F0 S; L9 l. ~4 d( {7 o! b: n* i
9 J8 b8 k. J, e, e
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
7 t7 K8 N8 [4 H2 @3 m+ o, o
+ f8 Y. L7 N& i( h0 u$ n5 \, y6 e
. {5 }) Z, Q+ _8 @9 a$ ?/ E- Q

7 J6 ~3 L% }3 w  V1 i: {& b/ L# J
; H9 ~6 b9 _& n6 V
- a& }2 h( Q7 V! ~& n# i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 16:18 , Processed in 0.056089 second(s), 22 queries .

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