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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
% X% K3 O" _" y) ]! e+ y2 U, |) E- c* t" J9 f$ q4 L- n- f6 E9 q
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:8 X# f- @! P, i7 ^; w4 k  p

) }& G$ o, d, v9 v- y; j 5 ~4 U- \! @; s

: \: s/ A# Y' t6 j7 {2 F' m. S) L) U我们来详细的讲解一下PHP中的命名空间:
1 S3 l0 b. U- }& ]' m) f2 G* ~" p* @9 P$ F; a/ r9 A) X
语法:namespac_e 空间名\空间名;  `/ A  g! `# X/ A0 J! c
6 {9 O& U5 K+ D# ?- r$ c
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
: n3 g# i& d; c, {- f; \, P$ e7 G+ Y- e/ {
----------------------------------------------------------------------------" f# K. g" H- j
% R5 k" X$ z! ]4 g5 L9 K3 I
<php
# D" L( p% u3 C: i2 x4 X% j6 @; H5 ]) o2 Q9 ~
namespoc_e AA;: Z. Y5 _1 |- G0 I# y/ J/ Q
functio_n showInfo(){
/ r# _* D# R# s! l, @    echo __METHOD__,'<br/>';
; @7 ?5 T& O4 `$ D4 V' U# ]: ~}
- C/ B5 |9 P+ j6 {% g9 @showinfo();1 {, H- r3 W: y

0 c7 }: c! [% \! w  G8 Xnamespoc_e AA\BB;
+ }; T4 J* _: I9 }. v
& H- e2 D0 S7 ifunctio_n showInfo(){- [3 Y0 y- a; L
    echo __METHOD__,'<br/>';& i) Q" P2 q; |0 ?  f# q
}
- L6 |7 _: q9 E+ ]% A//showInfo();! `9 A( W5 A7 Q; i
----------------------------------------------------------------------------
9 I" i; @- W" F4 J2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
* G* e  C! d0 j5 Q
4 V) E+ i/ D1 A+ y0 m" R3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
2 {4 v4 z" l6 N" z
& O/ Y% P- ~, E' S0 g' f----------------------------------------------------------------------------
; q0 q7 }  I$ D8 t7 ?5 ^0 z0 k3 r: p4 Y+ D
<php
: ?4 J" V. y2 O* j+ t0 ?namespoc_e AA\BB;
! `# Y% `3 q8 T/ k5 Wfunctio_n showInfo(){6 L' Q! s' C4 r; ^7 r2 Q+ q
    echo __METHOD__,'<br/>';1 b- z! D; R4 ]6 k  j
}. f* T5 Y& Q( J5 Y. ?" `. Z
namespoc_e CC;$ H! Z$ j; j4 c% F9 p
functio_n showInfo(){& S; T1 b, t' r& S# {$ R* g  n- H% U
    echo __METHOD__,'<br/>';8 [; `) T0 k* J8 J
}$ x8 Y: H7 s: Y/ C% Q
namespoc_e AA;
  R* O# x% m) U8 y' w. Rfunctio_n showInfo(){6 q, J( q& O% G1 V
    echo __METHOD__,'<br/>';" g3 i& V5 j* d) V
}
/ V2 q/ y6 T/ L% q8 [5 ^//非限定访问:用于访问当前空间中的成员
& o) _# O6 x& z0 FshowInfo();- F5 {3 Q; U3 w! R
//限定访问:只能访问当前所在的空间的子空间中的成员
' c! I2 t+ a' U; L, {- `BB\showInfo();& ]- b% d: w" T, m7 m; Y2 \
//完全限定:可以访问其它所有的空间的成员( c! u9 R) _! w7 z9 z
\CC\showInfo();2 M5 W+ l0 k+ R2 |% ~, A8 B' c
↑根空间标识符* {  g9 c2 I8 @
----------------------------------------------------------------------------
1 a' g3 @' h. Q9 j0 ?1 y但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:& U6 L5 E1 K3 ^

% ~7 {1 G1 k6 R) O6 ?8 n当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)4 s; q$ z0 P/ y* c' C- V
/ n# o9 K) K+ D4 @. f) ^0 A# H0 k
代码示例如下:2 x0 X: C, U7 E0 a

5 @" ]# S) C  N3 L* _----------------------------------------------------------------------------
) U" K* [4 W7 [! X3 v/ H3 [9 ]( y3 X3 ]: g
" m, a7 u7 l8 g5 ]) C+ X1 k% O
04inc.php
4 O2 ~, c+ L4 l9 a$ ~& `  K<php
- v+ i7 K$ k4 K, j6 ?7 f9 K
' R/ ]: [3 F7 \6 T8 s6 j1 n5 I' |namespoc_e Core;
; h9 P; }/ ?$ \1 v6 Q1 g- v# `include '05ou.php';, u$ k9 ?8 Z. c! }4 w) L
new \AdminController();
/ K% i; _2 M- `, d$ K$ zshowInfo();
: q6 n) R3 X( j0 X" P) S' k  h  K
3 j; S1 J# F! s2 Hecho P;8 c& v. f+ x( S( q0 m0 i$ J
//根空间中的成员,只要类的访问必须加‘/’
; I& }4 e* n  q6 ^----------------------------------------------------------------------------! \2 N  y; z9 E1 Z% j
7 S( G  g/ Z2 l8 C' i
05ou.php
1 i4 E- z) R) W. i- O' C( k<php/ i! P7 s& P7 D% \
const P=5;
# _0 b' ^3 Q) X: m5 n% t& k7 L3 a, y3 u) I! I2 \( ]1 y5 ]
functio_n showinfo(){
7 Z, T! y, _/ P3 Z# A2 U# |    echo __METHOD__,'<br/>';
" y, J  T7 j1 a$ }}
* s$ U/ v% j2 ^( L3 T+ M+ D6 K8 t( s6 Q( G' }2 g
clas_s AdminController{
$ s+ X3 ^4 H! S1 C  h/ r4 Q    public functio_n __construct(){
6 \' h: K8 z+ p8 ^        echo __METHOD__,'<br/>';
. Y! V5 h0 F4 q0 f# e1 J) D    }3 m8 x8 a; |' v3 S0 Q& S1 R
}" o2 ~" l5 N3 I. n: Q) s/ K  j
& ?3 k8 ?$ N, g
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 W4 g/ X- f, N/ P1 r& L7 `$ o
----------------------------------------------------------------------------
  k7 f, G: x- @6 c, L04inc.php
