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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
- }0 {: P0 ^2 R- \) _
- l2 S/ @% @* k. U在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
, t0 l6 l! V7 j. J$ a$ y1 x0 V5 M
" `. l, v% T* \* b6 @/ D4 V. A
* z% ~8 z( Z# F3 D5 f
我们来详细的讲解一下PHP中的命名空间:
3 e0 i1 a7 O; i2 I4 ^( ~/ A- }; O5 ?% s, U3 T4 O, ~! m1 k3 C
语法:namespac_e 空间名\空间名;7 d4 T" W& Q/ {. m4 k' b0 A
' \* P! u1 V2 q: Y0 V" w5 o
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:' \, g/ G. z0 k" G5 G

1 w- J# O, p8 ?5 o+ }0 Z+ j8 ?----------------------------------------------------------------------------7 {4 V# g' {2 u8 b3 }# z
) z8 G. h$ k. J$ K5 n( n5 K
<php
) C/ E' W9 B/ }0 T$ W: m: G; |5 E/ I4 h5 x2 g
namespoc_e AA;3 g: ^' h4 r& d
functio_n showInfo(){6 u( p0 G7 E4 m- b. {9 v1 r2 @
    echo __METHOD__,'<br/>';( J4 a2 `3 N0 [, }; y5 k6 z
}1 j! h' n, S2 D" x8 m, G
showinfo();
+ q5 z! X/ E6 P# [4 s
8 I. L$ d9 f6 l# Bnamespoc_e AA\BB;) o0 o, f3 Q8 N" ^

7 \' l# C5 Y: ]' _" |9 Wfunctio_n showInfo(){
3 B; ^8 v4 {' ]  }' Z( a    echo __METHOD__,'<br/>';
: \/ s1 {3 v" f0 S% |* _1 w4 w}; B% V# E  v/ K# u' u
//showInfo();
7 |/ n" M4 m8 q* `* B----------------------------------------------------------------------------4 g% j9 G# ?& p2 Q, R. r6 E
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' |1 A  `# o4 g" d

9 v6 a4 N% e3 P  M3 h6 N3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
1 v! ?5 o6 V% @' Y& [5 V; a3 q6 O* r; J! q4 w
----------------------------------------------------------------------------, E5 s' k, }5 v2 a3 V2 h( ^5 S
' A8 w( |) h5 a) P! M- t
<php* S4 a, y4 |2 ?- A
namespoc_e AA\BB;
' ]2 Q! ^: A) ufunctio_n showInfo(){( Y* d. D; B# x( C- d' {  l
    echo __METHOD__,'<br/>';% c3 w' r7 H/ G; c8 k
}
- V- h/ r5 V5 d/ P; I; m6 tnamespoc_e CC;
, b# ^# e7 G( ~% ?' A+ ^7 t$ [functio_n showInfo(){7 p6 g+ j9 [: z8 n% `+ h2 Z- I7 N
    echo __METHOD__,'<br/>';3 k6 |$ r1 \& D5 K& E& L
}
! }6 N: c, j4 Q( R+ m& x9 m7 y% d# |namespoc_e AA;
2 w5 S9 Z# u7 Q, Z/ lfunctio_n showInfo(){( f; w% [5 r; y
    echo __METHOD__,'<br/>';* y/ W; h* Z0 J1 u: s; _
}
1 T. Z7 j- e4 E9 V* c7 U" m$ I//非限定访问:用于访问当前空间中的成员
+ r) F1 Y# T. t4 `/ @0 pshowInfo();
$ G. \! z2 `' }$ A; Q) I1 ?//限定访问:只能访问当前所在的空间的子空间中的成员: Q) u8 M3 ^/ i. ^2 p
BB\showInfo();
$ K% g& W8 ~9 b//完全限定:可以访问其它所有的空间的成员
( o# v# I" a% ?: V6 N\CC\showInfo();
. E! {) X+ n  [! B2 ?↑根空间标识符. ^! Z6 Z* o9 S: i1 w5 P+ a
----------------------------------------------------------------------------
# F  f; n. Z1 ~3 `' U' ?2 }+ i但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
4 Q, w# t9 g5 a9 f8 s
6 v+ [6 d  I5 ~9 p当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
# U: l- m* ^4 E; D6 M9 R. U) M  {+ f7 z
代码示例如下:
) m7 l3 }  |" d4 E# V2 ]. Z& l% {5 \! t& u* @+ [
----------------------------------------------------------------------------. U7 g" c( g( {3 e
3 Y: o  h: i2 L! ]# [3 h
8 Q$ U# `( }1 j9 I  v3 I, m' W! `) p
04inc.php, ]# H. f$ w4 U6 H3 q6 @0 l
<php# W$ k% X/ G7 ^8 Q
  A' S2 Q) Y) f
