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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:& F: u7 V- l9 |" O) `2 [0 v

) G5 N0 b0 o6 e! S1 F) n  K在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
* Y2 a4 T5 X- i$ n3 G9 Y8 ?/ U1 Z: P( t+ r4 r2 D# S

. L2 \: F: D" a5 R) @: A( ?  h+ U+ t9 Z( [
我们来详细的讲解一下PHP中的命名空间:9 y, R4 j6 _! J2 P2 ^, a1 R* K

5 M. ]+ n, J9 t' k% ]2 {! C语法:namespac_e 空间名\空间名;- x; F) M' M" I1 \# x0 ^

5 b0 c# \9 ]: Z8 o  J5 W说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:, |4 ^& |8 R/ G2 N* A3 {( L( j

$ W+ @9 o# ]  `2 }: ^4 |- C----------------------------------------------------------------------------2 J1 ]/ A& N0 h( ^7 d

4 ^5 [+ V4 C1 C$ i$ A<php7 ~: S* F! P" ^* V" j
! y/ U7 @2 s: e4 a) t/ }5 c0 L
namespoc_e AA;
1 m! x8 I9 }6 a! Wfunctio_n showInfo(){/ ]* ~' n! G  g
    echo __METHOD__,'<br/>';; d! b7 H, `! ^; f* _2 |
}: ^' H: c0 J  P3 J
showinfo();2 M/ @! d7 K4 d# X3 q

) y: Z% S) \( o! x9 D, r  anamespoc_e AA\BB;
1 U; o8 b0 c% b$ o
9 A( P3 v# b. C' Q+ Y% N/ `! Y" B; \functio_n showInfo(){
' i" F$ N" v8 g/ u, c, c5 C    echo __METHOD__,'<br/>';
! }0 l  f8 Q; Y}" b1 C9 }. J0 i. i! _4 w) O( L
//showInfo();
& z, F. O% B7 d7 r. R( m----------------------------------------------------------------------------2 k- I1 n6 F- m  ]3 V
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)9 O6 o" x/ {& g3 W4 B& o2 E