# L4 g9 V! k3 U! }% U" w<php: Y9 P/ U6 E) G( e8 v. F- d4 Q
" |) t* s/ O: J' U  T7 O8 K
namespoc_e Core;$ f; v& P8 d- c7 m- Y
include '05ou.php';; L, f# D8 y4 k$ e
functio_n showinfo(){& s. F1 n  r6 h9 _- h1 K8 H4 k
    echo __METHOD__,'<br/>';
: O- t4 E4 x8 ^" z% f# ?}
* t! `5 a" \4 C! u; N, T8 y' ]; w0 X# `# |) H2 N
new \Controller\AdminController;9 t% D: {7 }- {$ k, W1 a6 a
----------------------------------------------------------------------------# `( F; I! E$ A0 ^& i
05ou.php: b" ^. U$ C7 x, X
<php
. R8 t2 p& R) I1 Q( V2 Gnamespoc_e Controller;0 q$ S7 f# x9 K! ]+ K$ S/ [7 H6 p8 i
0 @+ i7 n5 C0 v+ L0 c  X. [$ P
clas_s AdminController{3 W/ ?7 a7 j5 y
        public functio_n __construct(){7 S: s3 \1 s* i* N- t) o
                echo __METHOD__,'<br/>';6 Y7 I( p6 \' w5 U% t
    }
' B: s- q. H, `% Y5 t}9 c( N: Q+ h4 Z% x; W
----------------------------------------------------------------------------) ?& y8 @0 k0 o# l  G2 g
# {! r- P8 K+ Z5 [
4.引入空间成员:
/ `2 l8 `2 R. ^5 Z+ w
+ [* k* t6 X! b$ S1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
6 _* Q  }" I. G1 s7 Q5 U, w1 P  r
; R. A. U+ u% w5 R0 S----------------------------------------------------------------------------
3 {( V0 i3 y; q  M: w! |  o" N  b/ v* K7 _6 o; W1 V
04inc.php
/ U2 g" W: u/ l7 V  u1 ^# T4 G7 k2 V# T<php9 v" _. E- H' J' K% }- o
namespoc_e Core;
$ V( o; ^) C* _& O( C9 v- Ause Admin\Controller as con;
) o3 B: U+ M9 G, R
. n  B1 V2 q5 X+ y' sinclude '05ou.php';
$ l& m- T/ b# ^: p9 x& b8 V, z+ u+ x( Y4 q
new con\AdminController();' ]% b) Z" ~/ `5 ^7 ^% [* v' [
----------------------------------------------------------------------------
4 o( P4 V8 ]- W. Q05ou.php* }" n& V6 \7 f7 ^9 ?
<php2 N6 f4 V+ x9 e  `/ h0 Z+ F. a
namespoc_e Admin\Controller;
  c  I% x) p* r
! _! w# |3 n3 Y- v: Jclas_s AdminController{
: n1 J0 p* ]( F/ R% {: ?    public functio_n __construct(){
* ?0 R! e/ T; L5 b5 o7 Y+ R        echo __METHOD__,'<br/>';
, G. u. w! b' s8 ?* F: z    }( ]8 b8 L  ~/ S1 f9 r! ?% t
}
* i& k- @2 `5 T" G- e( _----------------------------------------------------------------------------
, `& \( a+ h5 `2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
/ F3 a) z  ^+ x/ g- V, C
/ t: R2 K# w8 A----------------------------------------------------------------------------6 U8 f' j, @; @: ?3 ?

3 b# j+ @5 i3 u04inc.php
0 Y7 p3 C5 G; ?<php! p/ `/ ^7 K4 y3 O( a- I6 n; \
//引入空间成员类
: m$ o% r2 S$ B- ^+ E  M
; S8 }/ B+ H5 O4 _+ {5 ]9 \$ O5 \namespoc_e Core;$ w3 T0 T6 P# i  S, M0 v
use Admin\Controller\AdminController;! w  d& @% Y8 o  W) c3 f
include '05ou.php';
1 C3 K# I; S3 `5 ~$ @1 C5 c/ e7 v4 G6 u/ N4 |3 _! s! P4 ~" ^" ?
new AdminController();# @9 [+ l7 Q2 p( t7 H, B( F
----------------------------------------------------------------------------
6 |0 g& @' S; y: U8 `# S# h# Q05ou.php9 W0 ^5 J" W! h( Z
<php
$ s6 _5 v( r- L! s8 J! Qnamespoc_e Admin\Controller;
1 t! ?+ h: v) z% w. Z& V" @! N; w. s/ H# z  Y1 y# T$ g7 y
clas_s AdminController{4 n  b, S+ C' i+ \2 P
    public functio_n __construct(){
2 \: a6 \$ w/ `3 G. `        echo __METHOD__,'<br/>';
1 ~9 t, x3 p* E+ t8 M    }
7 y% ]  Y7 ?) J/ T1 B7 A$ \}
* j0 x5 K" K2 Q' R4 H----------------------------------------------------------------------------
$ [+ t9 a7 q: F* H& v$ m4 N! u5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。! V8 j+ ]* H- }* p- p$ N" a# s; L

, ?2 C# v8 b' S
5 F# h& o( e3 W9 N: m- r- n) m2 {& O这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
& Z, r! S+ D! r: s3 ~6 u) U3 _0 e" w  q: l
4 `4 j1 y+ e6 j  M9 E* i0 r
: @, z7 d$ j: z: n: F: ^$ g3 A# [
4 E) o' q# H3 o
0 R5 N6 V3 @4 z; Y, L8 H, q# \% @6 s
4 O3 l. j; m' x, P2 V/ b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 15:00 , Processed in 0.120800 second(s), 22 queries .

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