namespoc_e Core;
9 t$ y3 N) w! g+ Yinclude '05ou.php';
7 p( q. W/ g+ T$ T4 Z4 anew \AdminController();8 d: G( m+ Q' t8 f1 u' f
showInfo();/ i) p0 U' g1 J# H
3 W) _- c( G& g5 S9 R
echo P;' h+ `* s+ F  ~* l/ g
//根空间中的成员,只要类的访问必须加‘/’
- R; L* Q6 `' U+ B% ]: m/ K/ i----------------------------------------------------------------------------2 ?2 B4 n+ \7 K9 J9 j$ O

/ E# t/ K& e! c# Q, _% @8 I05ou.php% q+ u. J$ Z. c
<php
& q1 s, s" n& J$ K4 Sconst P=5;9 ^1 p& ?+ _0 u2 W# y+ `0 E2 C: B
% @- @9 x3 n' s
functio_n showinfo(){9 b# b/ O3 S% Y" V6 G5 ?) W
    echo __METHOD__,'<br/>';
5 y3 d0 u) h8 B; U6 _. n! R}
6 J- ^5 M3 q& T3 ~4 U+ I5 }# \4 f9 K, t" R
clas_s AdminController{
! t4 a: u" V' ^2 Q4 A, T  C0 U    public functio_n __construct(){
5 ^; G5 r' j/ g7 T- J8 b+ c        echo __METHOD__,'<br/>';* V# L7 S; d/ Z4 f6 |# L
    }7 a' P/ y7 y6 r* Q6 f
}( M5 ]5 n# k! G* p( V

- _3 m4 {0 x; N第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。8 F3 W* ~+ G; @3 f, z+ t
----------------------------------------------------------------------------3 u" J, k, v1 s
04inc.php4 S: R, G0 s- n1 x/ ?3 k
<php( {1 R- v! P9 [/ ^6 P& V* u9 L
" x2 y" S9 G  H3 J% Y. j
namespoc_e Core;
" \& |% D% ^, ~0 Binclude '05ou.php';
/ c% Y. k+ m: i* Mfunctio_n showinfo(){
1 A( U* p3 M3 ]1 _+ n: l1 F    echo __METHOD__,'<br/>';
( m+ I5 Y8 B" c}4 u& {: L9 g7 H
  p3 `. o( R, Q+ ]/ P5 Y, _' r
new \Controller\AdminController;
- ?: B9 H0 J( ?* Y----------------------------------------------------------------------------  g2 E) O' x+ @( D' H9 C
05ou.php
" {1 ]+ `) B$ @<php
/ u# p5 u! q! n3 V  fnamespoc_e Controller;
4 y7 N. z. D6 Y* w. W
" f/ V( G; G' v, t/ u8 Xclas_s AdminController{) ^, O9 {! {+ l- h  k# L( p
        public functio_n __construct(){) k' m  u, ~4 f9 ~0 U' ]8 A
                echo __METHOD__,'<br/>';
: x  P( d, [& W7 B    }% Z8 Q2 r) q% U3 ^* t/ n$ a
}) E* A* G) s8 m8 A: W3 Z
----------------------------------------------------------------------------! ?* l5 T' ?" N/ J, `9 _1 i

, E3 B. G/ G) x4.引入空间成员:  e0 B# u, [4 @; F/ f5 ~

