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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
  w; z+ y8 c" k5 ?1 c& w5 Z" D- U) p; ^: _* v! m2 }
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
; A4 `2 V3 K. M9 p) G2 I# L  b& _6 n& J$ C9 [2 N2 L# S

- ?4 ^" R4 t4 E; a6 @+ H6 g3 W+ e- r( ^  U
我们来详细的讲解一下PHP中的命名空间:
- `5 v+ j- w. v/ y( ?" N& _- b8 j4 N6 Q! n0 u/ L  l  l
语法:namespac_e 空间名\空间名;) B3 s: G  h& q' E' O" Z9 q8 O+ [
- g/ Z. W& M; W6 a4 l
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
* i( x! j8 ^6 `/ y6 L; W4 j/ P( X& H# @3 y
----------------------------------------------------------------------------3 H) n8 s9 I  z0 }- }- j4 Z3 O# A

! [( a- B8 a* t5 J- B" o+ M6 K<php6 N9 }# z' u! M/ F; ]* o, F8 r

" f6 J4 N- `( s) {namespoc_e AA;* r7 A9 o0 n' U3 m
functio_n showInfo(){/ j' k) E8 b& N! R+ ?+ c- R
    echo __METHOD__,'<br/>';1 {, `/ [4 D9 N' g% G& B6 [
}% }* s8 I3 d9 k4 Y! u, q, S
showinfo();2 Q1 M, `; U  f% k  |

8 Q2 u! _& [+ L* Onamespoc_e AA\BB;
/ a: m0 w# z4 A  p+ u; `; y) I2 {/ N& q: x4 U! W8 j/ a8 s
functio_n showInfo(){& @% E2 ?5 ~& l
    echo __METHOD__,'<br/>';7 G$ Y8 A9 E: H' \1 d/ ]5 R2 `2 y# Z
}
  i0 z& b9 `- U# Z* E/ q//showInfo();
+ Z/ e5 f" B7 I. W! r, E* x----------------------------------------------------------------------------9 `7 o+ J+ h8 r  r& c
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)- Y2 [- ?" N* H0 o1 s# l

5 K* c$ U# {2 B! B* t" D9 f3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
, c, `2 u/ y6 s5 c4 g3 a& w6 i' m+ y2 S9 [, e7 A( V) }: f0 v( x
----------------------------------------------------------------------------9 C' x5 U8 T) G: T# _: q! E4 s

) \  A- |# l& |' m# z( f2 L# P<php
, u: ^8 Y6 E; R" Hnamespoc_e AA\BB;
, g4 g3 M% [; ?$ T& _/ A# Cfunctio_n showInfo(){
$ B7 i& d0 G1 c# E/ E    echo __METHOD__,'<br/>';
% _9 y& g2 _; c6 f( j% V}/ c, @6 Z; T4 J! _! g- f
namespoc_e CC;
7 e! ^6 S  e( w0 tfunctio_n showInfo(){5 P$ R- c& L! E) k; e  E
    echo __METHOD__,'<br/>';  o) ~4 H% |) A. H% l* G( v
}' @+ [6 Z+ ]4 D! `; y4 O
namespoc_e AA;2 K3 H5 X& h- Q+ R) m- n
functio_n showInfo(){
5 r: f0 C4 a- P  p; z    echo __METHOD__,'<br/>';. Q4 f: u, d+ v
}
# |/ m" V* `% j0 j& U//非限定访问:用于访问当前空间中的成员6 J" v- z: D6 y- z1 c- \* p4 @
showInfo();( u, U: T$ f! M3 X2 ?* A$ P' d
//限定访问:只能访问当前所在的空间的子空间中的成员: P. V/ U: k# f! |' d; g- O
BB\showInfo();
2 v& [$ x, n: W4 n5 r4 v//完全限定:可以访问其它所有的空间的成员
6 y/ f- P; J' `) _9 H8 m\CC\showInfo();
& g) c& p6 p7 w↑根空间标识符. S& I& v8 J4 G% F) Z
----------------------------------------------------------------------------" X" o* Y5 b0 ]/ H
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
. H( A- \* I; n$ H0 U+ |9 o% r9 C* L5 }  K
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)! I9 P" v. v0 b2 q; t. k
# _/ I: H" C" Y4 T- I, J
代码示例如下:
/ r& `0 J5 C/ {$ h* I' M1 z/ j/ U1 O5 d' k; U
----------------------------------------------------------------------------
; H& ]: U8 f9 L3 X9 L$ B6 Y( v' C
( |# F* p6 U$ K* F( d. n4 a- k; e) e# a' z& a
04inc.php3 F1 ~9 D! s8 B! d0 i# S
<php/ [5 E: Z$ O# q% c6 X
: w. B+ x- ?2 g  r# v, F
namespoc_e Core;
0 M. v* R$ r: d$ L5 vinclude '05ou.php';# L) }6 Z6 P% g3 K( N2 v
new \AdminController();
4 F6 X5 I5 e6 M- o/ _showInfo();! h: V" y  o3 z: J6 F/ M! n

- }, C, f0 f4 s% R3 P  ^1 b7 cecho P;. C+ ?' X' f0 D6 {8 l4 ]: c8 o
//根空间中的成员,只要类的访问必须加‘/’
8 _+ j7 E& f2 ~! a  _! @----------------------------------------------------------------------------8 f2 a/ Q/ S* m' F! e5 j

1 {* K- G: q& L3 W3 U3 V7 [5 W05ou.php/ b( x: B& |; f# O% C3 R* R2 j7 l
<php
+ ~; }$ L  G: p: k! \const P=5;& C$ Q& M+ I0 {1 N1 l8 m2 D, ?& d
6 g5 j5 }4 |1 K: }1 Q# A& b
functio_n showinfo(){
, N' F% Y2 ~5 ?& c( Z" w    echo __METHOD__,'<br/>';8 b+ m1 s# G0 i; q7 r0 U0 Z2 `
}- A* o. V# {0 r" W  G; {- \
3 X! p* n! b' l: E; e3 ]) X
clas_s AdminController{" k7 s3 \* X1 z) g
    public functio_n __construct(){5 }/ T) v! E0 }# H
        echo __METHOD__,'<br/>';
