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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:. v, u8 t0 J4 w: u1 D$ N5 _/ i; x
: ?# F( M; U. ^. l& g
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:* n; L% _: Z, @4 H, o

1 |+ E$ C7 d& z# g
$ j; p4 J, p5 J0 v# R# s# q9 P& Q% m' {1 f: ^6 M( [; y
我们来详细的讲解一下PHP中的命名空间:+ t0 V9 p1 s9 |, l3 L

2 T/ w% D- c; k2 `' g7 m语法:namespac_e 空间名\空间名;
5 B/ u9 c0 }9 X% ?( d- R7 Y  p1 q
+ r; I4 F) E9 g( c4 W说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
$ I$ k3 w% F) Q. O1 r+ a1 s
7 X5 }0 V; h4 K; K----------------------------------------------------------------------------
- H/ y6 W, v; o, S3 n6 B/ x8 w. L+ V$ m. T1 A0 a
<php
, g; P. G/ w  b& c' h" w3 n8 d1 P( x/ K( F, p9 o7 @
namespoc_e AA;
( H% w( ^, d5 H% xfunctio_n showInfo(){
  n$ ~' n* `9 v0 ?! E$ n7 H    echo __METHOD__,'<br/>';( U1 h; B( `3 F3 {
}- S2 Y$ P0 a. x$ k5 N; \
showinfo();/ n4 Y) W) o" }/ \/ o& B

1 A8 l2 V; X  q* o  v0 F6 v* Onamespoc_e AA\BB;; i; Z, J( z3 Y& _! b1 t

# h) O# k: S5 U" Y9 gfunctio_n showInfo(){( K  f% y+ J0 R0 m  ?6 C2 O$ N4 I9 T
    echo __METHOD__,'<br/>';
8 p- `$ J- V& L+ w0 v( d}
$ T% ~9 u& F) |! a: y# @5 j5 z//showInfo();& q( [. L6 \  \3 ], q( m2 S2 `
----------------------------------------------------------------------------2 X4 p8 T7 Q. b/ S6 J
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)- b  \1 i- ]9 r  H0 S0 e

, \: g8 _! j/ v3 E$ e$ q% u8 H* g5 O7 [3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
% w( j" D4 E; `. S2 {
' d* F4 D& x$ F* {4 }----------------------------------------------------------------------------: [" w7 n2 J+ c0 N; W! E8 j1 k
4 F  n' [8 s& Q+ a* \5 s
<php
4 a  f$ W9 a& onamespoc_e AA\BB;( J' z! b1 P+ @- b* Y& u
functio_n showInfo(){( _9 W/ B& J5 `! I0 R! P
    echo __METHOD__,'<br/>';
& r- e2 y9 r4 _6 ?  e- x4 m9 X4 |}
5 d3 \* H; ?; h* e& W* Z* n7 v/ ynamespoc_e CC;
; M& D3 e7 u7 wfunctio_n showInfo(){
4 g1 y  K- Q, Y0 G    echo __METHOD__,'<br/>';
) j0 ]: O' v" W1 j% F+ @}! d9 A# U" r  w5 S0 k
namespoc_e AA;5 d, T: ]" m: T6 W; f4 J. w4 t, Z
functio_n showInfo(){
6 \0 v) y/ _" `3 y" H/ _% e5 r) q6 S- V    echo __METHOD__,'<br/>';
5 z8 L% ?' I, ?% H  N9 U2 D}
8 A, s+ f1 H! s9 w7 ?3 V/ t//非限定访问:用于访问当前空间中的成员& e1 t8 h; K8 s/ Z3 f8 f+ q+ n* K
showInfo();7 b" W  t' h, }( Y# B
//限定访问:只能访问当前所在的空间的子空间中的成员
1 h/ Q: x* }$ X% TBB\showInfo();& v( Q1 }" Y* ~# j) y$ U; I5 ], a7 p9 E
//完全限定:可以访问其它所有的空间的成员
+ m4 Q6 g* S) A' T6 y' f) E\CC\showInfo();
) @0 p5 m2 ~7 m* h9 k7 }. m0 ~↑根空间标识符! B7 r4 J- g+ U& z1 t" d# D1 w
----------------------------------------------------------------------------
& e# }$ i3 d- s9 y& a" D1 b但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:' k" b+ r' |8 g6 ?( j. S* k, [

