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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
0 Y2 z& f& b% m) k8 t0 t! n# h$ _+ [
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
; h  X* r7 s. ]  ?5 ]) z% G
; b5 h# n% g& B# h; n
5 L$ }# Z2 s" U$ `7 g. t6 v
8 V6 J: X6 M/ q! P* d. t我们来详细的讲解一下PHP中的命名空间:( t3 d( D) o! V: M* @
  @2 O0 |# f1 C4 h2 Q3 n. }
语法:namespac_e 空间名\空间名;% D5 @# Y2 V$ a9 [/ P+ H

$ p, h) T7 K0 S( {. v: _说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
6 y/ \7 {  f0 H: O8 u: g7 X3 k
# H0 P# Q7 F6 P) y----------------------------------------------------------------------------9 u) j. @4 }+ b& ~' X4 S6 D% `& _
! L7 ~8 T; G3 h5 q, h
<php
: J# R6 p5 V& y. E4 J/ A# ?+ X. r3 r( G: a5 {7 ~" r$ H' w  W% F& \* x
namespoc_e AA;
. V+ D) V6 Z  ^& i& k/ ifunctio_n showInfo(){
( ~5 V* [3 R5 y' i6 }    echo __METHOD__,'<br/>';
( Q: ]( Y' H5 F# o}
, q5 v% t, V0 r3 c) pshowinfo();
7 b, {) ]; m4 Y; Y5 _2 x  e8 q6 A' r0 E+ \; G4 y) ?
namespoc_e AA\BB;: t7 q2 A1 ^0 }% m% b- y4 D

, a$ K6 o# F2 `( w$ ]) Y! x% u0 qfunctio_n showInfo(){9 q  g9 u; V) k( N  |( d
    echo __METHOD__,'<br/>';8 i. w# m& L4 h: x7 H8 T3 L
}+ x; [3 y5 |+ Y3 L
//showInfo();
9 x- |( w! S- n' y----------------------------------------------------------------------------, s2 }2 F4 k6 y2 C2 V# b
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)& |) t& U3 A  M& P8 c

) w4 I  F3 Q3 `+ l5 o$ c" {9 O1 [3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) Q0 u: o7 F" w- b  O" ]& U; Q! U8 v9 {  y" o; s
----------------------------------------------------------------------------& g' M* L& t. y: H3 N# A6 n0 p1 Y1 h* m7 H
* b* ?1 ~9 G0 I% W
<php: m$ W7 m) ]; z. L: ~0 X! ?
namespoc_e AA\BB;
% {5 y0 m/ z! d& yfunctio_n showInfo(){
; c6 l9 _/ S" I& W, n& Y4 H# M. a    echo __METHOD__,'<br/>';5 y3 V3 g7 u7 L! V) E
}
$ M0 j& A: v; W' [+ _namespoc_e CC;
; I5 r1 a1 r+ `# P+ hfunctio_n showInfo(){- Q5 L8 {8 _7 N9 Q
    echo __METHOD__,'<br/>';2 o5 k, l0 m1 P& Q2 H( ~+ a2 Z' u
}
/ y. ~( B4 L$ unamespoc_e AA;3 _. V' E' E+ f; F9 K
functio_n showInfo(){
: O9 d+ K$ Z6 S2 f5 H. d8 p    echo __METHOD__,'<br/>';
: n8 z' D$ y' j  e8 @}2 o- ~* v4 f- _, [' B
//非限定访问:用于访问当前空间中的成员
& C' u9 ^! K- F6 ushowInfo();
$ G7 V& q/ }/ _; [, R//限定访问:只能访问当前所在的空间的子空间中的成员
: H! J7 ~' ~5 g5 s* [) sBB\showInfo();
6 ^# ~5 C8 t1 X//完全限定:可以访问其它所有的空间的成员4 O1 D, x; C) l  D3 `! m3 p
\CC\showInfo();
- d5 M; ~5 Y# O5 u$ h↑根空间标识符/ ~0 x+ j' |6 N3 |8 T% z1 k
----------------------------------------------------------------------------
# h4 m/ v2 d4 J: _但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
. e% `5 b& R4 B  x% F( d/ A% n: ~# {$ u- O
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
# r" G& i0 ?( k. [
8 v; f3 F$ v& @, C# }' _代码示例如下:9 H, J9 ^  [$ n; _

/ _9 {, x) l& h& U, g& q) c----------------------------------------------------------------------------
! S7 L, l1 ]) r+ H! T: a+ o) i7 o. ?2 l6 N

+ U. n9 j! R& v) y# t04inc.php
7 \( @; U' y6 n# b# v<php5 t6 U8 B$ W; x3 D1 C, N

* G! B3 z3 r) |- v. rnamespoc_e Core;. T" j% T, z( R! R  z' s9 m) [
include '05ou.php';7 B0 F/ ?* k1 ]6 I% d: e, n
new \AdminController();. _" j- @6 }( y% N' Q  Z5 d
showInfo();
9 b/ ~) j3 j! W! B
5 J" x! {* E% ^( E8 O4 f# T, m: recho P;) X. E8 C# U% C( |* D
//根空间中的成员,只要类的访问必须加‘/’5 \/ y8 e0 J+ K7 T
----------------------------------------------------------------------------+ E- d0 z  e( e+ r0 x
9 D4 L. x0 a9 g3 m+ O  [; P* l$ B1 Z" o
05ou.php% Q: R" C8 q# }5 `; X
<php* b* q7 @% r9 d5 B2 Q+ v& h- ^
const P=5;
* N8 j% o) a1 X( t! e, s  w) X5 j$ ]( g5 ?/ ]& ]5 c4 ^2 h: T; P
functio_n showinfo(){& O3 E0 A1 s: W* ~4 P
    echo __METHOD__,'<br/>';; e7 D/ C1 m4 [3 s
}: A+ O% P! F; |: q3 S+ R3 X6 b

$ A: B3 }3 _9 m2 ~& Bclas_s AdminController{
% K) |5 \. h' ~9 G  x2 S  r8 ~. k, ]    public functio_n __construct(){
: s- u% y! q) i        echo __METHOD__,'<br/>';
' O/ \& s$ s/ {+ b    }
. I* h$ I' S. s+ F}
3 ~8 f' C6 \; k- E1 T1 N/ Y0 ~9 Z( }9 h# F* z
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: M9 S; z- p) V" O  v6 W4 ]) V2 z6 z
----------------------------------------------------------------------------
" h9 {7 H" B, x, [. R, W- f& ^4 Q: N04inc.php* C) P' t. h8 y& \
<php
$ b0 R& k6 N  C' Y0 e2 x
  \: \/ @0 N' N4 o( d. Gnamespoc_e Core;' j0 w1 s3 {/ {$ i+ U
include '05ou.php';
0 a! p- K8 H- E8 ~, O7 I9 a- [functio_n showinfo(){
3 |6 J8 r& Q9 l+ P: m- {; f    echo __METHOD__,'<br/>';0 f5 U& O9 R. l
}
& }9 J; b/ w  c
! S. L, H) v& @+ Gnew \Controller\AdminController;, L% F. ?2 C; f. o, e: Z# r% x  F* p
----------------------------------------------------------------------------5 J7 K/ j0 N) g! b3 V6 j" X
05ou.php* Y7 [/ f9 Z, t
<php+ m) E8 ?+ f$ ?& \1 J" v; U
namespoc_e Controller;8 w+ g1 k0 E) W$ U% ^/ a% F