( s7 Z& x" |/ Q4 J( x    }
- s( r) X7 S5 ~9 P- O( m/ c}- ^* K6 r2 K* g: W: K& t

9 z2 S# q; ^8 W# K* ]4 ?第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 x; @; d6 P2 E& E
----------------------------------------------------------------------------
) U8 s" F  z$ U  y- d& r# u' C04inc.php
9 s- n2 ]0 K7 h* ~+ j# j9 E<php- R6 n- L2 B6 A6 U+ Q
4 F$ l' p' p% |2 c
namespoc_e Core;8 n6 a  A( V& y* y. E
include '05ou.php';5 ^; i3 K! v! k% `" i- g9 `
functio_n showinfo(){, n" |7 m  g* Z5 U
    echo __METHOD__,'<br/>';
( t2 I" R& r6 F) v+ n) ?$ }. S}
% s& |8 ^1 F* C. K: x5 ^
# i7 `/ d9 N2 u0 p2 Pnew \Controller\AdminController;- W8 X/ ~2 ]& T6 {! P+ f
----------------------------------------------------------------------------
* ]6 }: Y# u9 A# Y0 I05ou.php6 W4 K3 |( q) @' D
<php
8 g) [! L2 l% |9 bnamespoc_e Controller;
# V9 i1 Z. w# J4 u. w' N' s$ S- P2 g0 {1 Z& c/ y# B7 U' V
clas_s AdminController{! B+ h: o2 b" p# A: d, v
        public functio_n __construct(){
$ w% t! }' n9 m, h                echo __METHOD__,'<br/>';
: J! y2 h5 ]! C$ b1 X( b1 k; P    }3 N1 M2 ~2 {# H1 H3 G' _# F" Y3 G
}; `+ G' K# d7 O) D2 G. z' I
----------------------------------------------------------------------------
1 V. I3 s7 \9 E6 ]2 b$ `. o% W6 u: N
2 P9 L! B) t9 {5 }4.引入空间成员:/ w! J9 x  }0 ~) R
: y" h; A# Z: L- G# ?6 P/ _/ \
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。. A4 v8 @! {: d

