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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
7 V. w/ y2 J( w& Y
: ^1 p& o; A& x$ Q/ a在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
* w; h6 K) w' t, K" Q. j* q6 w7 D0 d) {& G4 `

& l- O" ^5 Q% K$ W, p2 s- n
7 X# Y" R! T8 D% h8 F: Y' f我们来详细的讲解一下PHP中的命名空间:
, N6 q( p/ P- n1 ?+ v3 s1 [
1 y. ]# m( c: O0 v2 E语法:namespac_e 空间名\空间名;! a% p, h4 \6 q% ?
9 l- ]9 N* `/ t; I
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
' t5 p: Z: ]6 ^$ w
3 k' ^' `# @, ?1 Q" V7 o3 k----------------------------------------------------------------------------3 H. ~' @3 v2 _: |& \# T! g; V' e
4 e  {2 n0 w$ ~' `8 a
<php( u4 Z  _1 @8 ~1 V9 F- I5 m) j4 `0 d
1 _9 K2 r; N( q/ T( l3 c
namespoc_e AA;
; x* ^7 l  I9 I" n" W  ^7 |2 \functio_n showInfo(){
8 I5 y) z: l* g, ?    echo __METHOD__,'<br/>';5 ?9 w2 j7 ~+ E
}, A: c4 o. Y- {" w' J
showinfo();
% |: D' ?) _7 X3 I; D9 [- n7 [8 ^2 q) G; b
namespoc_e AA\BB;% q* n0 a6 ?! Q' E$ ?
3 z' k7 B6 X  w# t
functio_n showInfo(){
* `: u. i5 T9 y    echo __METHOD__,'<br/>';
7 u8 u1 A8 I0 H" S0 V}$ @7 P0 }% Q* |
//showInfo();
+ Z9 G# Y7 j. V! `# |----------------------------------------------------------------------------
* V8 \( s/ Y1 J: _/ b) X2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
6 Y- j- i# v8 _" w7 ?0 A
/ T& ]  U4 i; }, v4 I5 @+ j3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。' b$ P2 |9 p1 H! A1 Y
/ g# f. a+ C3 i  @9 b$ L, e% i
----------------------------------------------------------------------------
4 U. |* g2 ~1 Z; s8 U) K* X* J4 C
/ d% Z. ?( L* ]3 G- M( J$ k5 z8 b<php! I' n# y: z3 [' Z6 u! ]
namespoc_e AA\BB;
; P' m* W0 _% r  K( h$ }; O0 Kfunctio_n showInfo(){7 v7 Y7 Y: W  G/ O8 H
    echo __METHOD__,'<br/>';3 q7 X  ?' M, j! i. u- N" Y# y7 N" V
}
+ X9 @% f% {8 L- n' B7 Anamespoc_e CC;
( e& p& g+ m' |8 K7 g- cfunctio_n showInfo(){& U2 ~5 o. q. q5 A
    echo __METHOD__,'<br/>';
, P- J# y$ F& U1 Q0 E}
) A+ u+ R9 G5 [2 [4 e* snamespoc_e AA;4 r5 T5 h+ E4 x
functio_n showInfo(){) w, |$ p. V9 Z3 y  U6 k# j+ X
    echo __METHOD__,'<br/>';
& R3 j- M" V" G9 q; Q" S}
5 @( I& X' U+ X8 l( D//非限定访问:用于访问当前空间中的成员
" p# d4 z* }; B" p' bshowInfo();5 e! Q8 X8 r# O
//限定访问:只能访问当前所在的空间的子空间中的成员9 B$ G8 O5 T4 X( g" D5 z5 H# X
BB\showInfo();
0 H; S, P. ^, k( g7 X//完全限定:可以访问其它所有的空间的成员" [( a# |2 O& p- P# e, U
\CC\showInfo();6 f  w1 x6 b7 P, J+ L
↑根空间标识符3 @+ u! {! W5 ~0 Z. e: Z9 C
----------------------------------------------------------------------------
& V: J# ]: X" K, r但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
/ z* s0 O9 H1 O1 T- f7 o# x9 r
: n. f: R1 n6 M. x( s3 h当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
/ z+ U; A" L2 K, y, u% P+ g/ R. |' Q, Q
代码示例如下:
2 _" j( x! j7 B! i6 f# K1 X' m
----------------------------------------------------------------------------
: B4 u2 w& f# C2 i9 M8 ~( ~
. r+ G6 _1 ?2 }
. N, F* X9 J9 g/ v4 Y9 W04inc.php" s4 t. _4 C5 U
<php7 Z) [5 a1 L( C! D+ ~, c( E7 c
8 j; M# t  |/ N2 y1 i3 X/ Q
namespoc_e Core;- F. s- c9 P# p5 B! |% n
include '05ou.php';2 X. \8 X7 B. j1 G
new \AdminController();" j0 ~4 t0 a" L4 n* T, p% r- X
showInfo();
! m6 w* ]) b2 X( {" ~
# N" }. X& c4 G7 V; Zecho P;
) |, ]. K: m& d  H% K" u6 C: O//根空间中的成员,只要类的访问必须加‘/’) n1 [) Z$ A' w) s% ]0 O5 p8 w
----------------------------------------------------------------------------5 }# u) S. m5 s% g2 ~

2 P6 j. a* {/ W* x+ D: |/ x) @1 O05ou.php" E! T8 Y, R. v/ K$ v$ o
<php
" ]0 N6 c8 j5 J$ C( G2 Zconst P=5;
" _6 n7 B/ y& ]9 M! o2 _0 i( w, z4 z% @; j5 e# J$ Y5 n$ Y' _5 D
functio_n showinfo(){7 ]. u; X/ X' z( c( c% d
    echo __METHOD__,'<br/>';
3 n2 D, A1 ], m. y}6 B# f) R. D5 Q" f. {# h
$ {1 R0 R; E: p) j! g& C2 W. f) t; g8 e
clas_s AdminController{
; g8 o& k5 P% r! S    public functio_n __construct(){" G1 D8 [% F$ G) Y, g! Y' ~5 v
        echo __METHOD__,'<br/>';
& T- F3 ?" J" _  U    }3 }* @: \+ Z2 k' q. X
}
1 _. O  k+ A0 D' a! {- ^* M7 @% M  `  s  Q, x! n1 U
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。* {1 m5 i( z) u: _' ]! {
----------------------------------------------------------------------------0 A7 j1 Y3 x7 Z4 t  t" w# X- R
04inc.php
7 L$ e4 A4 D$ u5 K; ~6 b<php( F  i, i0 L+ D$ g  S3 b: a

4 m7 I* q% r( h/ inamespoc_e Core;5 u" e/ p5 Z& B) A  `1 f0 \7 Q
include '05ou.php';9 {5 s# E6 ^2 Q* U4 e- y
functio_n showinfo(){6 L5 f3 M" \' r% ?$ ^
    echo __METHOD__,'<br/>';7 n2 {, _, K+ C  T( r
}  t+ f+ ?% d6 T6 a- H

; v7 a; A3 O% W$ H1 |1 anew \Controller\AdminController;
$ w! R' H7 M6 O& k4 ~----------------------------------------------------------------------------5 f, I! D' R) a, c/ ?8 Y/ R/ v& `) c
05ou.php
$ ?; z& K8 x+ S- S0 a0 N<php/ u6 H, L' K7 f8 v& Q/ t- b
namespoc_e Controller;
" \% ]" k! h# \; J3 V7 W0 b, o8 @2 T3 ?+ _3 {1 r8 g% Q
clas_s AdminController{7 L. M% y. J7 @7 W. }6 @
        public functio_n __construct(){. C# G6 `8 T& j( i7 h
                echo __METHOD__,'<br/>';
/ z4 ~+ ?3 O6 D) l3 }    }  L8 J5 c5 d  [. \! M
}
( G3 @) q6 A5 i4 d# b5 |$ S+ C----------------------------------------------------------------------------8 ^. }( T% F8 n- i/ X0 [0 u5 s3 U9 o

' J/ M) [% d* {9 s4.引入空间成员:" {4 P* s# r6 d2 y9 N
7 W; B7 `  ]4 O( G* y, ]! J7 t; z
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
4 r; Q- H8 M* }- n, v
6 U- e5 V: i6 {% O----------------------------------------------------------------------------
4 P$ {. b- }+ t# u- c, V& w
0 M1 M* A7 E7 h, g- w# }) l; F04inc.php
% ^; Z( U9 k" a2 a- _6 T<php
1 }3 {+ m: y' A9 [$ hnamespoc_e Core;
$ v4 X9 x$ Z/ y* e4 cuse Admin\Controller as con;
# {9 _: |( t0 Z. y& P6 E
9 p! @( m, C- M' kinclude '05ou.php';
3 c& G" e+ X' }7 ~6 D! Y* Y- Z0 a4 a
new con\AdminController();. x  n" c2 r0 W. F, F8 R
----------------------------------------------------------------------------
. B2 K( q2 J5 o5 K05ou.php0 k0 |, S' S' }* `" o0 T2 a
<php
. K5 X8 _9 W; e; Gnamespoc_e Admin\Controller;- J; w) |3 }) G9 ?, a% E
* m. f2 l( Z& ^
clas_s AdminController{
3 R5 H% I! i* b" L    public functio_n __construct(){
' K! z* T8 f' `& }6 X        echo __METHOD__,'<br/>';3 q/ O/ B4 n/ T( t" B8 D1 Z/ D9 u# f+ N# S
    }
8 d% u- m5 T' g4 @/ t# X5 {6 I}$ d1 r, B3 `- d5 i0 W
----------------------------------------------------------------------------; L7 n# F1 U8 k- Q. }
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。7 `  E4 _- @% F0 [4 x

; _* G& {& f" G----------------------------------------------------------------------------% U  U" H; p3 A% C( ?
5 Q, A4 {7 E4 Q+ R: W3 b; _/ f1 y
04inc.php
6 {9 q2 j0 ]2 s( S1 |# C- s<php
. ^' b% v* N! ]! A$ {//引入空间成员类
' J& a2 R. \0 D% Q' N2 H  c) ~$ y- m# P* C. F/ k
namespoc_e Core;
. c& L' Q0 n* `6 Y) C& p5 ~use Admin\Controller\AdminController;* C( z$ u% W  H( B! N
include '05ou.php';
' {0 s& j5 j) N6 m2 a( m2 z5 N; ^! s7 c, u
new AdminController();
1 X2 Y3 N  Z# v1 \  d. Y- E----------------------------------------------------------------------------
8 B2 _9 j. _. B5 D; W# Y05ou.php6 K  }+ d! h7 U' I0 P
<php
( D3 }3 ]! S. d' U7 ^  P9 }+ Cnamespoc_e Admin\Controller;
" G, X; m0 L" n* r: z& n
1 n9 R3 H" w8 T* p9 U8 n' ]$ I- D5 Tclas_s AdminController{+ ~2 W7 Q9 x6 I
    public functio_n __construct(){8 w, f5 l  e) C+ [- x9 Z! u
        echo __METHOD__,'<br/>';
6 P" E% m4 B* E+ w& T2 X* z    }+ a  j& c/ E! j7 Q+ m
}
/ L% C! t( e: O2 t1 i7 o. h7 u- j) _- M4 S----------------------------------------------------------------------------
2 w' c: |8 s; j9 T5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
( P. j- b0 |, J) H( T* \2 x4 }9 u# ]; K8 y& b$ I1 E/ F& h" r

9 V+ L' C  u; ^, b: @这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
/ ]; m/ |4 s/ F) c; _' Z1 k5 R# `! M3 P8 I4 U

* M$ \8 D+ Q7 G: g, P) T1 _( u3 U; T. ^0 u  o8 B4 j1 a4 u! |" |
0 r2 _! g( G/ [' r* i- t6 A. I
( F) o3 _7 \% r0 t* Y6 g

6 O+ c4 z, k; L2 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 13:22 , Processed in 0.118672 second(s), 22 queries .

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