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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
4 }- _- B$ \4 l0 R
. X+ W; a2 Z3 |在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
  Y5 N& g% Y1 B: H  R( Z
# B( M2 Y  A) K
% d# S( J) V/ I# b8 U4 u! }: Y
5 E( |/ p2 S! s7 ~6 K; ^  r我们来详细的讲解一下PHP中的命名空间:+ @* M2 Q9 \  R' p- m( o- i
0 _/ a0 `0 X" o6 H# y0 ?
语法:namespac_e 空间名\空间名;
2 p: R+ ~+ z8 Y0 J2 Q: m# Z: [7 ~0 P. B8 x* ~" ]
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
# ~1 q' y9 _0 y( S
6 L, a# f& _5 \$ S9 J5 i----------------------------------------------------------------------------
8 P% A% u3 e# P' I, W: _- c
) p1 @3 a( e& n6 Y<php
. z2 m: J0 e' [$ H' m- w* u4 |0 ?6 ?4 O3 U1 F6 F" W2 q" T
namespoc_e AA;2 X4 B# ]" p7 G
functio_n showInfo(){
$ a0 `5 j, b/ i    echo __METHOD__,'<br/>';/ H. w! A: R2 B
}
* `! o0 {' l6 I+ Lshowinfo();
  V1 T/ L9 V9 H' f$ Z6 U# L3 O5 g# D4 k7 x4 x( k
namespoc_e AA\BB;+ p. r1 H! @% T# m" v, R. g

& o! o2 N0 p! r/ p* B+ ]7 K+ N# \functio_n showInfo(){6 l/ F0 O8 u. B( @0 _
    echo __METHOD__,'<br/>';1 S- I3 _  g1 s
}4 m: k# R2 w- D- ]6 {- g7 `
//showInfo();; a$ a' @8 D& [
----------------------------------------------------------------------------
- j  d8 L/ r7 f* n0 n" O4 a1 g2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
) _' H4 V5 u3 z% U3 N
3 d- b, d* t3 `7 D3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。9 r- z7 J/ [. D' v
% ?. ^9 N: E4 _6 U8 J  G/ l) _. m
----------------------------------------------------------------------------
  e1 Y3 c) y7 V" W; f% w
' E. X& P3 `3 _/ S* L4 ]<php
0 q3 Q, F! G* Z: a/ v7 Unamespoc_e AA\BB;' z& {- o" `! i
functio_n showInfo(){
; L9 t0 B4 C9 H/ I0 W    echo __METHOD__,'<br/>';
) N9 q+ ]* f" k( [}% a, K5 w$ R& X+ T  h
namespoc_e CC;) I7 ~" i* ]0 r  U" \8 o1 O/ I
functio_n showInfo(){( {: ^. _! D; t7 v' E6 h* W3 z
    echo __METHOD__,'<br/>';
/ [0 d0 k$ _5 a1 T& P}
6 h0 x' i0 t% h1 V& G  d' Ynamespoc_e AA;
; q+ h  A: p$ W$ P: Cfunctio_n showInfo(){) c1 @% ^& c  b) K( K& A
    echo __METHOD__,'<br/>';# `) q$ T' T5 G- q1 L3 k5 b
}
5 h) W! ?6 t$ U  l- H//非限定访问:用于访问当前空间中的成员2 p2 m: R& p% q5 n
showInfo();" `! A% R* F4 p/ W2 B' d
//限定访问:只能访问当前所在的空间的子空间中的成员4 `# U& x0 m. x, A) O; p* D
BB\showInfo();5 {" I, M- K- d: c4 q& j$ c6 ]
//完全限定:可以访问其它所有的空间的成员9 {% \! ~* E! [4 N5 d
\CC\showInfo();0 ]0 B9 I: E# H1 X( N2 V
↑根空间标识符* K- L3 d. ?9 f! Q( h. h% c
----------------------------------------------------------------------------
# A3 G# f; N% _" S8 }  G但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:. c* ?" I" q7 n, g* z* r" n9 O5 c
# |5 J9 G9 K6 H4 @6 Y; u" x
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)' Y2 \: ]5 X: t
7 G! O9 u% B4 F6 A/ g( {7 A3 L$ _
代码示例如下:
8 E& W, @8 U  G/ |
9 M% L% @" V1 F4 r+ k----------------------------------------------------------------------------
" n& a) U# _& M7 h2 [
* ]# s8 X, q. r/ s
% E- J+ w3 W8 F: b1 Y04inc.php
, A8 B8 R% ^# a; d5 X7 ?<php
0 \: S1 Z, k# K  ?3 S
0 a$ z$ L4 a7 U. Knamespoc_e Core;
4 b/ w" p* |( c- a3 ?include '05ou.php';* d+ D5 s! }( z* C! ^% i& y5 S
new \AdminController();: B- \0 _) j/ [# j7 V1 m5 L- k6 S
showInfo();
  ]2 S, {8 S$ O! ?' d2 ?  G6 W. ~, h0 p& i3 h" J
echo P;( e5 Q% P3 g. L( e, o
//根空间中的成员,只要类的访问必须加‘/’/ {7 _6 j1 j) s+ e+ n! P, P# o2 u
----------------------------------------------------------------------------
. g' V/ d: y4 x) R; _1 d* {' y5 J5 N4 q. ^  p2 d7 @0 ?
05ou.php% k) V: m" G2 @6 S) `
<php5 M8 O- k3 B* H; I" I: n) _
const P=5;3 o1 V" I+ l' D* I) b

) F' I/ |' ~& q- U# X6 W0 Zfunctio_n showinfo(){+ ~  c* Y$ I3 \# `
    echo __METHOD__,'<br/>';, D) Q. E$ J% C* |8 ^5 N* j1 J
}
/ M  J2 t1 W- k' O" S0 U) R+ A( O7 Q5 b# {
clas_s AdminController{7 ]- U$ e. v8 a
    public functio_n __construct(){/ n0 T1 y: X; D! ]+ V4 Q4 z3 B- M+ t
        echo __METHOD__,'<br/>';
