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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
$ X0 ~- q( @4 ]) Q, C4 U9 M
) Z7 |/ U$ U4 R" Z0 t( S1 Q8 C在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
# x. b& E: S. Y7 C9 t, p7 g6 ^
' ?( H) ^: |/ V" x
; G" |& f8 U: O! q- i' U( N: G; y  D6 A3 A
我们来详细的讲解一下PHP中的命名空间:) K5 K9 T, s/ T  j1 K, p* [

7 t  q: w5 B$ X3 ~% N语法:namespac_e 空间名\空间名;
" E6 f/ w3 q8 m' J
$ Q& Z6 D; D8 N+ v, W5 t9 M说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:8 J+ [  ^! x) U2 J
3 X9 ^* X' g  o; \" P+ c1 ^; w
----------------------------------------------------------------------------6 b/ R% O- k3 M8 D2 \0 R
, |- n7 `: {5 L4 Z% A, p: Z# l
<php2 M8 e- X9 O$ Z9 x, a2 p3 G
& \* ~9 a3 q* T: c+ _% }3 r; c& E
namespoc_e AA;
, a4 i( ~- i: ]; W8 ~2 @  x6 Ufunctio_n showInfo(){
3 ?1 |! w; P4 d" ^, M6 `    echo __METHOD__,'<br/>';
: G; m) \2 C+ H  ]2 |3 d0 ]; ~}) s; G! ^) E! Y! H. U! T4 g. ^
showinfo();
; _! ^! T, N+ T7 t$ u5 [9 ^
3 T7 Y4 |' Y3 g! }8 enamespoc_e AA\BB;0 _1 B9 O! N% ?* J
- U0 C; k7 L( V, x1 R8 r6 e
functio_n showInfo(){
9 c8 |2 i: ?  e0 q; c, u6 r- a8 @    echo __METHOD__,'<br/>';7 n6 y/ c2 U! C4 _% o: z( T( y
}
' [) A- N/ m! v! t8 e" `- g' g//showInfo();
- \! [5 o: O# u* q" Q; q0 s# O----------------------------------------------------------------------------
8 ^5 F8 m: c( u5 J2 m- R  g2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)/ H, B' }" s) v; w1 S, y6 i
+ P( n" }% R' X& Q+ J5 {" m8 Y) S
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。7 `' g" t5 L) }& N; W" l8 V
7 i" K" Q" j4 u/ e' n6 E
----------------------------------------------------------------------------
9 J; @2 `; h) s9 l7 ?3 `, Y; H% H: r' v/ s- |
<php
$ V) l3 Z+ i8 t2 ~5 V# b0 cnamespoc_e AA\BB;
4 B% `/ \* \' B- `' B: sfunctio_n showInfo(){
- s( g* m* p9 c8 ~    echo __METHOD__,'<br/>';8 E( w1 Z8 O. I( R- `5 U
}# }( U% @" k/ S, i) T) V
namespoc_e CC;
; M( X* E" Y6 F8 e9 n. ffunctio_n showInfo(){
0 w0 b+ Y4 _/ f) M& P( d; t    echo __METHOD__,'<br/>';4 h3 r# ^% s$ ?) j/ I
}1 K* q, O( C4 n
namespoc_e AA;7 S* i  m  C& H% {3 y' _' H' o
functio_n showInfo(){6 e1 @: ~2 T% k* f7 U
    echo __METHOD__,'<br/>';3 y* {9 P2 W7 [! ^. Z3 Q. G, O
}1 b* A9 X% l9 [* W% S
//非限定访问:用于访问当前空间中的成员7 _& I2 L0 Y2 a( i2 D
showInfo();
/ [7 C+ o* F% B; M$ x//限定访问:只能访问当前所在的空间的子空间中的成员
  Q# j4 @* O1 ?8 E* H1 GBB\showInfo();8 F0 ]+ x! V6 R
//完全限定:可以访问其它所有的空间的成员/ |- a- a8 `6 A% n) X; {/ f* S
\CC\showInfo();
0 {& i3 ~  `) T, g, S1 s. b↑根空间标识符
& q. A+ L( i- Y8 K+ y3 x----------------------------------------------------------------------------
$ d% A; F+ z% g- J( g0 ]但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:/ m1 C* u: E* J$ N
# G; ?9 U8 N/ y- O9 A  @* i
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
/ u% T6 e0 H7 \4 ~2 V. r7 \
0 A7 f0 q5 U+ B3 \% y! i代码示例如下:+ I. V" p0 a  Z1 m2 R1 F

' b/ o) q6 b9 b- s----------------------------------------------------------------------------5 ~7 t& F5 X4 f5 K* t
/ u; }* ~" |+ [* E0 m% O( Z, @

5 c3 K( |* t4 c04inc.php
, ?; v5 I& v! [3 r<php
" m7 a. _$ [1 @* r5 m
0 o. W% S# C; ^6 Z" n. r) e. Inamespoc_e Core;
* y) @3 u* n: L9 Vinclude '05ou.php';: X! |$ T1 o& H# x
new \AdminController();( O! e! N- m! _3 a
showInfo();1 z2 u- z( _7 _& U: x% `  \% d1 t
" ]" E3 @4 k# v) C
echo P;
1 p& t& R3 \$ O& ^9 B2 J//根空间中的成员,只要类的访问必须加‘/’
! x' U# a$ h/ v2 p8 M----------------------------------------------------------------------------: j( D/ H! F3 @$ p- G5 A! O* g  t& }  g

0 F+ u6 L" V; D4 i. z7 j: q, O  D05ou.php/ p& a9 R. r) [6 L; T+ `" S
<php
8 D" t! M) v0 d) Z8 r3 a2 ^6 {% Zconst P=5;
0 o6 Y7 h1 ]& ]; F0 A
3 d$ l7 K+ [2 r5 B9 kfunctio_n showinfo(){
! U3 ?3 T; j  Y. S) M6 ]' I    echo __METHOD__,'<br/>';6 ]! ^8 [3 T/ a% s& d
}
! W' |; v+ X7 _8 ^/ X* |6 H
. E! a( ~' P5 X8 B! lclas_s AdminController{
1 _  K+ E$ ]# q* o$ o5 W    public functio_n __construct(){% v3 d' h, j, W( F6 E8 }! ]. t
        echo __METHOD__,'<br/>';
  q5 P: F4 d% b. v2 K$ ]    }- s. O3 d# }! C2 K. h* j
}1 Z7 R9 D5 y& _6 Y

2 j* C- n& n7 e) U* n& C+ ?) d' Z第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
. d6 l4 L8 E/ n$ |0 N* R----------------------------------------------------------------------------
% ^; i3 [# K% @) Z( e04inc.php, P8 y8 s6 Q* |& l7 C
<php
% D" p% u) D5 s
/ d# D; x1 t1 z2 u! S6 bnamespoc_e Core;$ Q$ ~5 ?& S: ^+ L/ G( ~
include '05ou.php';; R9 U$ J$ y& T& O6 b6 Y) Q
functio_n showinfo(){' J4 j! E* `; A. h2 i. y7 Y5 {6 Z
    echo __METHOD__,'<br/>';
5 e- J/ n9 J% o}! q4 d  f/ E, N2 K8 H& E

( N8 N/ o- Q& X$ [new \Controller\AdminController;8 J0 u. d$ W% M9 F7 V1 S
----------------------------------------------------------------------------
" z) Y4 L. h+ z; E* U1 c1 X3 D* p05ou.php
/ q, w& ]$ ?* C, Y<php
  |# l- P  g9 M% @& Cnamespoc_e Controller;' E' H8 `" E( c$ Q- N! N
# ~7 s$ J- {3 |) R2 y
clas_s AdminController{( q1 R5 w8 D7 ^' Q# r) z
        public functio_n __construct(){$ T- r+ F: T9 `$ S. {
                echo __METHOD__,'<br/>';; W8 W# m+ l9 E/ e  |( O) d7 v5 T
    }
+ K% s7 ?' ~6 e}
: e, M. S; H; i5 x2 i----------------------------------------------------------------------------! a* B- r1 v9 V  g5 R

/ y, g, ~9 \/ U8 h% Y9 U$ G% u4.引入空间成员:
6 u0 K$ B. z5 z+ k; I  Z
: o8 U/ H. _7 }! |% }; W5 R/ H, r1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。; l/ p& M( O' c' q3 M
2 I. ?' S4 V% x: j% b/ |0 z
----------------------------------------------------------------------------% x, N) M8 _$ W# c- F% {

: K0 W; j/ u9 f! ]$ P9 P7 P8 @04inc.php
+ ~" Y( Y5 w& A/ Z<php
' \! v1 F" m4 f9 \) Y% y" anamespoc_e Core;
5 b8 b) g" G6 n3 [( C% ~) O. Yuse Admin\Controller as con;
9 n1 R: j& K4 _
( T1 ]& `9 S# u# M' e, O' w+ L- rinclude '05ou.php';5 [* o+ n# |& A* v. q2 F

7 L! G/ M0 E8 y9 V3 x$ Tnew con\AdminController();
& C  s7 B4 {3 P* E  N3 M9 j0 `----------------------------------------------------------------------------1 D! Z  i5 Q4 D
05ou.php8 |  p: |. G( q9 L
<php. j, u! g4 W# H7 S
namespoc_e Admin\Controller;& ^+ Y/ T8 t  u+ O1 o5 u5 n( L

# \) L+ Z& m3 mclas_s AdminController{/ g* o1 D  h3 G' i! c2 R
    public functio_n __construct(){
. a. C: T0 K" M1 l; L% [        echo __METHOD__,'<br/>';9 T4 ~2 y" b% @" z2 F0 w
    }
! ]0 s) T: u0 |/ S}
4 V& O6 `1 a. d% |8 _2 y8 \2 w' b----------------------------------------------------------------------------' W5 g. N6 `6 g8 F
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。6 m1 h$ z' E4 A7 L% c! p

! i% l9 f8 v: }: f+ q$ p6 S6 x7 }----------------------------------------------------------------------------- b. S4 T9 I% p) D

- b, g' u  M  d04inc.php! Q/ d2 _2 \7 U/ m) M$ _0 T' {
<php9 s* a" Y: M- K8 K. `- g9 j* d  g
//引入空间成员类
3 t: a: l1 G, V  Z' z/ A3 J" i. f2 X* c% P# ~9 E$ S
namespoc_e Core;
. |, ?+ r) e. t% Muse Admin\Controller\AdminController;; y; d5 a5 V1 h* {- @9 c
include '05ou.php';  \' Y" x* a) \, p
8 m- M6 w" g$ j5 z4 _$ o
new AdminController();" u# x! j" E" Z: }3 ^- x$ J
----------------------------------------------------------------------------( C1 G- ~1 o; m/ ~0 k  V0 z2 C6 t9 [
05ou.php
# A, }' S" g2 z  o8 r3 m. p# Y+ S<php
4 ?: g; n. T  T: s4 F. w2 Enamespoc_e Admin\Controller;2 M$ D# u) k" v1 b) H" Z0 R- S
. i/ V1 b  M6 F7 ]; D& P
clas_s AdminController{6 Y% U, |7 C/ C# v5 k
    public functio_n __construct(){5 Y* I# r" ~6 J( `3 K+ `) U) D
        echo __METHOD__,'<br/>';
: g/ x8 Y" ~8 y. L    }8 T% \5 F8 [/ M
}
( _2 b4 o; Q' }9 {7 Z5 n----------------------------------------------------------------------------
+ u4 H: D) @2 E1 M- v5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: s% ~$ v* M$ v7 K1 _
# T, \5 i% k1 h/ v. r: v9 p7 Z1 I6 x
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。  c6 h; d2 x8 r# G0 g7 d& Q' u

  X% Q2 s) ^) m% M4 E# j5 B7 H; O; w, j

; q2 Y( L- \2 V; p- {8 X( D8 ^
  ^1 ]/ d3 G: n3 f% R
2 q8 K9 B/ J! m" C! X5 V5 [5 L8 `# l+ _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 10:07 , Processed in 0.115212 second(s), 23 queries .

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