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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:# i8 a/ E4 B& R& O1 g9 F
/ D$ |/ A: ^6 J8 Q2 K
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:4 U8 ^+ l  a. b" }' ^! \- k0 Q

8 u5 N" m' Z* [/ j% P' u7 R 7 c+ A! E# _% A/ L0 p, `
, O$ n/ A0 a! r, s5 H% a0 Y
我们来详细的讲解一下PHP中的命名空间:
# R% p1 [3 j1 z' \' n2 z' |" k
4 j' y0 U6 |9 [) Z+ m8 W5 ]语法:namespac_e 空间名\空间名;5 a3 J1 v* q5 n2 }$ s! \

3 y2 D. y2 [9 v/ {8 l. p说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
2 t$ F. A" v/ g1 s' ?. \8 i5 @: |' F1 A1 [
----------------------------------------------------------------------------
/ a5 e) i7 U" Y- _* W( S- d: ?0 P" m9 C) s) p3 i% O2 ?
<php
+ I' B- I7 o7 ?$ C9 t5 o- e( P3 P0 E, L( [5 \9 M9 Z
namespoc_e AA;
" Y$ Q3 T" B. k7 N  cfunctio_n showInfo(){# M( {& N. ^- X  |2 s8 d/ \; ?
    echo __METHOD__,'<br/>';; y) {* P2 L+ S1 n% L" B
}
, C# r9 q" R( A% K  i9 Y, F1 wshowinfo();
3 `! a, Z7 Y8 X) }0 @1 ^' D& u6 e( Z+ L/ T2 r8 g
namespoc_e AA\BB;! S8 M! z  A; a
5 Q3 S( T( r4 t1 W8 B; D# R5 q  O
functio_n showInfo(){
; {& g; ^8 ?# y( Y7 Y8 w& o, e( B    echo __METHOD__,'<br/>';/ g2 M' ]2 P2 a) z3 k) E4 b
}9 ?4 T" |3 U0 j; |: c
//showInfo();
% M3 F" X! r: j----------------------------------------------------------------------------+ G9 r( }% d7 H7 L" F0 ]
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)& T6 Q/ g' C6 g- Q; W  T

+ Z4 k7 e3 R8 ~7 K/ e! n3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。0 Z; t1 V; q2 f; c

. h" P- h+ ?2 S2 L----------------------------------------------------------------------------
5 j) ^5 D& D& @. x& ?# k) p  V4 g: ]( g4 M) @$ x' k. X# e
<php
% q" {! G" m$ x! xnamespoc_e AA\BB;$ i1 _% h6 {4 c1 C1 |7 I
functio_n showInfo(){
0 D! l/ M  _9 P, |    echo __METHOD__,'<br/>';
9 H) d2 T$ |# m0 ?9 Y5 I}! L6 @% s4 I% n1 J0 j$ |
namespoc_e CC;( g" j1 F) m6 t+ |: |
functio_n showInfo(){+ V, o' R: F$ V% r
    echo __METHOD__,'<br/>';+ B/ y3 K; `. u0 E2 ]) B
}
& z& S4 V! ]7 J" _: Dnamespoc_e AA;% b: |8 p' y  W  @- D& y
functio_n showInfo(){
6 Y0 j. [; ?0 w, d( c    echo __METHOD__,'<br/>';
( j, U+ W$ Z+ d, }}
# p) F4 R6 i; ^5 u, {/ R* T//非限定访问:用于访问当前空间中的成员# a7 O1 _6 x# W8 D. ^6 R
showInfo();
5 P$ D( L2 T, {* Q//限定访问:只能访问当前所在的空间的子空间中的成员
% o' d# U* p" E' {6 d* U& OBB\showInfo();
( b1 @( p0 g, u: }3 J8 I3 d//完全限定:可以访问其它所有的空间的成员
  N: W) W- o5 m: @, X, G; t5 j. `\CC\showInfo();+ w/ Y$ p: U2 D1 b
↑根空间标识符/ W1 [* s  o+ f: [* [  k1 I6 I0 A. H
----------------------------------------------------------------------------/ V: b% G/ `! G2 O/ S5 Q
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
: D- p3 `5 u7 d* V7 I# p  E( E+ X, ?
. E  ^( f; L0 Z. s8 N2 I" ?3 X4 A9 B/ q当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
. w7 F& @! G! \; B. n' Y! z( V/ V
2 m$ X2 `* X3 @! @- n1 u% g代码示例如下:3 |) ~5 {' P& i+ C+ c9 O$ X+ l/ W0 m( i
9 C* v! d$ c( j0 `+ p6 r
----------------------------------------------------------------------------
  ^  ^# O8 v! q
* }4 w5 F2 F/ s+ T' M3 r9 O( z- H. k1 Q6 r; d6 Y, e$ j
04inc.php
0 D3 x# e6 t- o8 c, V. l) j<php' i0 w9 Y( J+ W6 D- n# ^

9 {# O+ i0 l1 j9 [* {+ O/ {# i4 X0 znamespoc_e Core;8 i4 ~+ y* H7 `, x5 k
include '05ou.php';
7 h8 a7 j' r$ f/ @+ K' n$ snew \AdminController();. i% A" T. B, h! I/ R* Q8 ~5 y" d
showInfo();$ t. b0 Z' N& n3 n
3 k1 V6 k  M' Z# @5 |
echo P;; {  c  Q; x4 l- O1 f
//根空间中的成员,只要类的访问必须加‘/’
- Z& E  Q+ P1 G6 u----------------------------------------------------------------------------$ U$ H6 a8 K# Q* k: k- t
) d2 m* }7 o( o% L
05ou.php
  G* S- Z* W8 w$ t. [2 S! T8 i' x<php
0 }+ v# Q5 g- S, o( Z* K% uconst P=5;
5 w3 @1 y6 h3 e) W. V0 @1 ?/ K6 o8 ?& u8 L$ w! c
functio_n showinfo(){. R2 ~( G; ?# S
    echo __METHOD__,'<br/>';' R, _& k, v  p3 \( U
}
) J% H* ?+ u! ~, D: P2 y  `7 M( s/ |7 _5 C; Y  P
clas_s AdminController{
0 l9 G8 h& G2 D- `2 m2 e    public functio_n __construct(){
" p+ r9 e( R) v( |% P        echo __METHOD__,'<br/>';9 b3 g3 l- S/ M6 x/ q
    }
! D# \4 Z; s; e. r4 X4 N0 W, g}
& T1 ?( ?" x: E( D/ O* x' ~3 q& P" }& L$ a2 |0 B  I- \4 c* g
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
! s8 u3 \9 W" D  [5 S8 I----------------------------------------------------------------------------
/ F" p4 k' v6 G! B' T7 D04inc.php
+ Q6 ~$ q: m: n/ j: O<php/ ?" o6 s. S0 n$ g# A
3 F+ P# k7 m: v" h
namespoc_e Core;9 G, a8 ]0 V  k! u
include '05ou.php';
" ?3 _6 q1 k3 m9 mfunctio_n showinfo(){& ^3 C, C5 n( A* t
    echo __METHOD__,'<br/>';
" b1 C; i/ g9 K- c: b# j. L) A}) e, Z% ]) ?% Q

9 l- l) B! k) Z. U! i5 K5 x* S1 nnew \Controller\AdminController;
# y; d* X. h$ y) E7 w# p( n----------------------------------------------------------------------------8 I5 a$ E' l% z  W8 t
05ou.php( R5 E- L2 a/ Y( L% A& A' L
<php
6 t( ?  e  v' a0 onamespoc_e Controller;) {- o& x: \; w' c7 Y/ w$ C. B

) q4 q4 \5 ]6 C5 ?3 s) B  Kclas_s AdminController{
( t2 E, l; L5 G9 H. ^        public functio_n __construct(){6 e$ |! l  T1 U3 W
                echo __METHOD__,'<br/>';
2 F8 l! L! u# N) D% v. W    }
! c6 A+ l% ]& [0 S}
) h9 `; j, L1 u----------------------------------------------------------------------------
2 q* g. a5 H( C7 u) m, {0 x
9 U1 f/ M+ z: n: r" f4.引入空间成员:. y' n4 B4 M. S6 a" @; f/ W
8 f' x% f0 G- d+ w$ @! x
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。; Z! ]( N4 T$ ?' I. P) \
" @. F- R( Z' r# u! P& ]$ T3 l
----------------------------------------------------------------------------
6 R; S. Z4 c+ `8 C5 q7 b( J8 t" [4 ?
04inc.php
% Q& z: O5 ?2 ^% p% i6 k<php/ n, _4 m/ ^2 S. M8 T
namespoc_e Core;
' f0 x" b* E! O8 |use Admin\Controller as con;
$ q3 _# O  p( s6 L# M0 U* @/ Q$ V9 J! I' \7 Y9 f0 q
include '05ou.php';( ]9 Q! t) N4 T6 Q
  v& N2 ]. [4 R6 h% M
new con\AdminController();8 G8 m+ s& z$ J7 |/ p2 N
----------------------------------------------------------------------------, T% T4 O* x' j
05ou.php( J2 @' ]# L; F$ Z
<php3 Q3 P' B  m6 }2 @* O5 p- x
namespoc_e Admin\Controller;1 U- L9 Z6 S* _: U6 \  O$ o

: \# e9 x+ L) w; J% x- qclas_s AdminController{
1 Q- Q  ?: L. h% E2 l    public functio_n __construct(){5 x, L) I! t$ l' y0 g% j# X* ?
        echo __METHOD__,'<br/>';  [4 T8 C7 Y; f6 A, r. m5 ?
    }; c7 f+ t1 a5 S0 I
}
& ~' A6 C) y; Q! l) l----------------------------------------------------------------------------
  V# U: }) W5 d1 W7 m  r  r; e7 L2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。% C, \. [) V1 W- l6 }, P

# h4 O0 I/ K+ U5 [* c; `----------------------------------------------------------------------------
& Q7 n( L3 Q- p, c7 h* p1 R: |3 j6 a3 B% g% M; K2 ?! N2 s
04inc.php  Q% [: Z( I# }: V
<php
+ K9 m$ u7 A$ s% r% p  T# K5 ]1 T//引入空间成员类% R' u% r) w$ o4 c3 h

" Z! W3 k- X& @; ^# g- nnamespoc_e Core;( A1 k0 h$ U* G. V0 y7 a7 m; ~
use Admin\Controller\AdminController;
( f) h" z0 ~4 n7 l1 G* \: a2 Tinclude '05ou.php';
/ Y( Q3 t: `8 {7 A+ V- F* ^/ t& [3 J# J  b9 A8 b
new AdminController();0 y: q' E7 v+ m+ M. C& F8 [3 k* T
----------------------------------------------------------------------------1 h& m# p: T, @% b/ j$ m, t, B
05ou.php( y" ~6 i) [% Q. Y/ Z
<php% f( `" @8 o, g' E$ C7 i6 h; ?
namespoc_e Admin\Controller;
) l3 y. z8 h0 f, k0 i( v' s6 z+ d, r/ J- j1 i
clas_s AdminController{) }, v* }+ Y) x' M2 p
    public functio_n __construct(){
- u; v+ u" X  k3 X/ D$ P4 e        echo __METHOD__,'<br/>';
4 e+ P$ X2 ?) F! |7 h( t5 g" [; b' H    }( n4 p7 w) k' j( D
}
: P! ]: f$ u# T1 x+ m3 w) _----------------------------------------------------------------------------
7 X. E5 _( z4 K% D. S0 i9 M5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。3 E7 p# e3 N# u" U! v' v/ v/ h
9 u3 J! ?' o/ D0 \' J- D' e& Z% ~

8 _% N2 L3 b! R4 s0 Y这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
, _1 r6 q  R9 V8 F4 ?. n
! a: U) V; i0 M# E1 P7 |0 y3 F1 ~# M+ P% M7 r  o

( n, f. p' X/ }3 q! ?, |6 v
7 g3 U0 S7 N& M
# C) q/ y$ C  p7 }) }( ]2 j
& \9 F4 D, e- X+ j2 g9 J" f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 14:00 , Processed in 0.060858 second(s), 23 queries .

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