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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
' {- i/ x" T$ j& V$ Y9 P8 O# o6 V& m9 ?
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:: ?. ]5 m: i( R* z, y9 `) A1 c  A
- T" U5 D0 W: I9 O& i: C
3 O, _' O: F2 E/ A

7 V, \7 M9 d& w; n我们来详细的讲解一下PHP中的命名空间:
# q$ N5 _* A# B( |( p4 p2 u" Z4 p' T6 r2 w* U
语法:namespac_e 空间名\空间名;
* s8 m; |* T% h! [# w# c% a0 ^; U, p# u6 m! f- L" z! _
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:9 M* Z! K" o3 ^' s/ Z7 `

7 ^% p, S! m; g----------------------------------------------------------------------------3 w' U) V! F% Y2 H+ B: X
5 n" `4 B  D5 K; E# g  |
<php
; W) p# B! V$ J! e4 k
& ^  y9 X  c( S. q( C' Pnamespoc_e AA;
0 f# _( h& u3 bfunctio_n showInfo(){
: S! x" }6 l  v- I. F    echo __METHOD__,'<br/>';
9 J4 e8 w& v6 D# x8 c# t7 Q7 m}
$ ~/ n" U1 W; r; L+ Qshowinfo();) o) w2 c1 }7 r
6 Q3 E/ o0 ]$ C; p0 z: p0 U
namespoc_e AA\BB;1 C( |; T  G: i" H' D2 \: L" q! b

0 `. y  ~; K( `- Afunctio_n showInfo(){& J' f  g- y+ O6 H  ?" N! K
    echo __METHOD__,'<br/>';+ O# I" k& g- V! ^
}. y2 y" L' m# [4 M9 Q  w0 g9 M: I7 Y& M8 q
//showInfo();9 q& Y) q: }( y- x5 X! A
----------------------------------------------------------------------------
, Q/ J6 A# [4 l4 \* k6 W2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)" ^9 @; d4 }. H9 K# V

+ K: r5 f" {& W4 ^4 `3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。$ W# ^  `2 t% r1 j) b, H

& z0 \) l0 }3 I. o----------------------------------------------------------------------------
% c$ {  E3 k1 D' k& U- ^4 J/ k" c! F$ D) j0 B8 @8 ]/ s
<php+ Z1 T+ l; [% a8 H# [
namespoc_e AA\BB;
' G  h4 g7 z: d# K( y2 Ffunctio_n showInfo(){
6 p& Z* e. X% x    echo __METHOD__,'<br/>';
) \8 h# X/ q5 \3 n+ t* s}
  b4 I7 i3 C! [- ~5 Cnamespoc_e CC;- T* \$ E) K# @7 t$ k
functio_n showInfo(){' \  _& ]1 x) G. C
    echo __METHOD__,'<br/>';5 V, N4 i7 r5 W; o* v; x3 J2 y- H, p
}" g+ R, {% c: q: `5 O9 \
namespoc_e AA;. Q6 J6 h2 R5 L% k" n7 A
functio_n showInfo(){
+ o: q: z% b  h) s    echo __METHOD__,'<br/>';$ J$ P: T/ f& z4 [3 U/ [
}
: p# Z/ T8 ^: K& [1 J# W//非限定访问:用于访问当前空间中的成员+ a- w# R; p" m- v; w
showInfo();
- y9 P8 \) Y  X( U2 l7 L6 h//限定访问:只能访问当前所在的空间的子空间中的成员7 |/ w) [# j& O/ p2 _8 o6 h4 G
BB\showInfo();9 t6 V7 c- X' L8 y
//完全限定:可以访问其它所有的空间的成员
1 W0 I: q! P+ K6 E% f* ^\CC\showInfo();
/ u- A% p  h1 y" _↑根空间标识符9 |4 X& p; i7 a. Q
----------------------------------------------------------------------------
& _- b4 p) @  g但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
; n/ [- c' v% o4 F
2 ^! s' u, b9 k( J$ K) n当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
: k0 S$ K% i! [1 E3 \% _) }' @# l( v  K, f  U
代码示例如下:& ], C- s' d4 q7 s