0 Y! @, Z. Q, |. tclas_s AdminController{$ \. x6 W, m* K2 N* f5 o
        public functio_n __construct(){
' @+ s3 v; \5 {5 O                echo __METHOD__,'<br/>';3 s9 ?8 G% {3 d- v' @, |
    }8 a2 P2 {, ]! ?6 |, X1 W
}
' a4 J. s0 @8 D- r$ c! C; [; J----------------------------------------------------------------------------- X& O/ C) e( t; N8 q

9 R. z, i: t7 ^* C% }4.引入空间成员:& v; G0 m  x& k4 d/ V

1 H" B  B5 U! s/ [6 h- _. m& t1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
$ X, i) i  C, \/ d$ N( L$ ]
7 L% A9 a& @3 x0 x+ J/ u. l----------------------------------------------------------------------------
6 L1 S1 p4 ^/ s4 u8 e2 s( B# G! j! [
04inc.php8 X# e/ _7 _" g4 r2 f1 S2 v, }* v
<php
# [& Z4 J# o1 p. q% S. bnamespoc_e Core;
# e$ `* e1 j8 T& t7 G+ nuse Admin\Controller as con;% [7 m8 B) m9 r
. |; s  U5 G! P5 i, u) c8 r6 f
include '05ou.php';# L. R* h' ?. Q
+ c9 E" q+ b/ g- f8 a
new con\AdminController();
& O" v. h( f8 E5 \. J5 Z----------------------------------------------------------------------------
4 y: m6 b( \& ?& ?. J1 F1 Y05ou.php
6 s* @1 o8 C, v$ \& V1 N5 |  C: _# E<php; T6 C. U0 j/ U8 Z7 i
namespoc_e Admin\Controller;1 t) t0 {2 c' n! B6 ^

+ c' K( S$ o$ e' q1 {6 qclas_s AdminController{
7 k( M# q6 b3 u% o1 g    public functio_n __construct(){
5 u6 j4 B; y  N- o* I) J        echo __METHOD__,'<br/>';
6 C+ r" V( L. z0 u    }/ [9 }5 N' r! A( W0 N
}
8 d7 _9 j. w* s6 h! ~3 W0 @1 B----------------------------------------------------------------------------, m  ~$ Y" F: ?/ H, {: m
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
2 B) k1 H) l7 q
6 j; _2 m0 K* ~6 z% f# c* d+ @5 ?----------------------------------------------------------------------------+ J: V1 W( L" S: D

