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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
4 X1 b* I5 w+ V3 H$ O: T7 }) R0 y' p' f- t
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
& I, _8 j) O. M0 h* y5 m! d0 i
: ], M) f# x* Y- G1 k4 r! l( k3 M8 ] & o" j, ?0 y/ H* Y! V
* L% N6 u& n9 W; R3 D( J
我们来详细的讲解一下PHP中的命名空间:. r) s4 B% V, t* i9 {: p7 B

  W5 t: c1 d- T% }7 u* d语法:namespac_e 空间名\空间名;% P  `+ M/ @# ^4 G1 ?  o& z& @

9 E9 J, N; e. O' T! ^说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:5 c# j3 ?* R* E, p) A

/ F3 B7 i# D% R6 d% T% ~----------------------------------------------------------------------------
$ f- v% Z9 v$ Y0 u+ E  b1 Q
! l' ?2 R* l. ~, l9 I' q<php! E' ^, t2 u/ j0 e9 Y

/ S0 x9 U; ]' u2 B& }4 snamespoc_e AA;
3 \0 x( {6 E+ E$ N' p+ L( J8 ^functio_n showInfo(){
% i$ R9 }4 X3 C7 d    echo __METHOD__,'<br/>';
3 R5 v, i( t7 I4 M}
) \, C  {- p- h$ H, G6 ushowinfo();
) O+ Y* g0 p" y9 B+ a
9 I' i% s/ s+ E1 _9 Znamespoc_e AA\BB;
) A0 v6 g6 I) R& X
: |: R0 V1 x8 W' s* Ffunctio_n showInfo(){
7 I6 [' w  B- i. c    echo __METHOD__,'<br/>';( L( J" K; {5 E7 `/ t
}
3 k4 S! A0 Q* E! J//showInfo();
. U3 e1 i, J! B+ D; \: s----------------------------------------------------------------------------
/ l. ^+ L. R; b* P) K. K6 ?2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( D; P( f+ W5 Y; D* d7 I/ a8 ~5 P
+ M0 E2 A$ \, m3 m+ W: ^3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。) M* W2 e6 f; O2 S: U  b6 }
* ^$ T& @  N# w% B
----------------------------------------------------------------------------3 q& Q" \* U2 c1 u% o: o' {6 \
# T& s" ^1 m5 d. Y" @! J8 B
<php
2 O) f/ x( Z: E4 _! Gnamespoc_e AA\BB;* P, F/ u# B2 k4 Z
functio_n showInfo(){
; E# W4 Z( U4 _& W. T& ^; u8 e    echo __METHOD__,'<br/>';9 `! v% B/ H* B) S3 f
}, B7 b# H% U# [: G5 E, n
namespoc_e CC;
2 n! Z! L; Z0 j+ i7 Wfunctio_n showInfo(){
4 q6 r: x+ D6 z+ o. Z5 x( S; }    echo __METHOD__,'<br/>';
; ^' i# O( @' V}1 `, s: S0 }7 T- \- w+ b
namespoc_e AA;9 @1 g9 U. q4 U! k) t
functio_n showInfo(){
) {: w, T% M7 \' l    echo __METHOD__,'<br/>';! n. U3 k: m0 a# v; ?. h5 I1 {
}+ \5 w# h  J! o1 e
//非限定访问:用于访问当前空间中的成员
7 `! l0 f2 K3 ~) B# w4 yshowInfo();$ }& p! }7 B$ F+ x
//限定访问:只能访问当前所在的空间的子空间中的成员
8 Z0 G# L+ q& U0 H  B2 uBB\showInfo();5 c; Z' K0 I0 o' k' I1 ~, q
//完全限定:可以访问其它所有的空间的成员
! I9 y; z; l% c, y\CC\showInfo();
; K( P$ K3 ?. P$ }7 B↑根空间标识符" M- p$ O1 F0 D5 c, j1 Z8 B" l
----------------------------------------------------------------------------
: S0 L6 y, Q, d' v) _0 |但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:3 v+ I; q0 L6 n3 N; v$ w
, r7 C, S; B) z2 b
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)% z* z- R9 \. T
$ {5 W# U( N' l! k/ C- o5 a
代码示例如下:
% _. `- q& z8 U3 Y9 J" y
  D& }0 R" I3 R5 ]& n1 I----------------------------------------------------------------------------! C6 P/ M. I  P. f% N0 O
, }  K7 @( N$ A' y& O

5 I( T5 b- w$ Y. J04inc.php
7 T& d3 g7 o; U( u5 |. E<php7 E- y2 A; }  R% i+ t
2 o" m/ R# p/ u+ d* Z8 o
namespoc_e Core;
4 ]- Q) S, e$ t6 {+ C' ninclude '05ou.php';
  n9 ^: k8 h! Q( p& I- onew \AdminController();" r+ G# |2 t0 n$ s
showInfo();, C" R! T, W2 j) M) i4 ~5 g' j" n

1 v; K6 R; a0 G& z3 J& Decho P;
% M* W6 R" F% H9 }2 L& l6 G//根空间中的成员,只要类的访问必须加‘/’5 p2 I* H% |$ f! Y& |* ]2 f/ z4 x
----------------------------------------------------------------------------% y8 l+ `2 L( o6 `( {

1 I( c& m1 _, S05ou.php
7 J7 V' s7 _. q3 q' j<php/ F6 G5 F. U/ g
const P=5;
$ n/ x7 C  Z$ o- p7 t  D/ L
  q: I5 i. E0 pfunctio_n showinfo(){
6 R: U5 J) K+ u* T$ X! z, W    echo __METHOD__,'<br/>';
7 W) @. f3 Y6 T. r0 z' ]  a}7 b; ~9 ], K  {; Q4 C+ [+ ]

3 [- ]! t  c9 Iclas_s AdminController{
* |- h3 F3 S2 U    public functio_n __construct(){7 W5 v& ?9 ^5 E5 ?0 c: h
        echo __METHOD__,'<br/>';
* S0 a- c- C/ _4 |# E5 o& }    }1 c" m; m/ u. F4 ~. x4 V% B2 j
}
" W" O$ x# Y/ p  Y7 b
4 b; q: ~( y3 k) Z0 x+ N第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
. b; p6 _$ S% y% r# N6 {+ r----------------------------------------------------------------------------
( K# T6 Y# k1 y( A1 R3 U  D04inc.php0 T4 U$ ~. B6 U9 p
<php* t# [; H# l0 |- J( _6 A3 P
" I2 n( J. Z3 K5 P
namespoc_e Core;
2 y/ H6 b4 d  e8 `include '05ou.php';/ o% P6 @8 \' L3 A9 t  h2 {
functio_n showinfo(){
( A5 \' v0 h3 x. T& a    echo __METHOD__,'<br/>';
. w: _$ t: q. ?" k}# O/ t0 d- z9 b( ^6 N$ l
/ b# q! Q7 d* }" Z3 e
new \Controller\AdminController;( t5 ~6 }- U4 }$ f, o, Q3 d- ^0 Z
----------------------------------------------------------------------------
  ]4 k- a6 e, z7 P* a8 m6 j  L05ou.php
7 o* K; Y) r  g<php
% a+ L% R' O  @* Q# e2 p( Knamespoc_e Controller;
% q/ Z" }8 b: r9 e+ x1 M# |8 I1 P8 N
clas_s AdminController{
: W( r- W8 v$ g2 I        public functio_n __construct(){0 ]# e4 [( i5 u/ l% {+ J
                echo __METHOD__,'<br/>';
! C& ~' X6 ^% F+ n; u    }
9 t- W1 e- V3 @1 `6 l5 S}
% [& ~4 p, A0 `+ k# x----------------------------------------------------------------------------- |# Z) W0 E8 e

4 G) G6 N3 W1 F* g4.引入空间成员:
/ a  I; [4 l1 |7 `0 b1 V6 I  }2 q1 T  R- O  U* n
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
0 U( x+ [$ s% F/ ^( J
3 u9 E; m' ^; x! _* Z  a$ ?4 A----------------------------------------------------------------------------
9 @5 w* y% O+ D" M) }* K4 S9 e" G: c
04inc.php  i3 @: g) b' q8 _: j
<php. A, Y. {2 J3 \
namespoc_e Core;- O4 b) q5 c7 B' @' c7 N
use Admin\Controller as con;8 S! z) U+ j2 _. L  P" d
" [. ?2 s6 P* M
include '05ou.php';
" D, n3 x; N2 G, u: G* R$ p
# {9 |. H6 F3 z$ v  F1 h) xnew con\AdminController();8 E! Q2 D, {! p  ^. a
----------------------------------------------------------------------------! n0 d) Z" ^! u( [
05ou.php
: x5 [, j! e! e$ e( t<php
; ^8 m3 R! U' ?' d; t8 j/ r6 Gnamespoc_e Admin\Controller;- |# R' W/ {: a6 u6 E* J8 e( N/ @

* N; Z/ v# p$ I0 p. f5 |clas_s AdminController{
$ u6 |. t' E- t+ Y% ^  i    public functio_n __construct(){
1 M# l! D( M# d8 O        echo __METHOD__,'<br/>';
. K/ |" U+ |! d% p- B    }: n& y: E9 g; F, }
}
, {0 l# ~7 E! \7 Z$ `  w1 @----------------------------------------------------------------------------
, Z) M, l/ c- d/ A9 I; i! G& J" {2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
; N& A( k8 W3 a! B9 Q. \
; |. \# S  ~! @3 T9 n; L----------------------------------------------------------------------------
$ d  L: F% |$ h9 _
+ o3 N' ^. p$ d$ A, ]( M2 y3 q8 H; K04inc.php
: C$ o8 T/ A0 F<php% H* l# p" R( h; x  F2 V) `; |
//引入空间成员类' G" s  L/ ~( `: H4 O6 @8 h/ _

9 p  [+ \" m: s% H5 t! Jnamespoc_e Core;
3 r" V2 n6 s! ?6 }1 B1 G/ C5 Vuse Admin\Controller\AdminController;* K$ ~% I( Z: ^7 g$ Y8 i
include '05ou.php';+ \: T3 B. U' }) |0 x3 o. z) L
' W+ X5 N( C5 U6 ^# A$ Z. K* ^: R
new AdminController();6 G1 g# O3 e6 [. }% d" \0 j; h4 R
----------------------------------------------------------------------------/ A5 [0 ^& V+ I  w9 z# Y: W
05ou.php. u3 b- A3 F' a8 n& H1 m6 W
<php
+ l- t, C" Y/ Z) q# C' [* ]$ Pnamespoc_e Admin\Controller;+ ^* K* r/ A" H" \; V: _! E

9 h7 I" s) h% m. M4 U2 Xclas_s AdminController{/ N0 [  z5 r4 D4 f1 p! j' v
    public functio_n __construct(){: Y% |* J4 o- _% y' D1 q$ ^5 h1 E
        echo __METHOD__,'<br/>';. z% s: `( @/ I- i' l, e
    }( U% L' l4 c3 x4 e+ r6 e
}/ i) u" j7 h" W9 Z% P7 d( Q
----------------------------------------------------------------------------7 A7 S; W9 j: c! X* N5 E: t
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。. b/ M! b$ _: e/ M& ~; X# e0 O" a9 q
5 r, \  _8 _6 c& Q! E/ |7 G

" x8 P: }; r8 Z  ^$ z# w这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
0 t& k0 t- ~+ x4 C" [5 f" b  f: m; r; h" g* E1 y% h9 [
- ~. J/ A) B/ p9 m! H
% o, _, T6 O7 }8 w" m- x. {2 \
1 ?* }8 Z  }' S) o+ h+ C8 v

. A% k- P8 k1 I* ~
; I8 U4 _( T& M5 U/ k& M* @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 04:35 , Processed in 0.115973 second(s), 24 queries .

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