% D( S' H3 Q0 k9 D) u6 ?$ D' S7 _    }8 b7 L5 K3 c6 \, G  u
}
6 N9 a/ P, n4 O5 ~; V& C+ m# m; f& q, \: ?$ f
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: Q  a: m' u: `7 |
----------------------------------------------------------------------------! q2 K2 S6 b  `9 O" M9 t) Z  O1 n
04inc.php8 r5 c+ k/ U+ b
<php
. S% _. Y, M+ ^- E: f2 n
9 k/ w+ h3 C' Z) G2 m' Knamespoc_e Core;
8 V( r. T" D& D' \" finclude '05ou.php';! C& t5 D3 n4 `  n0 {! J( O1 g
functio_n showinfo(){& B, _- d7 @- d! }* R( V: _8 D# r
    echo __METHOD__,'<br/>';
3 k! c1 @6 w. p2 ~! e% f}: w' R$ ~/ q7 W5 _7 G3 e$ y8 ~

4 P: k* L/ @  Z* m) v4 J6 H; Ynew \Controller\AdminController;; d3 r" b; E1 ?- h) |' R
----------------------------------------------------------------------------' K& ^0 J" z! F
05ou.php  E' P! k: ~* X  ?$ }
<php5 M# h# j! d( g6 o
namespoc_e Controller;  c6 v2 K9 P, q' O
  z: U3 H1 m- ]
clas_s AdminController{
3 C  G( s! `6 H$ z: c& c        public functio_n __construct(){! Q, ^  z' b- o' g* ?
                echo __METHOD__,'<br/>';) L# e  Y& `2 A) N5 K  u& T
    }% r. t; @- [+ b9 Q9 X9 }' i
}* }5 J8 }2 C& W, Q& W+ Z1 b
----------------------------------------------------------------------------4 k+ ?3 G; i- Y0 x" _$ a: d  W5 X. C

+ N+ n  x/ K  w0 @' ?4.引入空间成员:  v8 ~9 n0 Z% v9 O0 C5 a3 c$ o9 g

