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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:1 P$ Z. i, G% }6 E" M; _. N5 ^

% @& _) ^# t5 V在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:" z2 b. {# k. a$ I* O2 s5 |: j
0 m3 N# M* q1 }

9 n4 {8 D  n7 P) X$ D
* X7 X) |& L9 J, R* |我们来详细的讲解一下PHP中的命名空间:
6 x; f5 q- d! \# S/ A: _: Z' }2 X" [, P6 d. e+ v' Q; B
语法:namespac_e 空间名\空间名;
% U/ d0 M6 E; f  [9 Y' W5 q
3 i1 |2 z$ l8 E5 G说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:+ {: e/ F/ @) i8 x, w6 o

, s* j  U2 N/ x4 ?----------------------------------------------------------------------------& u8 w/ [# v" r( U- v
( ?. f0 N" O3 `$ S+ f
<php5 T8 G) u' ~0 A1 C( b
# J3 x' x: c5 K6 h  |, H8 h; g
namespoc_e AA;% y) y- Q$ K$ _5 u& S
functio_n showInfo(){* T' i" y% H: `, z7 l
    echo __METHOD__,'<br/>';
1 B- o* K7 Z; ^5 `9 S/ A; T+ Z}& K7 i6 n3 M4 P% d
showinfo();. u# v8 U: J  D1 G
& F0 Q$ a  v9 c
namespoc_e AA\BB;
) {% |6 Z- `  R
0 W: |' Z+ l* X% z6 t1 n" lfunctio_n showInfo(){
( [/ [( x! @4 T" ?9 Q    echo __METHOD__,'<br/>';
8 Y) a3 |8 C6 R}
3 A( Z9 E4 `! f//showInfo();
8 p' U. G: @8 g5 U; X! r; @----------------------------------------------------------------------------: M. y) a  x) L
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
1 I' F% H. o) S7 q$ f' N' C! V. a  O0 W, A+ f
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。0 T( d& N' A; ~, c  f
7 e5 @* k# _  ^7 I3 V
----------------------------------------------------------------------------
; Q: Q( G3 ~& }1 i8 ^1 W: o5 U7 k( J! q( D
<php. h8 ^1 M: K; K6 O3 D4 Z7 s
namespoc_e AA\BB;
, z  h/ P7 [4 r# D( i$ Nfunctio_n showInfo(){
# |  c3 c! s1 E+ c6 g    echo __METHOD__,'<br/>';. T1 Q; {7 {5 t
}" p8 |, P/ p4 y
namespoc_e CC;/ V. Y: p7 j5 t
functio_n showInfo(){
( l" C. e5 g( u% I    echo __METHOD__,'<br/>';
4 _  }5 _9 f: ^0 R) v}
" h5 J- H2 e: n* T$ Lnamespoc_e AA;
9 W$ ]/ O) H: C. a6 ifunctio_n showInfo(){
' R/ m& L1 [1 [5 f- Y0 v    echo __METHOD__,'<br/>';" C3 B- j6 V, J' q* H# l
}
- C4 x' Y8 R# |//非限定访问:用于访问当前空间中的成员
9 b* s- F/ {. ~' s" @& s7 R, y9 BshowInfo();' y( w& n$ }; A' K# c5 ~
//限定访问:只能访问当前所在的空间的子空间中的成员  k- x" C% r) C  {" B# S+ H# H
BB\showInfo();  F5 C' L7 p/ c/ r7 m1 b# c; A
//完全限定:可以访问其它所有的空间的成员
9 h/ p7 z: C/ @) C) u; i0 ~' ~$ @\CC\showInfo();
8 d/ _2 ?) w# E' }+ n1 @: y↑根空间标识符
& d9 ^: a- q6 K----------------------------------------------------------------------------
  r" t% p/ f! u  x* B1 O' M8 T但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:  S) `4 F5 G3 r6 L5 H
8 P) |5 |. U' s/ O' G) @4 D+ _
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 y( Y9 @: Y7 ^- B0 H; ?" a  X2 |5 A
  P8 `/ A. x. R2 N# P; q代码示例如下:  K1 m1 I$ x8 m
4 O8 N+ G4 L0 U3 g) w- o
----------------------------------------------------------------------------
- s2 M- i& ]4 w: ]5 }9 x
1 U4 u# o0 Z8 D9 @1 j0 Y: j8 e$ \/ }% b2 V, L. n" B9 L
04inc.php7 ?8 v- A% c9 d  u! {  L
<php
/ l& L# P$ `4 f: x( O
" m! a: d/ K+ N0 {namespoc_e Core;
2 f4 ?0 L- P/ x: \3 Q, Hinclude '05ou.php';
) \% R$ s; T' @& f6 pnew \AdminController();
' Y  v6 Z- P8 K& T8 oshowInfo();
5 N, \5 n6 `- K( m9 i% [3 {# q  m, N4 z& }  y, R6 C
echo P;
9 R: C; U$ t: e  a* X( n( J//根空间中的成员,只要类的访问必须加‘/’
$ i6 P! s1 ^0 \9 m' @9 |----------------------------------------------------------------------------/ d* ~8 N/ d; B* R# q0 G0 R
# f4 ?7 t/ a3 w$ o5 Z6 d) J9 ^, Y+ ]
05ou.php1 Z6 T# i9 a3 m' @
<php
" w  d, L6 U5 a' R3 Dconst P=5;
- U- [# z8 }" N! w: R
' ?. x; k3 l9 J* X* g. o# g4 wfunctio_n showinfo(){
$ ?- j9 G- b: ?9 S" n. g. K) w    echo __METHOD__,'<br/>';4 q5 H4 `* J) Z) g! F4 B, Q
}
3 J, D  A+ p6 w3 u+ l4 S0 E; t0 w- ~' f3 f  M
clas_s AdminController{
, Z. H' W/ k. R% ~    public functio_n __construct(){( A& a, b, G3 z; X! d5 o
        echo __METHOD__,'<br/>';1 k$ j+ L- \- Y/ K3 t0 H4 B
    }+ p* W4 a' o' G8 `3 U  s( K
}
) G( e- l8 j% V! X6 u3 E! s& ^* b! C( s: x% E/ M% p
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
7 k% S. k% O9 ]# S% ]+ s----------------------------------------------------------------------------
" `7 e* c* P4 f# J. o% o' N04inc.php
9 a" _  F6 c1 w4 m3 ]3 ^<php
) l; I' y# {! A. n1 @
! q& b! b; D" ^* Ynamespoc_e Core;% ?: G2 k: _% Y" Q- g, E9 t
include '05ou.php';
- |3 f" K& c* H/ F* mfunctio_n showinfo(){0 h4 P) ?& o' s$ f& A4 C- ?7 K
    echo __METHOD__,'<br/>';) [# L: q+ {( h! [7 r: h+ y
}
- V$ B* e8 O$ `- B& p: v, U$ @4 P
" t2 {! }4 I* Mnew \Controller\AdminController;
8 ?( ~; ^+ i1 g2 U) }! F----------------------------------------------------------------------------
( V* e4 C3 i  j/ H+ s; j4 t05ou.php2 C% Z  {7 D. _
<php1 {. b) B' |2 s- O9 H) i5 a
namespoc_e Controller;5 Y7 P) {4 S- ?4 a" S6 N" s; V
# K) d1 Q. n0 C! _
clas_s AdminController{
3 X3 ~4 A0 O6 k5 w3 a4 R        public functio_n __construct(){
; B. ^9 W# S9 v$ y4 Q! ]2 I                echo __METHOD__,'<br/>';
) W( b# V) w1 R/ d% m    }. O$ `) P/ d/ P  U7 y
}
: C8 D( a# A4 ~. L----------------------------------------------------------------------------
1 W# p9 E6 j* [9 p1 e! A2 x2 z3 m$ _& Q% T# T% o* p* q$ w$ c
4.引入空间成员:- ?5 a3 C; ~9 o8 T0 ^: W
! H" F8 P$ ^* C, ?  ^! ~7 I! r! @
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
6 A/ J8 q* X  Y% {- H- g
! |, g9 M) C5 U  y+ y/ _) q0 W----------------------------------------------------------------------------7 }, y# ^% j4 Q9 O2 l( g  a; i