3 v9 Y" U6 e: H0 Z----------------------------------------------------------------------------
4 ^! j* @' o* ~8 }3 h9 j' Q5 p7 s3 a% k: `4 r0 k

2 h- |8 v. o2 B0 T3 }* |04inc.php
% Y0 d" S6 Y- i9 N3 ]8 z' A  U<php
& i2 `* L% O  \
- T5 g3 d: U( {5 |6 I4 nnamespoc_e Core;# f  V* B! V! r6 ?1 @( t0 W- d0 H
include '05ou.php';
4 j4 N6 e% K  F; i( r$ \2 Mnew \AdminController();
6 B, g* {' N. u' T3 XshowInfo();
9 G- E5 S7 S6 }7 [; M2 m% M& T9 h% S2 ^6 E. o, X7 B, p7 Y/ a
echo P;
& s+ A, I8 D7 ^0 Z, d% }/ H# B//根空间中的成员,只要类的访问必须加‘/’
; T! |7 ]6 L1 \% U- E: ]. L- d4 a; }----------------------------------------------------------------------------
. S- Z" Q3 J' z2 M. H/ ]- Z3 w/ p
9 S' R. I# A1 y( x6 l05ou.php- e9 q( L8 }8 O8 N) J
<php3 L' H8 Y( C* L6 I7 |+ G: P
const P=5;
) h- a6 d0 Q( W# }' p4 \7 I2 n/ }4 C; Z
functio_n showinfo(){& s( u5 n5 J5 _4 U4 g/ o+ n
    echo __METHOD__,'<br/>';
! d  s" z$ e8 a; S# `}9 l+ B# m* g5 z3 d4 L
5 y% Q+ |) x5 [7 S0 T8 W
clas_s AdminController{
# B2 H$ T, D: b2 I6 u( F  z. s    public functio_n __construct(){" w( ~( |+ U  |% l% I9 C/ I; O
        echo __METHOD__,'<br/>';
2 H/ J; N( F0 X    }
  H& I: g9 N0 Z3 Q- p/ J}
& {/ a# Z& _4 P
2 D$ F$ V5 }% t. f' k第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
( N- R. I8 }" v. d( I' s----------------------------------------------------------------------------
) X+ r0 N( T9 L8 I; p+ O04inc.php
6 w1 J1 M( Z0 o) S4 c% `<php
* Q; P" t. A0 ^; A  C" N9 V9 F) m5 f  b8 g6 O+ U& D! |' a, \; Z
namespoc_e Core;
. I* j( t  j* C2 M' a/ einclude '05ou.php';8 N. m1 F" {2 q2 P, L* J
functio_n showinfo(){
; Y. @; }2 y5 t1 X( o% E    echo __METHOD__,'<br/>';  i( w8 F$ x0 r" s( v
}* h/ w# G4 Y: a

% k9 C! x& S) l; t! a: mnew \Controller\AdminController;* p6 k6 _' n( C
----------------------------------------------------------------------------
! h* H9 R2 I0 h5 d05ou.php  T5 N# V" q' d3 V0 W1 z" g0 _
<php! m5 t8 }8 b8 Y6 k
namespoc_e Controller;6 h* i: U- b* Z* n5 G$ z

2 {. n5 |1 K; R# Y: Oclas_s AdminController{
# q7 ^  [  _- y! P+ e- A0 e        public functio_n __construct(){( ]( t* H6 I$ Q' N# \/ E, ^+ l9 r. f
                echo __METHOD__,'<br/>';
8 P: T% M4 U5 g; S    }9 ]9 a& {4 B5 m" O7 l5 u( @
}
; ^1 }3 E2 c  a3 _/ l1 q2 R3 z----------------------------------------------------------------------------
& w0 J( O& j7 Z+ J3 F
& C8 E7 x: ^$ t8 l& C3 O4 d0 x: g* Y4.引入空间成员:/ b$ f+ }7 M% s  S# o, L

( D" u8 A$ T3 r% T+ ]3 v# ]! l4 r1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。( y# Q- \* j3 Q0 V

4 `1 [7 V7 O0 G2 M: G7 o8 u2 m----------------------------------------------------------------------------
3 N: s3 r1 ^) j2 y3 o
# O' h9 G' M/ e- i; z04inc.php* N* r# n. ], G' U  d
<php
: x0 u2 C" w% [5 bnamespoc_e Core;) ~* |; I8 m9 r/ F
use Admin\Controller as con;
# ]6 ?# H7 L! m" e
' v1 s! Q, u6 i" _! tinclude '05ou.php';
/ E4 M8 g" Y$ \0 z8 T: D7 }. r5 w$ _8 n
new con\AdminController();
9 S, X  o' \, c7 J2 x----------------------------------------------------------------------------
: T  @0 x+ q* W5 |+ d05ou.php  q7 r! u; F# g$ V; a  w. j
<php# _. g) y; C8 e* i. V3 j( C
namespoc_e Admin\Controller;
3 g6 U7 q* r( T1 d( ?! Y8 ~' K0 V. [" |5 c& y
clas_s AdminController{
$ I; \: J) w+ q, q; O    public functio_n __construct(){9 f' u+ \4 Z5 C* }# A
        echo __METHOD__,'<br/>';: d" [# s" A" Z. S) n. q/ M' q
    }1 h' h: U5 J. j5 V1 z' e& Q( J  c
}# ~% p4 N: a) H' G: x& @8 p
----------------------------------------------------------------------------
. G% m: w% ?5 n, I8 Q2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。8 }1 }& v0 O/ v0 c$ z
" D- Q8 {+ y; A9 m8 a' A* v2 K
----------------------------------------------------------------------------5 U* W( V$ n. A5 u) n7 M. [
2 C; U) h! `+ E6 J% F! h4 v6 U
04inc.php; a  |# b; p8 g% _/ W
<php' _- x- T5 }: h: A
//引入空间成员类% y$ M$ |% k* R* o

! m. R3 ~! F9 `namespoc_e Core;
1 A) ^4 L. g$ Y! c3 Buse Admin\Controller\AdminController;
/ n+ B6 n! i! l3 C( vinclude '05ou.php';
& X5 g9 t1 n0 _  \7 P* x+ i$ j( _1 t: w4 z
new AdminController();6 B9 j; i' X9 T; f  l+ Y" p! M: E+ q
----------------------------------------------------------------------------
4 U0 F, @" {, D$ ~$ X0 H05ou.php
: [- c, y; z* z0 [<php
; T' b2 [0 f( z2 B# J" Enamespoc_e Admin\Controller;
+ u. ?. x+ ^1 A: A" a' i3 L+ ^  l% ~) N  |& c
clas_s AdminController{
) W. p  ^5 p+ k+ g# l    public functio_n __construct(){
, G0 F! ~# o: x8 S" Z$ H6 j        echo __METHOD__,'<br/>';5 ~7 ?- }( `% ?3 I' ]5 w& B
    }4 J- H( g2 l3 T
}7 m; G, w- M4 e4 t5 ]7 F: `% r
----------------------------------------------------------------------------5 S8 B4 E  D/ X. V! P
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
% k; s9 b; S% N! g+ Z8 `) u8 G
5 H4 f% `, G6 X) E" b% F$ g2 ]4 r: {/ g( b/ u$ T
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
0 e+ [0 B: w: \/ ?+ f# I4 }. H" X7 u" t+ z) ?6 q; P
: Y& K! |- ~8 ?
; x$ v. D4 z2 t1 }

% g* W  s& V6 w: T4 c5 T4 V/ o- X
5 I% e7 ~3 b5 [$ L
3 S) b- k2 n' k- @' t- ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 07:09 , Processed in 0.054662 second(s), 22 queries .

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