. d  K' l0 l% r2 N4 T8 I. [04inc.php
, T1 Q. D5 U7 |* C+ u! x( G( K9 I<php  E; }) Z+ s0 W9 e6 M6 E$ ^% c
//引入空间成员类
: j3 U) E7 M4 r7 q: ^' H, O  m2 @1 I. h3 z3 Y2 u# @0 C2 z% d2 I) ~
namespoc_e Core;
; s" a! d7 L* g! T) o2 Guse Admin\Controller\AdminController;. n& Z: P$ [; ]; v8 L/ F, q# d
include '05ou.php';
7 y4 Q5 `: K  {2 T: `: n* v
6 A, ~( m7 v' h" ^new AdminController();" N# C1 H4 C% D! ?7 V9 r" h
----------------------------------------------------------------------------$ E' V, j4 E1 h5 _; g! @$ X1 \9 m
05ou.php% d, T% ?; A  h
<php
% l9 u/ k0 A1 {9 ?namespoc_e Admin\Controller;) w1 T- P1 v4 v) U# U1 w1 U+ t
; L. X! h# S2 ^
clas_s AdminController{
0 I9 F" F4 g4 g  i" D    public functio_n __construct(){1 j" ]$ I; l. @2 L+ g
        echo __METHOD__,'<br/>';
% R% y- U9 E- [6 C    }
/ t0 m4 x) w- U6 x8 y9 J. H}
0 C$ H; b5 K0 V1 \* W; z----------------------------------------------------------------------------
$ ?% ^* h" z! s3 s, U5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
6 h3 ?2 J& D" |+ B- z% M7 C  [3 I# V% u/ B/ c, Y' A
' j. e8 ], D3 f: o/ e. x7 N
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
5 D' p* I# X) e1 T; h0 U1 s* g
6 ?% }* L( [; y9 w7 ?) B
. B1 a  q& a" W' I' t( b* f/ O$ ?  ~" Q( a
  v+ l$ D( ^0 }  y2 E/ f/ o

/ [4 {- F# _& B* H) z( H. f! N: @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 15:24 , Processed in 0.062055 second(s), 23 queries .

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