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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:( i9 _7 }' j* {, K  W, C

; V/ U6 _, b* F9 f, _, x在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
6 O/ `1 t3 _# C, v
# o  @, i( D' M$ [
9 R! G1 U4 l/ c' X$ F- s
2 O+ ^% W( {: m& q# S4 V0 N  f5 y我们来详细的讲解一下PHP中的命名空间:! m" M4 e5 J! m& ]/ g; n& j$ k
1 y7 m3 }& S( w. ~% T
语法:namespac_e 空间名\空间名;
. P; O$ ?% N" P- F7 g2 n1 X; W6 M
! m$ i: B; q1 F* q3 I" ~说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
5 Y/ x. _. |* y9 [; Z2 r. v$ \" [4 D' U! O4 |' [
----------------------------------------------------------------------------
+ p9 y6 B6 a4 p, G9 A) d6 {+ U& s- o  W- z  t/ c
<php
- V8 S0 Y- }8 b* i# C
/ D; w! Q7 o, [namespoc_e AA;
; F& [, s6 t/ S8 @* X( X# N# ^+ y6 `& lfunctio_n showInfo(){! W- Q' e5 p2 ^5 b) I
    echo __METHOD__,'<br/>';
- X6 z/ m4 c1 x: v. w  m$ C; A}
1 P$ p8 [3 r6 J3 N) l1 ~showinfo();
) v  Y) U- ?" F3 f5 G$ W* I( F1 b+ F* m, y! Z+ P0 L  A- Q
namespoc_e AA\BB;' S5 ^0 k3 E( m' m, ~
: d; R7 a- ^" q) e3 e9 p" U
functio_n showInfo(){/ V  w7 f7 K+ `
    echo __METHOD__,'<br/>';" e4 s0 O4 V3 S% m( @
}, C; m# B1 E+ Y8 }! v2 N  N, |
//showInfo();
# I* Z$ t' j# U( j----------------------------------------------------------------------------  Q5 D0 N2 _) l
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( }/ G! Y5 z6 r2 A1 C6 L, y1 Y, v( {" z8 r8 g! Q. u0 P
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
0 Z5 e$ a4 m4 k, y* t( D
" D2 p' s5 `  f+ \% l5 V+ \; ^----------------------------------------------------------------------------
0 O  M+ Z. F  F6 Z/ H$ Y, t9 T. X& u. G
<php
; b2 z. g3 \* i( z4 ~namespoc_e AA\BB;
# ], q$ g8 V. `functio_n showInfo(){
6 @7 x1 A0 P8 @: Q& T$ O8 S+ [    echo __METHOD__,'<br/>';
3 p/ [, Q& S' r5 D$ ?: e}/ ~/ h' o! s- a& F( k% C* h
namespoc_e CC;
  I; A1 d1 x+ ~5 |8 i" @functio_n showInfo(){) f3 |  h! `) u6 c0 ?: q5 C
    echo __METHOD__,'<br/>';: A: I( H$ Y% E# M! [/ a
}
) e6 ~# z+ C" b0 u& jnamespoc_e AA;
/ K* z+ z% V& Bfunctio_n showInfo(){( c( j0 f3 `  w: C4 r8 Y
    echo __METHOD__,'<br/>';# `% X# ~/ v; l: j* r; ^
}* |! u1 I' P6 _) p) w! h
//非限定访问:用于访问当前空间中的成员; W" O! e5 g1 u8 t
showInfo();
2 V2 b# O, s. Q% S//限定访问:只能访问当前所在的空间的子空间中的成员6 b# U9 ~  m) n0 I% q# n$ s  W
BB\showInfo();  v7 y3 e& Q6 C
//完全限定:可以访问其它所有的空间的成员# Z( X* C+ h. M- N6 g* H8 R
\CC\showInfo();0 {1 m+ U% e% B( \2 a9 w
↑根空间标识符
1 l% R" e3 V6 ?----------------------------------------------------------------------------
* E; k! L. ?2 N- d# S" t; N但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
' T1 U; a5 M1 C
0 Z6 Z6 M  g# C4 \, s当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
, E! Q* a) j  s$ |' I2 W4 ^' G
* T% s3 b9 w- r! H  |) ^代码示例如下:
/ z/ K* M# M# }
: ~0 a( b6 X: ^' [2 e7 d$ ?----------------------------------------------------------------------------
$ ~' Q4 u3 e0 R" K2 M$ I" z- ^+ B! R+ A7 h. ]  ]& r3 [

% Z: e1 |9 v  k/ p1 A2 f8 ]04inc.php# l" ^8 X' B3 \3 i% M% _
<php% y0 U# u/ _% P, V

- E% y, f" w7 S- unamespoc_e Core;' M; Q4 O8 X0 U  Q
include '05ou.php';
  s' s6 Z% p) f( W! H9 ?new \AdminController();
8 _& `1 f- ?8 u+ D6 ~7 O+ k  UshowInfo();
" j! z7 ^0 U0 X; m. L3 f- @9 {3 a/ X/ V: \  s- X
echo P;
7 D% N, G+ r- @$ A" C# _7 O//根空间中的成员,只要类的访问必须加‘/’& S4 d2 V( e, K  x: X, N' m
----------------------------------------------------------------------------
6 z$ L7 x* f! C. ?1 n  r7 C8 a% c4 e
05ou.php* d  O5 q5 o, V% G' {0 t
<php
3 i6 d, U2 r! y7 K! c; qconst P=5;
9 {4 t9 l8 z7 V/ @9 [' _- E
. Z9 s; ^3 @' o$ k! N7 ifunctio_n showinfo(){
) r3 a- X* _' ]" T$ A; W- N$ A+ h    echo __METHOD__,'<br/>';
! L2 f: o" T1 V# Y}0 a$ l' P, [8 D' K% {( d4 z
1 ]0 p  i2 X( Q& B! d+ E
clas_s AdminController{
" G* b( T7 x$ W5 [  F, Z+ z6 D' I    public functio_n __construct(){% _- v" n) _4 O1 {# g
        echo __METHOD__,'<br/>';$ d* x& {: d5 z
    }* p4 D' @* Y( m( r& b
}
5 @, ?! U  K$ ~' F' L8 ^: U/ ?7 \# ]! W; R. {% Q" i
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 j  d1 c) y* ]. j& A; D+ k6 B/ W
----------------------------------------------------------------------------: Y& M3 ~4 p  d, ]' ^( ]
04inc.php
& F: K3 n9 D/ G3 @# a<php; L; R) ~" U# f' G0 ^: H& @
* i/ ]+ c3 ]% d0 t( x) d, U+ m
namespoc_e Core;  i' V& f, L/ [
include '05ou.php';
) V3 R" p  F& k. Nfunctio_n showinfo(){3 }+ F/ r/ `+ k# H
    echo __METHOD__,'<br/>';: ?1 `' z8 @+ O4 W
}! E: y: N5 s! t4 ~% ]" j0 V
, P! r& q6 A& Z8 Y
new \Controller\AdminController;
# @7 @. t+ o8 j----------------------------------------------------------------------------5 \) m- p3 `, ^8 C
05ou.php
$ o( t; o1 F8 t) _& F<php
" M6 C6 N9 P! g' j: V) cnamespoc_e Controller;5 L* d, q  G9 j- x0 \6 j

" s' C9 ?0 E/ ^" iclas_s AdminController{" {. U) x5 P  C* J4 z- A& r
        public functio_n __construct(){
$ H. s. h" I  A( ]. Y2 L                echo __METHOD__,'<br/>';
& r6 l$ t1 x" `& K    }7 |* q/ ]5 e2 T
}% r  ^# k2 c( d8 l9 g* Q( A
----------------------------------------------------------------------------2 a" K# K3 i+ r5 D/ l6 S, u2 H8 T

/ M, f  Y$ P9 F& J: y6 n8 c/ \4.引入空间成员:* Y! V9 c. n% j5 [  @
9 Q! g$ ]$ R5 i
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
9 r3 d4 @1 j5 {, R# a! q' ]3 a2 F* u/ \1 S4 {" [5 e
----------------------------------------------------------------------------0 i1 R$ B0 ~$ R& I( D, B
4 t* a8 i* {4 S- f
04inc.php5 @* u  u- m: M* `" F
<php! F8 _- W2 K+ b7 H5 p. s8 p
namespoc_e Core;
" i) U  q& U, z; s' ?use Admin\Controller as con;
, O: B* a. e  \; {1 h) e4 x. w0 [/ L; ?7 O4 [* [: e- p4 e9 r
include '05ou.php';! R* ?% O  p, O5 i( W' f
- A2 r  p; B& t  L3 \
new con\AdminController();2 p1 b$ U, E; U. \- K  M7 @
----------------------------------------------------------------------------  ?1 h9 z$ _. W  `
05ou.php
$ B6 @" g3 K0 U+ ~8 F7 Z1 S' }, U<php0 d& n& h: H3 `9 W' E
namespoc_e Admin\Controller;
* @: o4 r  J8 a7 S. k5 K: K# ]# T% F/ `0 T4 K# ^& _
clas_s AdminController{
" \% y: {; [% e5 O    public functio_n __construct(){
$ R: _; I% g; e/ J- G        echo __METHOD__,'<br/>';
  ^, D7 k( A. x* h# j4 [    }+ W/ ]+ R1 i( B1 S: Z2 ^) i( _
}
# U4 N* j# {- F' i; {, W' u----------------------------------------------------------------------------) N* g6 L. f& J7 V  B
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。8 b/ V0 }/ \8 h7 f
& M) _: e0 v) ^- Z: W) }7 L
----------------------------------------------------------------------------4 j  u) \5 H% I7 p! R
9 H7 a. E, m# e+ R/ F; ]# y' s
04inc.php
7 I- b# W) a" c<php; _! M  V1 N5 U0 F; K, l
//引入空间成员类: c, c6 e, Y4 L
/ a& y# Y! |0 y% L. k* b$ a
namespoc_e Core;
/ O' u2 I0 \, r  Y8 ]: guse Admin\Controller\AdminController;
/ c1 ^9 }% `9 E$ Winclude '05ou.php';! u, O3 N" t3 m' e3 a

- n6 T  O) i8 W" k9 e( J2 Nnew AdminController();
0 U) Z$ b. A) G9 K  k----------------------------------------------------------------------------
; |6 q7 x2 S, A/ t05ou.php4 t2 e* }3 g" e9 [  i. F
<php
! R9 \7 [) `3 O! H% Ynamespoc_e Admin\Controller;
+ l7 Z8 b7 {1 H' n( k& {1 F$ R! @2 C: ]& u$ R
clas_s AdminController{. _! g* I- w! v. t. L
    public functio_n __construct(){
6 }+ |+ d$ f8 v0 u: V( ]; V        echo __METHOD__,'<br/>';
. E  N1 r# c3 P& N1 g  G- O" j    }
3 D# U" w- ]0 z) ^  I5 p9 c}: N5 J; i: @8 Q$ x
----------------------------------------------------------------------------
  q0 q3 G) Z- S* m5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: k6 Y. K5 D* U, T/ d1 t
' ^" P! T  g/ _: v- t$ @2 Z( l! a- s. t
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
) @% _/ l- `( k6 m5 T/ s3 ~4 }# _! ]9 r0 U: C

/ W, L+ x' A0 Z) X# ?! C7 C) r, y2 @  a# J! }  R# U8 W& i9 P

9 E7 c/ @0 h, }3 p  Q- A4 @" d" N! S/ }9 R; @+ V: v

" a7 ~5 h. T' P' B  U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-24 20:05 , Processed in 0.130367 second(s), 24 queries .

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