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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
4 Z0 M2 t5 ~) \& [; k/ ]4 n# v9 L5 H6 @+ [
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
" \* b2 s3 E4 V# h, k! g  i: t: {' D! D  x2 y) \- B

: g- C4 S% k9 Q' o! E
& h( v/ Q; r9 t我们来详细的讲解一下PHP中的命名空间:2 g" g* I2 X+ T; `, J! z

  h. A" j+ l" K语法:namespac_e 空间名\空间名;
! u5 c9 J- W3 [9 e. w+ B( f
. n; c! z) `9 a# H$ @说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:8 U' K% V& m5 T) z9 p
6 R3 X+ \! b; v0 z
----------------------------------------------------------------------------
- [2 J! T  j/ s- l
! g# L) ^: A% d, M( A; Z0 m<php7 m) H, s* _1 N, ~( h4 b. H8 u/ P& Q
3 b2 M8 u# g1 d$ Z; E1 P# g
namespoc_e AA;& w; t! b9 h6 R  l7 Q
functio_n showInfo(){% }, G/ Y! e' I. I+ W0 Q! a
    echo __METHOD__,'<br/>';' K' V1 k+ L: r$ r. }4 B! x0 C
}
2 c, O) D, ]  B* ~: o' |showinfo();
9 L7 v3 P+ E1 c7 j' u& g
! z! ^2 M$ ]1 nnamespoc_e AA\BB;
0 f& S' ]' e$ W3 B/ Q2 g1 k# l- O
: q  Z& O+ I! Pfunctio_n showInfo(){1 E' a$ O* \0 v- E8 ^- w
    echo __METHOD__,'<br/>';7 _) I" A) g, F0 h, S( F! s
}
* P8 N; y1 M) }9 a3 U//showInfo();
9 W6 f3 q; P. i+ i) n: _) b----------------------------------------------------------------------------; t9 G! V4 `" x
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)$ |. L1 s/ f, n
7 p4 a8 u7 I0 y6 q0 O" ?- n( A
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。8 N4 X8 E; D  I  v; C+ [

; A' Z8 z: k# [$ \9 |% U! b----------------------------------------------------------------------------
; |* C1 K& O3 F, ?/ j
; G, f% a' T+ K( a- Q# p0 P% X<php
) \$ N4 C- f. }1 Anamespoc_e AA\BB;" d: G3 n  M* {7 x. q# [8 B
functio_n showInfo(){6 W7 |6 o# B) B% x, A* s
    echo __METHOD__,'<br/>';
. e! s2 P3 G8 q" i* v; T$ E( z}( z9 f, o2 C% S! r
namespoc_e CC;
& I' {; t# }0 u0 v5 Y- B) rfunctio_n showInfo(){
  w! f" z" c- f    echo __METHOD__,'<br/>';2 }# u- M/ l9 y0 K8 F. ?
}. U" `2 z+ k) ?8 e6 M
namespoc_e AA;
3 \5 D7 n" `& j% P1 {, w" F1 G' o4 wfunctio_n showInfo(){
3 X% q0 _( F% E    echo __METHOD__,'<br/>';4 @) q1 d. ~4 [, i
}3 C9 [1 H! g! X5 @% V
//非限定访问:用于访问当前空间中的成员2 k6 ?: t/ I/ W6 q
showInfo();' q* ~& F0 S; \4 Z/ q( s
//限定访问:只能访问当前所在的空间的子空间中的成员
6 H* r) R3 \2 ]4 DBB\showInfo();; o0 u1 @4 D, f4 W
//完全限定:可以访问其它所有的空间的成员2 f5 e. w# m& Y  @$ ~+ K  B" b- W
\CC\showInfo();" J6 ^; U( P6 V, i7 {
↑根空间标识符" k: O  ~4 F" V8 y9 ?% S; a* a6 C
----------------------------------------------------------------------------8 O7 G+ B4 q1 d2 z; `6 N4 t
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
( L/ \; {4 C2 {( _* s# \& b7 L, f
3 C5 p. I; x! s& t. |3 f当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
8 `1 ~; |2 a/ X2 D& w, K$ c& S4 @  \( c
代码示例如下:1 t8 W$ O2 y# i) h. B- u7 l9 R# F

$ h1 ]5 ?% a; j; P5 w8 C----------------------------------------------------------------------------
: y3 l1 U* K& e  L4 L/ _0 p
) p! L; X1 _  Z; e+ B$ u# Z5 Z& H9 z5 Y7 z2 i! I9 f- A+ @
04inc.php+ v, K, I3 ~& e) ?( e3 y
<php
% f4 m; |2 s0 q, t7 ?2 Y* W
3 t2 F- ~* V( E6 ^6 Enamespoc_e Core;; U' ]# y7 o. ~5 Q8 N$ D9 e
include '05ou.php';
; v# s  c" ~& b. F) L5 g  qnew \AdminController();8 v" L) _/ r, D$ q+ Q3 s. C0 W
showInfo();
! b" u/ O2 L  e# M# {/ o% @  z! O
% C7 O0 |/ n  ~9 techo P;) P8 z8 U5 n* p- K1 S9 ^
//根空间中的成员,只要类的访问必须加‘/’2 u4 D% l* I+ b# m
----------------------------------------------------------------------------
6 `1 G" B2 p/ C" Q! D$ l3 X& d% ?: `* Q4 E
05ou.php- \. j; F' a4 p4 E9 e" S
<php% }9 C4 u0 ?% t' q$ z( ]. M- v
const P=5;
+ Q' s. w" ~5 `4 B, V, P4 d
! ]8 @8 K! N4 S9 H7 X/ Gfunctio_n showinfo(){
, |+ L3 `' I6 u+ z; y    echo __METHOD__,'<br/>';
# |- H0 V% A) A. w6 @}
5 R  k4 M& ^! c& n7 ~. {- V1 _3 F4 J$ Y* h
clas_s AdminController{
" I* r9 s9 C! t/ u9 h. y    public functio_n __construct(){- B1 K' U% r  Q- k1 X( a; L
        echo __METHOD__,'<br/>';
& ~4 P  a! H* Z) ]" |; {" _# }5 e    }
1 A4 A. I- i% ^/ c% t+ f0 Y' ~}, [% I  I% c0 Z" y$ `/ t
+ w; i( Z- ^+ N5 L
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。0 _. l6 P8 Z. J+ A; @
----------------------------------------------------------------------------
# L! `' U* o6 S* T04inc.php
$ A7 k( f! t" N: x# C5 h<php
, Y5 K1 E5 ]6 y: S. a0 T% u( ?, a' i) [8 j
namespoc_e Core;
! v: u2 u! K3 h# ~' j% h0 G' Ninclude '05ou.php';4 m7 s  _& v" R9 o; F0 }
functio_n showinfo(){+ e$ f/ c! y: o, b, O
    echo __METHOD__,'<br/>';2 {! ^6 G2 S; S: E8 k
}5 b" M& G4 {4 }2 ?
) ~* C) S5 \# Z  |) Y9 T
new \Controller\AdminController;# @" m4 }, h: J, g8 @3 p  C* y
----------------------------------------------------------------------------
5 a7 m3 q6 Z# c% }05ou.php! r8 M; }2 Z: q9 h: ]% t8 {7 B: T
<php  ^( D' }/ j2 Q, }& s
namespoc_e Controller;: p6 a: c7 R5 P. ]& n! l

, H3 Z! }4 V5 _clas_s AdminController{7 h' P% L4 p2 ]) M
        public functio_n __construct(){
2 _, @5 y4 g1 O: I                echo __METHOD__,'<br/>';
8 A# {; B9 p, E7 o) B& o    }# W9 a" J4 o% ~- Q
}
$ q. c# _2 T; R% c----------------------------------------------------------------------------
9 n! h0 K7 {6 ~- M: A( ~
& ^" {+ f3 \$ C' E9 N& C4.引入空间成员:0 J- r! i$ ^! R( H) q$ @
, d/ s9 T! w2 c  }4 l8 }
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
+ b  T' E, ~# `$ F
2 T2 r; A  ]+ m# {' p----------------------------------------------------------------------------
# M' [6 l+ z4 v4 j4 b* J4 u2 F& O: _" L6 @2 F0 @! P  r
04inc.php$ S9 t9 r% D# G5 C; o4 d: p5 X
<php: X" \# r- ?: P* {
namespoc_e Core;
4 E+ _7 k9 k% b; [. Cuse Admin\Controller as con;% R; v) A/ Y8 P
$ \4 T$ b) R. ]) X. C, b$ l
include '05ou.php';
7 k& T- [7 v; Y* M/ q5 l5 ^+ y5 f5 C' G# s9 L& W
new con\AdminController();. U3 G  N5 b6 l$ {6 B* i8 K
----------------------------------------------------------------------------
( E" I$ s6 t  G. V& ^05ou.php
. c6 K" Y9 m  F0 Y  p<php
8 r# c4 [) V- g' w& D1 h: Onamespoc_e Admin\Controller;
4 Z  E3 q) |: W' E9 W* V5 l" i9 L0 o. p% w9 T  o1 A
clas_s AdminController{! [/ \/ f1 g4 Y8 C9 q! j' C
    public functio_n __construct(){6 z+ {% v/ ]4 v# P' K2 D" T
        echo __METHOD__,'<br/>';
: |; @: T# D% J( K( a    }
* b6 i4 \* B$ ]  ]: {}
( X' W+ f4 H. e7 r* g6 X: J----------------------------------------------------------------------------
1 p0 O1 P2 |4 T6 C* w2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
# ^/ l# L2 ^) x0 B" {7 |, G  k9 U8 ^* s/ A2 C, C# J+ g% B
----------------------------------------------------------------------------. }5 z, W* b: R

+ y  T2 h/ B5 l04inc.php
9 L7 J. i2 o3 ^8 I" p- v& x* T<php- h6 O+ }/ U* d' }
//引入空间成员类
2 G7 S4 e1 y8 E$ T9 p3 ~
# {7 G, }0 C, t  N/ c( unamespoc_e Core;
3 E. v8 F: @. e3 F; B4 X7 M1 \2 vuse Admin\Controller\AdminController;0 r6 R7 ?) s" V; K0 i
include '05ou.php';% i( h% @" y8 ~6 b5 U- o% b- j% ?
' G1 l( b0 V' S
new AdminController();
1 t3 r9 S6 L& o# g! m/ {----------------------------------------------------------------------------
" G6 U1 T4 w) F  {$ l$ e05ou.php% I, {  Z; m! G4 X$ H
<php3 t  n& [# x3 g& }
namespoc_e Admin\Controller;" u, R% O1 B6 y- E1 T
; O: Z1 e/ U! N" O" Y
clas_s AdminController{2 Q# M7 v# Q0 T- L1 l, t" ^/ v3 |
    public functio_n __construct(){: R/ S2 o7 d# i( u
        echo __METHOD__,'<br/>';% a; j+ L3 ?: I' A3 v/ w* X# ?
    }
! f, l! z4 n9 y}( ^! `; n1 D6 Z( g+ A& f! W
----------------------------------------------------------------------------
. l5 c2 L2 N6 C) M5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。, L; F& S! k7 C2 P
6 \7 {( J$ D' S% G' Q

+ [* u+ e) W* P5 `$ G这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
0 U- h" C+ C# \! P2 b6 O9 O/ \6 S# g" D9 T6 }; {: I& L, {! R9 r3 f
  q0 u6 @" C! |7 T
) g) K! X- p3 x; X/ ?) P+ K

4 \% j' S3 O4 u# q" y, ]5 N. b; N* @8 N, M" q. u# W. j# N
3 _" K  R! B7 L4 d/ \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 22:48 , Processed in 0.060871 second(s), 24 queries .

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