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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
- P% K3 B7 n# ]
3 E% ^  b, ~6 |在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:4 e  |3 Y+ Q- ]( [3 J7 P5 Q1 D

! D8 A+ G! k( J) ^
3 r4 o! a: ]3 k. _1 R* B; W3 p! Z. ?$ Z0 U7 V( Y0 C
我们来详细的讲解一下PHP中的命名空间:
# O$ q, S" Z: k4 W* r+ c1 A8 M5 V% l9 q
语法:namespac_e 空间名\空间名;
/ K1 ?7 j# x" v6 [. E7 C
; J0 Q5 {; b" n# b3 K# ^! H说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
3 r4 U3 A# M. J5 H0 e- ?2 l; x, H, D# M; q" t" F
----------------------------------------------------------------------------2 K/ X$ r  K- q. U. ^) V

+ l) P5 q* u# w8 ^<php2 i- N8 n* J; B4 m" F
/ l6 {( Y1 f0 |  {  ~, P  ^
namespoc_e AA;2 n; k3 P. W# c5 M, O
functio_n showInfo(){
- v+ Q4 |1 @; y' t/ V1 I" B6 Y    echo __METHOD__,'<br/>';3 c  x: G) C- c' \" m
}' y/ ?7 |5 t( \: j' w' h
showinfo();
( }* X/ [# t7 P0 G4 P, t' m4 z8 x/ h$ l8 Y1 E2 d- {
namespoc_e AA\BB;
( n& ?, m+ h& u& I  Z, G) ?; G3 p, h4 d; m) I$ l4 o
functio_n showInfo(){
4 Y7 N1 O2 U$ a" F    echo __METHOD__,'<br/>';9 i8 p' B9 Q7 W$ ?' ?$ {2 |
}
% y+ V7 P3 j9 W+ Q5 I6 h/ }( ]& K//showInfo();
. B$ [/ z- a) V$ j% `; k0 q, x----------------------------------------------------------------------------
. @# o) z) g8 D" P6 j2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
0 x+ l1 K# I: m( k+ T4 U
% B* N. q) ?. i7 X1 R3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
' w. }$ O; E' P7 L( J$ F. F( Z6 s7 Z: S7 k( V
----------------------------------------------------------------------------
0 n: d' e4 s. I( S( \" U; b# r6 R5 L* v1 a, [
<php
3 P7 t4 L" \1 H- Z8 u3 w  [! i3 Rnamespoc_e AA\BB;- g. Y+ [# a  u; U5 p% _! s; r6 E/ N
functio_n showInfo(){  ]; g1 A$ {; X7 A/ _
    echo __METHOD__,'<br/>';. K6 |$ P3 F) {& s% |; g8 [
}# Y; N  F3 j* X. \- W0 W
namespoc_e CC;
9 O# S8 R1 B1 [& }2 ?functio_n showInfo(){: B( T, r! [$ g# f6 i( ]; l
    echo __METHOD__,'<br/>';
. D% b' J; @# v+ p}
, V( l3 k+ y  {* L0 ~6 xnamespoc_e AA;' ], X6 j! d+ H. _0 V
functio_n showInfo(){
) S0 e8 j8 h" L0 [2 A    echo __METHOD__,'<br/>';
" I  y/ s, j. F7 d" B2 l}- O) {. U% w8 X3 |! C
//非限定访问:用于访问当前空间中的成员
" k( C" Z( E! x1 g$ ?9 dshowInfo();1 H& ~% \  C7 ~' I: n3 T% ?
//限定访问:只能访问当前所在的空间的子空间中的成员9 \+ }( C' \4 }1 `# a
BB\showInfo();1 S7 }* ]* \$ I' ?
//完全限定:可以访问其它所有的空间的成员4 t- ^6 F# \7 J4 Q; E% ~2 c
\CC\showInfo();" n; u9 F$ |5 N( ?6 S0 f
↑根空间标识符- h; ~6 T- P5 x! N
----------------------------------------------------------------------------
0 M. p- O4 L' U  p' c! o; W$ A但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
. ?4 Y! z$ R4 e1 k3 g; p7 V0 I" `& h. t0 [
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
2 a( y; U2 f9 C7 e9 }* w4 t# f7 ^% x0 t
代码示例如下:
0 g; G! Q- f/ {5 q  j1 m* o
' h9 m" Z# I0 t% M6 L----------------------------------------------------------------------------5 P4 F2 q- ^: {5 q3 x7 x+ M9 W  R
# Z3 v: F2 x: A) V+ [
" }* S; ]1 p' v" i/ p1 B) ?$ R
04inc.php
" U3 F5 M" [& p. ]: A<php
5 T2 d9 l( A; @7 _! Y2 F9 G- s" G
0 p, _- D* B/ w+ A2 c  o2 m2 C; Vnamespoc_e Core;
: ?- b+ ~* W9 t) {" P# xinclude '05ou.php';+ H$ r1 g. V( w7 r4 l$ T) b
new \AdminController();
! }( [$ |- x- s9 M/ i9 O' @/ Z% qshowInfo();
9 J* Z) }5 J8 _4 H" {8 L# d! F- B% t3 r3 Z' w$ T0 u0 O
echo P;4 }1 k2 {3 O2 \& M& W
//根空间中的成员,只要类的访问必须加‘/’
. Q: Z! x, ]1 I. L----------------------------------------------------------------------------
) `0 x9 s, a* p% |% X9 t( H. i; {& |: ?: }# b
05ou.php
& a" w" ]# z; ~# W% J5 R2 J<php- e: w1 e) |7 w3 C# e1 e
const P=5;
+ {/ }! }8 m; I% C3 C4 ^) f" D* M7 v( x; V  C
functio_n showinfo(){. c$ d" @2 f+ z% v) J( N: f9 A
    echo __METHOD__,'<br/>';
  x! N- H# P6 r}8 g1 ^- A4 g1 y( O: V; @

9 x6 K% O) e) y; Xclas_s AdminController{
$ t/ D* q; z/ @: r# |/ d    public functio_n __construct(){3 u" C& h/ B  ~! [9 y: Z. ^
        echo __METHOD__,'<br/>';* S* Y, }" U' ~) n2 i/ \& c
    }
5 J: x' N" [- p2 b% X1 I$ Y8 [}0 n0 d: \& n, {, J- M' a) }1 H

+ t4 E: o9 m* d) n" e2 S2 X+ {. _第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
' \) y( a& |" U! l, S5 H' }9 D! G; x----------------------------------------------------------------------------! j. S( y* e& m2 ]
04inc.php
* J1 s# ~. B& ~* _- f( o* A<php6 M! \( \# a4 ^8 T  f# _  A  e3 {

1 R, [: `, K' Znamespoc_e Core;1 w# n) T4 L9 }, P6 T1 j/ s
include '05ou.php';% u% S7 _# r$ q
functio_n showinfo(){# @2 z! Q* z2 Q9 Y  e
    echo __METHOD__,'<br/>';$ P9 j( J9 @& J$ @7 b( y" p
}1 C* |" Z, a* [6 d( f

1 N; X6 a. t4 p* enew \Controller\AdminController;; }1 s% N1 v& z1 |, b+ F- H" w
----------------------------------------------------------------------------5 P4 b5 n- L9 a5 w1 ^2 M* e
05ou.php
* x3 ]- |% P" L& t6 S; D<php4 ]# ?4 I8 u9 @& v$ ]
namespoc_e Controller;
" i! G5 u) p) B
+ Y" {5 I$ n* x, }, V/ V/ t1 vclas_s AdminController{. Q, E) S" L/ y. d  _. b
        public functio_n __construct(){6 h# I) W( m! G! u7 \8 I
                echo __METHOD__,'<br/>';
5 U! p' _5 i8 b1 M2 Q2 w    }
1 j# h6 h: g* d4 i9 R, S$ ]}
6 o  R# X1 o9 I6 I8 t9 z* N----------------------------------------------------------------------------( R! Z, [. K' n& d

% ~) A% C4 Q6 j0 Y$ p5 D4.引入空间成员:
  t% u/ V: G% ?& @* E& x+ H- \! N0 K/ s
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
0 X7 A3 R1 U4 }6 X  i! H5 J5 D
- u* s+ @; D' T8 n, m5 M----------------------------------------------------------------------------; J# B! w, N' [/ h
4 J) s: }" G0 [3 Q5 j8 K0 F
04inc.php
/ T/ Z; o% E# K3 ~/ F6 F( ^7 T( J. `<php0 n. v+ \5 T% Y3 c( i5 E1 _1 e
namespoc_e Core;
4 X( t) u  u7 g" vuse Admin\Controller as con;
8 R) w1 [4 U# j' G0 w3 O' n4 C; T+ A6 z. ^
include '05ou.php';
: A, F, u# g$ w6 z( B. k2 b
4 v2 x6 `6 @3 b" vnew con\AdminController();
6 `( J- [1 a, l: D+ x: [# h----------------------------------------------------------------------------  E% Z9 b+ i" u% \
05ou.php
- w& X9 p" G- F' e- ?<php6 x, w& z! X3 X# W- b2 P: }  o+ m
namespoc_e Admin\Controller;
: V' B# t7 m$ ]. V5 L! b& S4 d4 o$ q/ z( ]1 \
clas_s AdminController{! f! C8 Q* f9 Z# `& k
    public functio_n __construct(){
. Y5 ?! r( K! n, d" I        echo __METHOD__,'<br/>';( C9 C' x  m5 V  ^+ K; D
    }4 a+ C) I, A9 b# a
}5 l+ P' b0 {( _/ u( |
----------------------------------------------------------------------------
9 x; g; z) D/ a* _! G) B! g2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。# U2 L# w! E" {* \" _
6 a3 x5 n- @% m# K8 M8 T
----------------------------------------------------------------------------
* X  D: F' L0 S4 D2 i- ~, s$ k  Y% t. I( J: L2 v5 Q
04inc.php8 y7 [7 F5 c0 ]9 f% i
<php
+ r* f/ I) z; P/ O* v//引入空间成员类
! S$ Y2 g4 u+ O0 e. R+ p- M* D
: R5 M% O, \& m  rnamespoc_e Core;3 G" j* Q5 q: y+ D7 L; N! }, ~
use Admin\Controller\AdminController;
0 E$ g, [, M* Y. s) dinclude '05ou.php';
% B( H; n' h' q, W7 p
6 T2 i' D9 \, s3 Cnew AdminController();! `  A% z8 D( Z) v( B' F
----------------------------------------------------------------------------0 z  H0 n9 u7 v2 |6 x$ y+ Z8 g' d
05ou.php
) `8 r- I; R5 m' f* {<php  Z" Y, d& N0 C$ }$ Q
namespoc_e Admin\Controller;# m% L7 e5 b3 @" Z
! k9 d- q( B+ U- ]( P; P
clas_s AdminController{- q* C, P; m- {2 j2 |% h) q$ p
    public functio_n __construct(){
/ |3 H" S  n: y/ a/ m! W        echo __METHOD__,'<br/>';
' Q- T& N  d& q. b' A9 s    }4 ?! X# m' |7 d5 t- Q7 }. l8 \
}6 G0 s  b  m7 T; e$ n/ V+ f
----------------------------------------------------------------------------
, ]' h) e/ n* W: J+ Z% x5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
' `" p) \: A5 ^( C0 o6 o: R
- @2 X) }7 |" l& t( x; h* @1 v: F9 R6 g
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
2 G/ ?" ?+ s+ ]% }
2 A; s2 G' K; D4 J# d9 X5 m
1 v9 O0 K* F) q5 ^6 V6 H; n7 r( O5 l$ C9 R* ^
: ~5 L( `6 H0 d7 l" u4 A
% r6 _& A* ^: J  w

3 Y/ R  n" v# C! @* s( w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 16:09 , Processed in 0.059951 second(s), 23 queries .

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