7 O6 Q3 b6 N4 s  W0 Y4 }0 P9 B1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。- F' }/ a7 J1 A# |* _* p
' }1 _6 ^# w0 }- v( Z& g" g1 @+ ^
----------------------------------------------------------------------------% M2 ~9 D- R9 M+ K: H" t" U. s
$ s1 R$ m, U5 A  ?9 f: W; k; m, e
04inc.php8 s- s2 C% P& y) L7 [; l
<php
' s1 L  ]' X! p: x  U8 ]2 L& mnamespoc_e Core;
2 x: U  H. D  \4 I5 \4 p( R1 ouse Admin\Controller as con;) Z' H6 u8 h& t% [- U# z; z
# t5 N, I& k* `  P5 r, a
include '05ou.php';
, m; O5 b1 [- B6 P4 E6 f! Y
; {% C) A9 k( rnew con\AdminController();# M8 q' [; G) _& y/ Y6 C' N9 V3 Q- M6 Y
----------------------------------------------------------------------------$ P- e/ L2 e4 a# H. p" K
05ou.php
* K, s# I% Q" [* k2 `9 K% U<php  a& D! c% ?* G4 s2 h4 l3 K
namespoc_e Admin\Controller;9 Y% Y5 q4 E- P2 _8 E# c- R& I% D: O

% d3 {) [) f# G( _( Dclas_s AdminController{, O6 G1 l0 y, t
    public functio_n __construct(){
" I" T/ i$ a4 L' _/ r1 ~        echo __METHOD__,'<br/>';
$ p  S3 W; }% h# U' I    }: X* J  r; z) V: k2 R) S9 S& a
}
9 d. _; l# k) @8 i----------------------------------------------------------------------------- a) H* [; L; u, E' W. `1 O1 w
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 f  |- B+ s: H2 f1 n, s+ S5 f# m; t" r
----------------------------------------------------------------------------( t% u7 E8 F" q5 t# V
3 {2 `6 ^: U( |  x, I
04inc.php+ F+ C/ ~2 B# ]. \8 g9 d
<php
# n1 o4 O! R; n% T9 p//引入空间成员类
1 q4 `% K3 W, ?' v  ]$ `" s4 i9 D) i- Y9 S- h- H( _% S
namespoc_e Core;+ O  @$ n2 ]' Q% \# a3 J
use Admin\Controller\AdminController;
9 ?! c7 Y, H& ainclude '05ou.php';* T1 G) [5 S+ B6 @0 ]  u
4 y  A+ Z8 v# K) E
new AdminController();. g5 E8 T5 p+ K3 a/ e9 i
----------------------------------------------------------------------------
3 ?3 Z9 N) Q. J; S! K05ou.php$ m8 Q! a0 j( `7 w# Z
<php, o0 |6 r: s1 h( I1 T7 C
namespoc_e Admin\Controller;. k8 \7 u) m; R1 h" |* [
2 Z8 P: ?) ~4 |6 r+ E* F& \8 J
clas_s AdminController{! V! H5 H" s# q
    public functio_n __construct(){8 a# K) U' J  i/ h2 @9 ]$ P' b: e
        echo __METHOD__,'<br/>';
" H6 p, y: U" F) ^  V/ Z1 u    }
& m- [4 Z/ B" H1 u5 n}
7 M' W# e5 [3 R6 t- j; r+ d8 I----------------------------------------------------------------------------4 b$ M" J8 j4 ^! i& ]3 e- W# P0 C
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。9 V; k6 j6 _$ O) ^9 e$ M
+ Y3 O9 X% q* z, |7 s* s+ r

( s  ~0 t; _8 _' Z) J/ c这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" c1 b" Z8 x* ]* g2 w, k
+ e8 y6 S$ J: _* Y8 N) Y$ Q, M, B; c# |& i  U2 O

! G+ ?4 E, ^3 z+ t9 R- T: C1 E
3 L; {6 V8 Z! s6 N* }0 j
# _- f. X1 M* Z) q6 q$ I
3 I+ e1 p1 J1 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-20 23:51 , Processed in 0.059755 second(s), 22 queries .

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