: X, D. f% |7 Y, A( g; W# {当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
* q( K+ k0 b7 I/ ^. y8 m( e4 h4 S  c, R. ~& i5 e, j( K
代码示例如下:
* D$ n! d" ?: A0 [9 B+ L
4 b+ q, \( b2 j$ ?----------------------------------------------------------------------------
0 q9 e% N1 d( v0 h) ]; |' h( ?: L2 y  C1 J. H+ Y+ }- K4 j# c
# z% }9 b* J9 }7 |+ m/ P0 L
04inc.php5 r& \8 I1 @, ]- u7 p
<php4 k% h! y7 ?$ E$ y3 p8 W

4 T4 q/ F0 P- ^& g' [namespoc_e Core;
. E1 v/ t7 X% X" ?include '05ou.php';
/ ?- L/ W0 k1 R* m! n. e9 [new \AdminController();4 |/ c% A6 G; U; N; }, K$ N! l
showInfo();
1 H; u6 F- @" j7 h# ~9 e  H" d5 p  i' o( \1 j3 U9 F% r
echo P;% w  d3 ~, Q  B5 F" w3 q
//根空间中的成员,只要类的访问必须加‘/’. L6 D& U0 ]9 y% {' R- G6 K
----------------------------------------------------------------------------7 t, O# H2 X: g0 i/ T4 t6 h7 v

1 `0 }% x% E) L- i+ g: E05ou.php
* Y+ ^* P# [" g$ a; T) Q, r<php5 H% K' J/ {6 a3 r
const P=5;9 t, t: b$ P. h$ b

  T; K& h: t8 U2 k- }2 ffunctio_n showinfo(){; {+ X& r7 `( Y9 ~2 T' w: i& ]
    echo __METHOD__,'<br/>';
( }' H: v. x$ D% Q/ W}
& I7 |- i* B* m4 v5 z( h! v5 E  }3 M0 f1 Y* w
clas_s AdminController{' Q/ r% I! J! }, J- C  y5 C
    public functio_n __construct(){
& I7 X2 E% D* e% f        echo __METHOD__,'<br/>';3 d  u$ y. |6 Q8 `- D) s3 Y% ^
    }
; V+ i: r5 C4 d+ [3 h}
" k% y: ^; N% I8 _1 m4 J
" f* A* V' p/ A* z" S" O7 S- ?第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 B& e8 B6 y3 C, g7 b5 e6 H
----------------------------------------------------------------------------: a- d; k7 w+ S* n/ R8 \% H; R+ }& _
04inc.php1 G2 H. E% z  U3 p5 c
<php
& F( e. ]4 t3 \' _  t; h; a7 g) z- s; Y0 Q) ^4 Y  R
namespoc_e Core;" V9 E8 Y$ Q, K* G# v# c3 ?- X
include '05ou.php';
6 A/ D" V0 g& t5 C% n$ pfunctio_n showinfo(){
5 d4 Q) t& h' {3 p/ M+ g1 b, g    echo __METHOD__,'<br/>';2 B, a9 j* o" a# M
}, ^5 h+ w' T* c5 m* K( g) l, W
% h5 P, ~4 i& q, I' M4 `
new \Controller\AdminController;
% `( ?1 A) p- ~1 Y$ J  u----------------------------------------------------------------------------
* e3 I* @# U; k7 N& d1 i05ou.php* R; p9 [/ c% I4 T
<php; B  I- Q+ j9 q+ l8 z
namespoc_e Controller;
) K4 I) y% B* {) U- [3 B! c
; F& W9 {+ D: ?5 A, Y# {clas_s AdminController{5 v$ Z- q: z9 }* o
        public functio_n __construct(){8 _; \3 G8 [  @$ l3 u1 h# j
                echo __METHOD__,'<br/>';
3 B" {- }- e5 S" [* i. e    }
4 D, T8 G% j5 {4 {}$ L/ a* h8 i: U* m- P( v
----------------------------------------------------------------------------: f' I/ _% z7 w5 R
" D& [/ ^( O: ~3 ]9 ^0 H$ v5 P
4.引入空间成员:+ w/ F  b; }* u: E9 |( n
: w& P! Y- @) X
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。! S8 T$ G0 A$ y/ \
+ a. Z1 E: i8 o
----------------------------------------------------------------------------
, s* x( I( }+ y- S7 b; V. `% `  T5 I' O# z1 A
04inc.php
% j3 d& n! L; ?$ ]<php
& R# M( m5 Q- T- O* T8 ?% Onamespoc_e Core;
5 g$ ?+ M, A1 ~8 n+ i0 D* \# wuse Admin\Controller as con;
: W: D! }. K$ H: w! D
2 b' V( A8 b! g) o  p' ?include '05ou.php';
+ H4 ^2 W+ d: U
/ _( j  A2 V! f/ O# Rnew con\AdminController();
$ V% C: u. D& d----------------------------------------------------------------------------
& H& F/ D" @; k2 v* }6 z$ d05ou.php
& N9 b# g# e' ~0 @" Y<php
9 O8 i1 d; N- H0 u" @- {namespoc_e Admin\Controller;8 J% W: Q9 {6 ^7 B1 a+ G! i/ m

) s3 i* V) K5 N- |3 Bclas_s AdminController{) k; H2 r6 r8 T. M# [) Q
    public functio_n __construct(){) l. D) V1 ?7 F+ W+ Y5 |
        echo __METHOD__,'<br/>';
9 i$ t; g: R7 W    }
$ R) r, v# F" v! D# L8 X}
. L# q0 A  A1 e, o1 G4 E' F----------------------------------------------------------------------------
3 D6 R7 c' q6 o0 ]  d" ^# Z: x6 x2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
. b3 }- L( c! h2 E' D2 ~- a
# I( W; e8 T6 O1 y----------------------------------------------------------------------------% h  q+ ]. l# l* ]" Q' w6 X
4 S( i* ?, f; ?  V
04inc.php
% o- @. W: p6 @3 x' B8 I<php! S- [% d2 {" a" V( k
//引入空间成员类! k7 s5 h6 r) |! e
) z0 [0 S! n6 p6 P/ H4 P6 R5 D/ k
namespoc_e Core;/ ~6 T7 c8 C% Z4 k* p1 N
use Admin\Controller\AdminController;
* W1 ]/ D* J+ c' i& `% b7 Vinclude '05ou.php';
$ W# ~$ }$ q: o  r0 p* L; Y
) {& p( {: Q( Ynew AdminController();/ d) @" \+ @3 l4 f4 j9 I
----------------------------------------------------------------------------
' e" \4 t" U0 z' A05ou.php
& M6 z. x: a' t4 U<php
4 G8 n1 L( |8 P5 f/ S7 ?( xnamespoc_e Admin\Controller;2 {- E( Z% h# t$ N% _

7 L/ x5 W* ^, ^. u9 Iclas_s AdminController{
" `5 s+ R- m$ p4 |) m    public functio_n __construct(){
' t; q0 A# d5 _, C  q- f        echo __METHOD__,'<br/>';
2 A7 {6 S8 h% Y    }
7 V" W  d/ Y& _9 ~}  i$ a& ^: a$ i6 m
----------------------------------------------------------------------------; x5 k* R1 q. T$ n- w& e: Z2 K3 @
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
6 ^# ?; U; E9 V7 h  d/ u" l: q, l, w
' S+ c7 ^& X7 s; W. ^# P: h# M4 Q5 @0 D6 h# W1 n6 [6 j
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% r  b2 o" M. v9 m0 ^& `0 N" I0 z1 h; Q; S, f& f0 b
0 I" u* X/ w% F
2 y7 E$ e* r2 l7 s

3 N! j# O# ^1 }# U7 {9 r% M/ U0 l& J
+ d% z, c/ Q) l: U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 16:10 , Processed in 0.063990 second(s), 22 queries .

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