* c% P) o" T. O04inc.php, w7 i8 o, v( V! A' z, ~( Z9 ]
<php
- Q" A9 F* [7 u. H# N' ?namespoc_e Core;+ M, n  l$ r6 ^2 z
use Admin\Controller as con;
) [! ?! N' ?; E/ k; c2 G# |7 i# b$ D
include '05ou.php';
/ Y+ x) F% t$ P; w' p& C+ E
' i: U# A' v( H2 snew con\AdminController();
1 Y5 s4 u5 X* i. e' K----------------------------------------------------------------------------$ |' r$ c& a' d. @1 z! {
05ou.php1 G( J4 z; b  S
<php
4 d& m% E7 b5 G8 x3 y. L! x: gnamespoc_e Admin\Controller;' U  X! b+ ~; T
% I! n/ f- f' u4 {9 T4 E  _
clas_s AdminController{
; N, T% r( n( O$ Q& w; ?: z9 m    public functio_n __construct(){1 B: Z* R( \4 m: B- t. b
        echo __METHOD__,'<br/>';
" Q2 z' {3 i1 d, ?- D    }7 d3 _8 W: t, u* r/ D0 s3 a6 X
}
  i$ Q% e  P+ r4 \! J----------------------------------------------------------------------------
# j5 [: r2 Y9 e: c: `2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
  R$ Y9 H& N9 {( l' x/ n
9 f6 d) ~$ p+ g----------------------------------------------------------------------------
  w+ `8 m  {4 I- ^/ t- G* P
- ]2 M4 o& [: E& ~; ?# I: K$ r& H04inc.php
* ?; t; Z% K7 @! r* h% X6 p<php4 d: X: D' D( H) y4 G
//引入空间成员类
, H1 ~! E* a2 g" i: b% }% F  T# G& R
! B/ L- c' N6 l, D/ i  H6 Onamespoc_e Core;
6 Q6 ^* F# I& H! A5 h1 C1 m% buse Admin\Controller\AdminController;
* w  U+ i# y# T6 r9 h  ~( a9 P7 einclude '05ou.php';
  O& Z9 e$ q3 \. p
$ J* I6 z  J0 Enew AdminController();
0 Z% b" ]5 k: v& t& G( L----------------------------------------------------------------------------
3 v9 J2 D, w  W05ou.php
% H, C* E4 F9 j- N<php
5 e/ N8 K1 p9 W" \& L! b, rnamespoc_e Admin\Controller;
2 F& N8 G. c2 ^+ y# j  n
# p. R* T$ Q* B3 H5 L7 c  wclas_s AdminController{
3 M7 k; p1 X$ N6 _4 x3 N    public functio_n __construct(){  Z$ t/ U- Y+ U* ^$ G  O* c
        echo __METHOD__,'<br/>';/ N. ^9 N9 u. t
    }6 {2 e: ]- i9 W% U' `5 \# r
}
/ U- o# h4 S: W/ _8 ~----------------------------------------------------------------------------
. f. y, J3 x7 \9 g5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
* J+ T( G4 k0 @' U/ J! q( g: f! q7 J  V* i+ }$ r
" o3 {) O- z1 ?! ^4 X
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
) s! ~! K8 k& I) z2 R
3 L" j; R4 {! ?3 r' G
1 O4 U, [; V7 U* [/ Z. Q2 W+ \! L5 ?3 H! V! W8 }+ K
0 ^+ c' I9 ?& ?) [+ b, t; U

0 h# W  ^8 E' M5 R* Q4 ?2 U, D6 I1 i4 y. f6 j# g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 00:53 , Processed in 0.059975 second(s), 22 queries .

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