/ n" N* I5 y- r$ e. n) G1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。. s  @5 f/ @7 n. B- d) k, C$ e% u
2 j6 C1 J0 F4 K" r3 B
----------------------------------------------------------------------------
/ l2 y5 l8 H0 S* M9 V. z
7 _4 l5 s) T' b1 D) n04inc.php
2 Q4 K! \3 }, |<php/ Y( F# R+ o' L2 }8 w
namespoc_e Core;
( x6 N( ^' R4 y0 j* M- Z8 [4 Luse Admin\Controller as con;  _8 x3 l! G' q" ^

) D3 U( e1 t! d6 yinclude '05ou.php';9 [% ^1 M9 _7 \- s; n
; l0 D/ f, H1 r/ l8 I
new con\AdminController();  n/ \( G: O( v  c
----------------------------------------------------------------------------# y1 {  k7 Z2 q; l7 s
05ou.php
# S7 S* d0 U$ [' S- V<php* Y- [) x! N  I) {" R  y( T
namespoc_e Admin\Controller;+ h- v, t+ h" z4 D& ]
0 ~' a4 ?  B3 |- ^, Q- G% b
clas_s AdminController{/ E. Q* {4 e; g0 a
    public functio_n __construct(){
% p) p% ?+ K5 F! ]/ ?) k1 m        echo __METHOD__,'<br/>';, R3 k- N1 ~5 f, v$ Y6 F, I) h
    }+ m( Y# r6 u2 N: v; u
}
  b7 z' e. }3 J5 d; @% t----------------------------------------------------------------------------: j/ I6 N+ B" e4 Z9 M7 Q9 X
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。0 {0 n& t7 p; ~5 M; R

+ p' {' k: c  a. \# V, d( V0 g----------------------------------------------------------------------------, `1 s( V2 {, ^4 ~

7 ?6 f  K% I2 m8 J# g$ h0 q04inc.php" p3 k) @3 B" O) v0 R2 T1 f5 x
<php
8 P" v7 K! E& _7 @//引入空间成员类7 g! T& i) X" v
" Y; O6 S5 Y- O, u
namespoc_e Core;; C2 l' U2 t1 p* c6 d
use Admin\Controller\AdminController;
0 i0 X3 h/ g$ z* U0 j' {  ~5 Yinclude '05ou.php';* d0 L! K1 F$ M) u

6 i1 p, c$ W( f$ |3 fnew AdminController();
+ s4 t9 ~* b+ |----------------------------------------------------------------------------
# ~6 \4 X% r& i05ou.php
8 \7 X/ v; w, E8 M& T& O<php
& N4 D; k$ F) D7 Xnamespoc_e Admin\Controller;2 y! j; N9 w% H/ E
( q8 p" @1 {5 ]# z" {( s
clas_s AdminController{
/ T, d4 }; U" m6 e    public functio_n __construct(){! `" z3 v- Y  W8 Q! _" i4 ^# ?
        echo __METHOD__,'<br/>';
; W' ]* }  t+ N' @8 c1 B5 h. X    }
3 v, q; t2 b' x( P}
& K0 }2 }0 D; I----------------------------------------------------------------------------
3 u3 Q8 X- n: t! G& E8 s% A5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。: [, s& O+ |; v, i( H* S
3 P! o: Y8 U  B5 n3 b

! j5 Y+ ~( @7 x9 [9 A8 Z这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% k1 V; L! O+ C% k0 ]* c) C. Y5 p# H; I) B1 N: i  a8 M
3 z0 \# \' X6 F7 }$ x- K" j6 }

) ^0 k2 p  ]5 C% V) @
0 r8 V% u4 P5 j. ]2 B; S6 M4 U0 i8 C) o# Y$ [" Z# f

4 h4 e( g( c1 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-6-26 22:46 , Processed in 0.159657 second(s), 25 queries .

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