, C+ O9 B- n- z# }* W----------------------------------------------------------------------------
5 c; \; p+ S6 i' S3 C. H6 d' q& `: m9 A9 @$ T
04inc.php3 i( ]- _2 H1 s, t( |- G
<php" P- b4 C% Q* d
namespoc_e Core;
: ?; o. N' K% |, b" ^6 puse Admin\Controller as con;8 M& A- j+ p( Y( }, V4 ?( i
1 f* H: f" L9 s. E, V
include '05ou.php';. T0 `6 K/ J* Q

. c3 C# G' p& J4 Y  E) H: Rnew con\AdminController();0 ], R$ B1 U# \+ z# n" x0 l% L
----------------------------------------------------------------------------$ p9 r. Q6 D3 d* z" x, m
05ou.php
2 o8 C" f4 m! \2 l9 |* u' I# u<php
5 V4 v/ Z* W- e/ v- w6 _namespoc_e Admin\Controller;
. f5 T# c+ L5 q% v3 ^# h$ G, E1 B! l+ |8 s. r( [0 \7 _' f
clas_s AdminController{
- D! l1 p. a- r$ H    public functio_n __construct(){2 o9 k% X7 P  N) o8 ^+ T# [
        echo __METHOD__,'<br/>';
9 k- E6 S6 g* ?9 z6 F    }5 b! y% d( P# A1 Q, f: w  ?' r2 p8 a$ }
}% Z2 B1 s$ F. r. y9 M1 y
----------------------------------------------------------------------------" b+ M' A; _- Q# J/ T
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
8 i: _+ J8 _3 S) d- g
* O5 c1 g" M8 F+ S----------------------------------------------------------------------------% h! J+ w  d2 S
' s2 {3 D( [4 S( ^
04inc.php$ |& O  ^" ]5 L
<php
' `, @" t" h9 `+ c4 F//引入空间成员类6 M( j! k7 A/ ?! B: j" O- K

" \2 ~2 U2 X6 p, k; lnamespoc_e Core;
- w8 s$ Y. I0 \& Z5 O( Guse Admin\Controller\AdminController;+ r) a: X- x+ Z/ r, U
include '05ou.php';. [2 j6 l6 e9 A' [* E

$ f3 w* _; j: p7 v- ]' bnew AdminController();- \/ {- y8 y3 e' k
----------------------------------------------------------------------------0 e$ k) N9 d, h- W
05ou.php
+ ~4 |' B! x3 v& K& D<php
4 S* k' E! p4 h7 b6 m! b: x. D; _namespoc_e Admin\Controller;
7 _7 M: @# r  B5 u. E$ ?6 l: K9 x2 O, m
clas_s AdminController{
4 R4 B, L1 a* c9 _9 q    public functio_n __construct(){# ^5 `! r! k0 A3 ?' Z0 A
        echo __METHOD__,'<br/>';8 h% d& U+ p# {4 @7 _" L+ B
    }/ V4 A6 D) e) B% N- X* z
}# i" _5 K. A- I
----------------------------------------------------------------------------
4 R) n+ B5 M; k5 ^5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。$ c# I; w# p( x! z4 O% ~) @

. J; K' ~' Q0 m
; K# w2 D$ c7 Z, F+ K: h" b这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
' O5 S2 x8 q2 O2 F1 e& P
4 D2 G- a% }: i( M. l
0 r0 {: r  z! {% L! |6 b4 W2 r6 M/ ]
5 e2 T% u) f. t3 h8 ]3 e* ~0 D* U& i+ m1 m- v$ x  Q
5 {$ J3 M7 A* Z8 B1 e6 f1 E3 W
( G/ R. D# t1 Q0 ~. }% M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 12:03 , Processed in 0.069542 second(s), 22 queries .

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