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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
! f  p0 c7 I2 \* ^- M2 ]9 P
4 A+ y. F) d9 d' u; h! F在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
, b$ @) q- u. {1 S( _" a
! n& M2 @) A! @# x! L! D9 ~8 I" v/ w 7 ^2 B3 ^/ X- S0 @" Y1 f& P* j

' i5 H% C& ]" j3 Z0 a我们来详细的讲解一下PHP中的命名空间:$ j6 _9 ^0 k4 ]' x* I9 K9 `
- x( r8 _) |: ~$ N
语法:namespac_e 空间名\空间名;3 ~/ ?; M7 t3 G; V

; E- X! D# K' v% H* a3 o/ d说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
+ s* {. k% Q# {1 H/ B2 H4 [- |3 `4 ^$ v: P! h
----------------------------------------------------------------------------
$ u' K! M  j8 p- Z* s
$ d7 W5 O( V* d- C' k' }<php
) m% V9 c+ A$ I& l. [( }
$ Q9 p7 e9 T3 ]4 \; {, H0 mnamespoc_e AA;5 R, U  P# C/ N2 `
functio_n showInfo(){) B7 \; [& E9 A! k/ k' o: Q
    echo __METHOD__,'<br/>';! s* J  x" c+ K- c9 w+ c
}. \* O& `7 O) U& G) t
showinfo();
7 I* w; z- _3 n: R! o/ k- ]+ |/ _
9 A6 J% o' s, v+ A/ Unamespoc_e AA\BB;7 a) ^4 i, X- }7 h# P! q- T, Z
! O2 ^/ Y4 Y* }1 H
functio_n showInfo(){
/ l& Z% V% i; z; F* ?' S    echo __METHOD__,'<br/>';
/ s8 H2 ?$ D+ D, u8 e% G- i* D4 W}$ ?1 V5 k' l6 F( P( D* h6 Y
//showInfo();
/ P! e8 V) I' w' S" p----------------------------------------------------------------------------
% q9 [. B( C6 X( j2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)1 \; V" I. |% S& g3 g

2 x  h" u2 C1 D5 K: G3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。* e* ]; V8 i% v) a$ F! y! v# P

3 D# r, v6 a3 k----------------------------------------------------------------------------, u2 O1 H. ^8 j* r5 D1 r

- I4 ~5 m( m- P1 O<php
8 {8 S0 e' ~8 K2 Vnamespoc_e AA\BB;! h! q1 L3 D$ B. ?( s' d
functio_n showInfo(){
9 l0 M* R  E; P2 ~2 h4 T. U, t' v    echo __METHOD__,'<br/>';  s% w# w% Y  @7 j% k) A+ R  L
}% u1 [( U3 T" C( X/ s: X1 A
namespoc_e CC;
- R& H$ B. i! l3 ~: qfunctio_n showInfo(){
8 `! X: F, c, I8 T3 B% I4 Z5 j    echo __METHOD__,'<br/>';( f- h& k: v4 u' U" \- _+ g$ D
}2 M- C$ K/ i; `2 b0 _/ P
namespoc_e AA;) x; d- G+ z- U7 _$ u" _' v6 z
functio_n showInfo(){0 U" d8 g4 `6 Z7 I5 \
    echo __METHOD__,'<br/>';
! U& o2 K- r- y) @5 i1 e}* Y. B7 }* N8 @, d5 E+ Z9 }" O# W
//非限定访问:用于访问当前空间中的成员
1 X. Q4 k* F4 x( d. ?showInfo();
2 b: ~. B& S) @8 v2 q//限定访问:只能访问当前所在的空间的子空间中的成员# S* T$ s* P9 A( T
BB\showInfo();
6 `6 t* g6 c4 A. z//完全限定:可以访问其它所有的空间的成员4 C7 a$ t) V( W% r! ~
\CC\showInfo();
7 H) g5 B: a) i$ p- B% z6 z' c( Q& Y↑根空间标识符
( X+ o! V& \3 H) Q7 ]. ?4 ^, P----------------------------------------------------------------------------2 P/ H! u9 L+ {3 q# |8 i
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
3 C0 m6 _# G, D3 Y1 _' g4 Q: Y
! ~, S& S. ?. S当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
, _+ j1 P' t* x3 m3 D
2 y0 e; t9 |) W& Y& k& \7 M代码示例如下:
" ^$ z$ H0 ]8 E$ w( a. }- j9 V$ s7 c, Y2 r2 ^. W
----------------------------------------------------------------------------) x# o1 o! f: p$ c2 i) t

+ d# P  ]+ @1 u' U8 d. `- V* n, K/ i1 g2 R" A8 E$ i$ T, b3 J
04inc.php6 R1 _. _1 E: @. o" o1 O* N! g" H6 |
<php6 W! u, D1 A9 f, e0 Q4 {- C

2 j3 I2 z" C+ ~" L$ ~9 z9 gnamespoc_e Core;
- a7 s7 j/ D# X+ S9 [: ?include '05ou.php';' W% @7 o9 w: ?3 H7 |$ a
new \AdminController();
6 ^: d" a3 L4 K0 l( k& ]showInfo();1 \( h# m% k0 }5 h
' m3 u1 u4 r; @# ^* |
echo P;
3 s3 e- k( m1 b4 |7 X2 u//根空间中的成员,只要类的访问必须加‘/’
$ D: X& x( ]1 l# F& N----------------------------------------------------------------------------, f: m6 ~) V- O" K- ^& D

$ t8 R; l) z0 e2 A05ou.php$ x7 F1 }! C/ O5 F" E$ E( P
<php; Y3 q; j4 s+ E# ]# U
const P=5;
' G0 t2 ^7 U3 I' w' p0 j( @/ j( s  o! [; w* u, X
functio_n showinfo(){
, }: n# p4 s5 e/ n5 H2 |# I    echo __METHOD__,'<br/>';3 q+ C# c' A9 i
}( R6 k1 y6 _* C8 y

7 l; L# ?4 U6 ]7 t1 I# C+ a$ hclas_s AdminController{
: g3 a# f" a  W7 p( ]    public functio_n __construct(){7 s; f# E# r' H# B7 r5 }
        echo __METHOD__,'<br/>';
9 _4 ~$ t% q# x8 Y! @    }& q" @: C! a/ b$ w
}6 P1 A2 E5 l; o: H8 T* d1 d- ?5 V* N
# K" S9 L, Z9 T# ~: |, J
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。. W5 C) O# i8 w) m( \
----------------------------------------------------------------------------/ D$ ?- ?. b) C9 p1 L( H
04inc.php
* T, X7 @9 @) R" G7 j9 h<php
/ w/ Z- o" a5 ^
% u% D/ P0 r4 y7 k( ]) pnamespoc_e Core;
7 E- `3 q9 j: ?. o  j  q, pinclude '05ou.php';
* u) b* z) [4 O, m/ cfunctio_n showinfo(){
# m# n( P: Q& Z! T  ]3 _- a    echo __METHOD__,'<br/>';
0 U) w* r1 p* n6 D0 U; R0 B}/ k, A3 D: |8 r* ~* K

0 P. j7 c% ^! J  O5 r0 T: c# wnew \Controller\AdminController;
# F% `* |- v0 L. j----------------------------------------------------------------------------* x2 J( Y% y1 L& f$ L
05ou.php
! U. F/ j" s9 [9 f- T# ~<php
8 m0 E  |$ W9 s  d% Jnamespoc_e Controller;
8 i- r+ g9 x, W- y( ?3 t: S$ Q  [6 Q! O# `+ p+ o0 B' C* d8 s
clas_s AdminController{
$ d7 h4 N4 ^  w4 h& M        public functio_n __construct(){# j+ C! W4 R$ m* d5 w
                echo __METHOD__,'<br/>';9 Q9 [& I4 |/ b* U
    }& e& k% h* o2 T3 M
}
6 y: X8 @- m$ v' d$ F: {- E% y3 W----------------------------------------------------------------------------4 n2 Y+ D3 g; q+ ]: A3 V# U
9 {* E( E: o3 ]' U& `/ l6 B7 f
4.引入空间成员:
$ X7 ?5 k3 \5 B" f6 o& h
( z* i) D" M. S, _: y1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。3 N' l3 y9 E7 }1 ]+ v# k* p" H
7 S2 D3 o( s6 ^9 |8 j& c
----------------------------------------------------------------------------
( B1 t7 N9 i2 o8 n. Q% ?0 y0 i4 K, e  W; g& C2 w/ x$ m( k
04inc.php
2 m8 @* S" U% y3 @5 g* z, R6 u/ {<php8 v- s7 B; M) J) S/ _
namespoc_e Core;
+ C; k+ Z: ?: g' Duse Admin\Controller as con;, R$ a" d* m1 P. ]  o' Q# H! A0 F& o
# v* }. h2 c0 m; F8 R8 Z
include '05ou.php';
8 F+ C: c4 M+ Z0 U3 A
" P( ]1 i! y2 U7 N0 L4 Jnew con\AdminController();
7 f1 I% B, |8 V2 ^) b! D; U8 B1 X----------------------------------------------------------------------------
9 E% ^0 t, V5 ?1 d, Z1 l! I05ou.php
' Q* a3 y& v" v: m( Y0 N<php- F$ a- y0 O3 z) x& ~- i
namespoc_e Admin\Controller;
6 l8 f) Q$ |7 p9 G  T
* K& s8 {) B7 M. M2 I# s# aclas_s AdminController{  g8 z; I" E6 x6 k# r9 N# b) J
    public functio_n __construct(){
8 s* m  X  Z4 T: t) I  o        echo __METHOD__,'<br/>';1 h( T3 ?! O- h/ y5 t* B5 }9 ]# m
    }/ d0 F# e/ m7 p4 ]7 r% i: F
}  Y! I. i+ v" Q0 h! y4 @
----------------------------------------------------------------------------  f" O8 O5 l8 S7 z
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。- k- s& ?4 L+ X- K4 u1 c4 x
$ e' q8 X- j$ R
----------------------------------------------------------------------------
& h' Y' U+ w1 g: p5 m- r9 v; n3 k+ U$ f% o' M
04inc.php3 e" ?; r3 l$ o) v: m
<php+ n8 |( S2 S# u/ l$ c% m' x+ W
//引入空间成员类
' U1 H7 e7 t& m; v
: q: ~- {+ d- F6 r' y8 Knamespoc_e Core;
8 L' b+ s- d$ e/ f9 tuse Admin\Controller\AdminController;
- M5 e" f& V0 s* |" _6 A4 B- Oinclude '05ou.php';* s, x6 x+ z& O( [( K  x
6 d* h% ]7 ^9 V0 Q  z$ y
new AdminController();
+ V: y. _" E. L" \: [----------------------------------------------------------------------------, Y( T- }- Q6 j
05ou.php3 `+ |& q0 Z( ^/ ^
<php
" r. r% N1 Y1 ?namespoc_e Admin\Controller;
- r. \+ w7 D" j$ ?" J" x
& S2 q1 ]6 `" ?* rclas_s AdminController{, A1 x. z: @' S( ^+ g  ]" q
    public functio_n __construct(){
1 B( k  `5 m/ z7 m        echo __METHOD__,'<br/>';
0 Y. s; f- C: C2 F& X. b    }) g# n9 d8 d) R0 K! A& ?3 t! o
}3 W, J  E8 |1 H' O* D2 x3 A7 A' g
----------------------------------------------------------------------------8 s4 I* D* T' U7 f$ y( B6 ?8 D1 x
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
6 N' x$ q9 C7 ?! R
# o! e. s# E9 r" I7 {" R" W5 z) }9 G9 o# t
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
8 i* ]* S6 H. ?4 M0 j9 [( h
: X& P  p9 c9 C3 C* O
/ o; w- Q; l9 V) u8 z+ }$ Z3 W+ ?+ ], N, t% j6 j
; n" g" d- q5 ?- K# N" H

# M' H- l) |) |) W( F+ J. l* Q! O% B2 ]1 Y. n7 a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:32 , Processed in 0.057731 second(s), 22 queries .

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