: c, v# R% A7 G$ \2 L/ p0 ]- n) Q3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
& f5 t5 w8 ]+ [+ j9 C- |: |% g2 Q3 Q( |9 A$ V5 y3 t/ }
----------------------------------------------------------------------------
& I& E  l# w" r  A! b' g
" c* |6 f; g1 T$ n& Z. [$ t<php' S$ g5 L$ G- K# x: a$ Q& ~
namespoc_e AA\BB;
: E  U- m& g/ L/ H4 {4 i" Pfunctio_n showInfo(){
1 q: P" i! n6 h$ j& M: U    echo __METHOD__,'<br/>';
' _, i# x  l4 u, [2 m2 R; L& Q8 f}
' S1 V* ~$ q9 \  @- G; g; fnamespoc_e CC;1 k& o; w3 s* _) ^- ]8 r& }; b
functio_n showInfo(){
' i7 d3 \( v" n( C( }- ]    echo __METHOD__,'<br/>';
; w" k7 ^- I2 X- p5 D* b* }! i}
3 L9 N: ?+ L+ C, _namespoc_e AA;3 J$ [2 k% a0 S/ Y" ~* l) m
functio_n showInfo(){% [& W# h; X3 P! @+ y
    echo __METHOD__,'<br/>';
4 p1 W) v; T! B/ P5 B}
4 G7 V" Y/ B9 S- n$ H! g//非限定访问:用于访问当前空间中的成员
8 e  M  O0 K2 s0 s4 z4 ?showInfo();+ W! s) n) U# A- ~
//限定访问:只能访问当前所在的空间的子空间中的成员
. W# b( J, o" \2 ]( uBB\showInfo();% Y0 X) z7 {  y: M& z8 l# i, ~
//完全限定:可以访问其它所有的空间的成员
$ }' p5 b0 u) Y6 R; s/ `\CC\showInfo();
( a: R% X# G4 s/ I. T: d↑根空间标识符% Z: c; h' O; v; s& @0 w1 A( w; v
----------------------------------------------------------------------------
7 x" r2 X/ j" C, y7 }% M6 _但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
4 `1 E. Q+ F7 ?* W& ~3 ~/ D4 r( a0 n7 P2 M1 ^. r
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)6 y5 n$ X; J. y
" ]2 W* X! g+ u0 T* n
代码示例如下:* h2 G4 ], N5 p* w
9 v" J' ?' a; F6 G
----------------------------------------------------------------------------4 W+ t0 h$ _: y6 U$ B

, R. p  b0 b( j  L& J. C7 `9 j; T9 F) r1 v
04inc.php
1 z. O0 ~3 B# x" B( M<php
2 L8 o+ {6 x% k$ Q# q' @. @  _" a) v* V# Q  w( P
namespoc_e Core;
6 \% c6 ?& G6 k3 t5 Rinclude '05ou.php';
: H+ |7 `  X7 U- R1 ~" b$ `new \AdminController();
9 O7 f4 t. R, C* a) }showInfo();
/ ]$ a% i$ K, t$ H( t
2 Y3 P+ M% ]* o+ ?5 F# g: Hecho P;
. C( {6 x! n$ ~+ l//根空间中的成员,只要类的访问必须加‘/’
0 M% f4 }" _. Y0 c8 Z" O9 O$ o4 j----------------------------------------------------------------------------3 U0 g  |  r( H- ]

2 D2 [) i5 I* m- |- q; ]05ou.php
2 a4 o+ O; H9 j7 `& T9 G- Z<php
# ^0 Y- b# L5 t$ c8 |const P=5;
+ {. ?* N, U1 U4 ?. [$ ~
# r! e+ d* ^6 @* R" [7 }9 Zfunctio_n showinfo(){
0 g2 ]( h$ z1 `( _. v3 n* G/ Q    echo __METHOD__,'<br/>';% @& T  ?) ^" u! v+ }
}
8 a' G4 e1 ]; ~. w6 S* O5 D4 ~
( H. F' |- @& Rclas_s AdminController{# @/ u+ X2 O1 K( [( e! V7 \
    public functio_n __construct(){7 J3 C/ P) U# A& Q  s) k8 V& G8 @
        echo __METHOD__,'<br/>';) K( ?; d& i. n, P$ k9 I0 P
    }, S1 \7 h9 ?7 u* F: u5 B
}
* Q; b; m  f7 @  ^, h2 I5 R2 l# Q7 x% f8 G" K4 j' U
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。+ l( f* {4 _* S; U
----------------------------------------------------------------------------) U! `1 f; ]/ |
04inc.php2 w" R9 `  g: M4 E5 Z
<php
* E+ o, q  g/ v! ]1 o2 J' h. {+ E5 q8 x" f2 \6 ?5 g4 p
namespoc_e Core;- g; Q2 F/ e5 S' R! G( t
include '05ou.php';' D& e' Z; P$ `" v4 T
functio_n showinfo(){
+ D9 |9 r; n# I# z7 z0 P  N    echo __METHOD__,'<br/>';" p  l( C$ a+ ^
}
1 ?  I! s+ N- q) e) f) c$ K0 n8 q+ _! h: A# x& f2 E; r" k  L5 P
new \Controller\AdminController;$ L0 O# ^% p9 B
----------------------------------------------------------------------------
5 z2 P9 f) d( k2 d! i8 D4 C& Q" k05ou.php( v5 e0 S/ a3 E
<php1 ?3 \7 @$ M# i7 c' c* H8 j. \
namespoc_e Controller;6 ^, T$ n; o) C3 s5 X) q
4 w, X& T% ^( {
clas_s AdminController{
0 d. R, U: s. C! j& \        public functio_n __construct(){% p. V5 H* _( z8 q; y
                echo __METHOD__,'<br/>';
/ J7 b/ c$ A3 q5 v1 F: ^& B    }- ^- m1 H7 z6 I* K# S# t7 N# O
}
) p5 b0 j* w6 d; T+ w3 C8 v----------------------------------------------------------------------------3 i- H3 r! Y: r; |8 D

/ f2 _; t+ k0 I0 a0 q! j8 H4.引入空间成员:
3 ?3 B; `7 N, m0 I8 ]3 b
0 |8 g9 q* E! a. N1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
8 I+ p5 A) o! a% ?, P  g0 ~" K1 m7 p" {6 q/ E# M. W( p2 ?
----------------------------------------------------------------------------
5 q& J& h% B  E, Q0 `1 B, G- Z4 z
( {1 k* I, Z5 Z04inc.php- X+ P8 {% Y! e7 {
<php* C- y% v7 A) ?$ D0 j- X& ~0 C
namespoc_e Core;' G: |9 K9 T6 F/ I9 e, e
use Admin\Controller as con;
; T2 c) c3 _( t3 o; \5 y  N
3 ?5 T0 _, @2 s# n$ F, U# kinclude '05ou.php';, F+ b* ~7 X( Q2 M, T
8 J: u$ ?  \( o9 [& y  V7 R. V" H5 D
new con\AdminController();
# {* Q5 O8 u( s! y! ]----------------------------------------------------------------------------7 _( P7 n0 F& m3 Y# S2 B4 z
05ou.php
" a& l- @6 L* G! h, C7 M4 u<php
# V& A  }8 X+ v1 G* k2 C. wnamespoc_e Admin\Controller;5 ]' w; M' Q0 X
  E8 M. U' U' M7 O- R5 Y
clas_s AdminController{1 T8 s- u5 P' T* K0 G
    public functio_n __construct(){2 y' S! I/ g. \$ Q- t% P
        echo __METHOD__,'<br/>';
' Y; |/ w# d* T1 Q' z9 K/ B# Y, G    }
# o& m' b7 U3 y0 V}
+ C6 F/ h# M+ n% Z! @; l$ M) K----------------------------------------------------------------------------
, o5 ]/ X7 P0 ?, |8 m- ~: F2 ]( H, _2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
$ H/ h) X) G# r/ K9 K7 Z1 ?; f% c% a. B' d
----------------------------------------------------------------------------' g3 }3 ?  A4 O9 T

! C1 I: _/ C3 L" a04inc.php- [6 a( N* w/ G7 c9 Q; l/ D
<php6 s2 s; P$ G" F  L- G6 v
//引入空间成员类
# t% ?7 j4 v& {- a0 E& V8 d9 Q5 G9 y' e, }/ O! s. ^, r" A
namespoc_e Core;, ?# [, e0 i1 a- |/ T9 p
use Admin\Controller\AdminController;
+ n9 T& G1 I7 W0 ?! l; Ninclude '05ou.php';; B) R. |$ k+ O* f% [

" |; ?, y4 }8 r7 lnew AdminController();
2 O8 D4 K$ J  ~) J----------------------------------------------------------------------------- o" [1 x! v$ h8 r) h* r9 [$ b
05ou.php
! S! r) n# Z7 i. E<php1 r; E9 p! v% Y: x+ N& j! m
namespoc_e Admin\Controller;, p4 s% @9 \& E7 r

% F2 d0 Z* E2 k+ u2 c, jclas_s AdminController{
& z  ?) K( M" G7 ^    public functio_n __construct(){' B, \% z% {' h/ Q$ H
        echo __METHOD__,'<br/>';+ b& L* V2 m3 L
    }. i- h: o: e# i  O3 O: u
}
# s" r: ]! F9 ?" _6 B7 f$ o----------------------------------------------------------------------------9 p8 K% O' P3 K
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。9 ~9 a/ Q2 F. e

& J) U! I. j; H% e; |4 s* J
; e$ s  x0 p% _$ q' x这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。& g( u: o. P& M1 `' E: v" B* z. W
3 \5 h7 o' `" K5 S4 s9 ]

9 a# T  A  J& G  R8 b; [- o, K3 M9 q& f5 y: H8 G9 s: P3 B
% ]/ L0 k+ W7 b, X% A

4 O0 P2 l, q9 }# [9 C/ Q$ d6 b% C
* D# a- I; U. `( _% k8 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 16:46 , Processed in 0.059385 second(s), 23 queries .

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