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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1927|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:
# V1 d9 X! W; P$ G# h4 @  X- W! V* ~$ G5 |
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:! _; l2 y- Q1 I1 B
' \  K) `4 |5 b% U
20181201105307520[3].png ( P9 E6 F# q, h- x5 G
! z. W9 R5 u( b3 m( _( X
我们来详细的讲解一下PHP中的命名空间:
; ]9 I8 m1 Z2 b. L
. y! V' A4 g6 F9 |: p; r1 c+ I语法:namespac_e 空间名\空间名;
- O! {1 K% \' a2 w* ?5 m2 f' X" ~0 D3 i
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 d6 L2 l7 n) b# K0 w$ a/ s# V5 k; {4 J' |$ J
----------------------------------------------------------------------------- ^6 M! e" \1 r% u  Q8 v6 G

7 l+ Z4 Z+ }% ?- b<php2 N: d5 ~& y+ F+ G

* o5 R/ G& u, t! onamespoc_e AA;
# ~4 O9 L0 q$ F+ Bfunctio_n showInfo(){
1 S/ k% p* q1 k/ l5 `; [    echo __METHOD__,'<br/>';
0 {3 o( c. h4 D% n7 L" F- V* L}
. D" t9 y" `; y3 a' P; R, E. r2 Ishowinfo();2 [" l* y8 I+ a* l! w) E$ g# g

9 R2 c( e: z1 G/ z& Pnamespoc_e AA\BB;7 n$ i% p" v. L+ K, _, K

& o7 P/ S7 P/ D- e' {0 v5 Q% E. {functio_n showInfo(){
6 |0 o9 J. R6 o$ z0 j6 R3 }4 t+ I    echo __METHOD__,'<br/>';+ T- D! o: B" R" v; e. I
}& n" s; b6 I  J& |; ?2 p
//showInfo();: d0 t5 ^- y( p+ }8 s
----------------------------------------------------------------------------
: l* e$ g9 T) k' V0 z, D" R2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)3 ^8 E2 I8 l( A3 K8 N
; Y8 t" h  T- K/ B+ A
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。2 f0 J% o& _, c* `- v, M& n
: l4 C0 B& {5 _5 L3 h1 k; s
----------------------------------------------------------------------------
0 f" C& r- ]4 P1 N. X, @$ z" J! r9 e& H5 q
<php
. m4 o/ O, a: ^, g0 |( S, jnamespoc_e AA\BB;
3 E' M8 _0 H, b; Y' [functio_n showInfo(){
7 e( ?% _6 Y3 `$ m0 }    echo __METHOD__,'<br/>';8 s  R0 K2 o& }7 m
}6 U& P. T3 J, U& i3 |/ _0 b9 ]
namespoc_e CC;8 S; r( H) G: H9 ?" X
functio_n showInfo(){8 f- {. P2 U. w/ Z
    echo __METHOD__,'<br/>';/ m/ u+ M& M6 q, ~+ Y4 m  c
}( {2 C$ i, m9 f3 G) ~. r" [4 h
namespoc_e AA;
+ x2 ]! P8 I$ ~% \" xfunctio_n showInfo(){+ }0 q4 J4 H0 P5 N% |) ]5 I
    echo __METHOD__,'<br/>';/ ]' `$ L+ ?# T; L
}
$ \0 F/ @" g$ g: D' |* w& b0 I//非限定访问:用于访问当前空间中的成员9 d% F' I9 f& g* H; J3 A9 ?
showInfo();0 |, j6 V5 l3 }5 \: r: m( Y
//限定访问:只能访问当前所在的空间的子空间中的成员  {, Q* S. E, C2 O6 M% X7 ?
BB\showInfo();
3 |( b# r2 ~9 {/ @6 }* [1 x//完全限定:可以访问其它所有的空间的成员: ?# Z  \" b. \" I- L/ F* C) A& ?# U
\CC\showInfo();' e& c+ h% a4 G6 s
↑根空间标识符
; T6 p# J0 K+ H, y- o" K3 ^----------------------------------------------------------------------------$ k+ `. c5 N' C+ B
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
& m5 O  i0 l3 ~3 m+ e2 R
" o. m; F% C; @4 Q% M当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)& {% I# F$ w0 m* c" A8 S" x2 J

4 T5 b* L& f: i代码示例如下:
4 [% ]2 P1 Q5 C  X
4 N' c* C+ }5 s8 d4 n! y----------------------------------------------------------------------------9 v. e: E+ x+ p

4 j9 {2 S; v9 j+ i( y  @# {  @6 `, b1 h0 S
04inc.php
6 G# z1 Z; M! O4 v" U& {<php
0 P: @: {3 Q( g7 L& z
( C& v  @, s" _9 {namespoc_e Core;4 m* b5 E, ]' G; Z$ i, k3 D- L! T
include '05ou.php';* K* A: `* ~3 s, q6 L+ e0 b6 d, B
new \AdminController();
4 G( b: N+ ~, b' F( }- RshowInfo();/ @, |% f+ a, D- U

! o: S: }$ |) techo P;5 K" V- H3 P" ]: V3 N( r% Q4 w3 ?. a
//根空间中的成员,只要类的访问必须加‘/’
6 W- a6 L2 h( n+ Q1 G$ o$ w$ K----------------------------------------------------------------------------' o: p- \0 G7 f7 C
) ?8 S6 L% N, Z* x8 i. x3 e7 ]  h
05ou.php  x$ ~* Q- y2 d' X6 x6 I
<php
& Z+ v8 U/ f: ]3 i3 b+ ]const P=5;
8 X4 a# j) C; J' n7 }7 X8 T' U0 O9 r2 n$ E5 O% k+ Y3 y4 ?
functio_n showinfo(){5 R+ u1 m, N3 g) j
    echo __METHOD__,'<br/>';
/ E  I/ c2 K. ]}0 ]9 e9 h. k0 O/ v: D8 b7 g  W
" v4 ~& t+ P! C% E/ p
clas_s AdminController{3 g( b" c! }! X# G
    public functio_n __construct(){
+ N7 B# R7 P' [6 c( J" N        echo __METHOD__,'<br/>';3 o; I0 E) Z$ X! D
    }) _, H& \# z9 t( k5 V# Q
}
; U/ H6 f4 q) ~; n% f; ^( @2 |3 V1 A/ N+ E4 g) U$ A" ?
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
9 e+ Q& z1 \! a* B% o, X----------------------------------------------------------------------------
" X2 ]( `4 ?* [9 P) h  w4 w% S04inc.php
/ a1 c$ M* C5 j& z! E: }<php
* O1 b; w. i9 s4 E, L  W* R: j& @
6 g9 R6 E2 G- U6 Dnamespoc_e Core;) O$ `  D0 X1 ?) S: l3 s
include '05ou.php';! Q2 C1 x" P5 D8 b
functio_n showinfo(){
; x$ O/ g# ?- J9 c' N: T    echo __METHOD__,'<br/>';. R8 y4 e9 k# F  d8 Y
}
* F; |$ a# A. v( v/ R& W9 V- I" ]* F7 @( N! P  [# [
new \Controller\AdminController;7 N  b7 E! u5 A8 R3 l
----------------------------------------------------------------------------
1 F& ?: s  l, ~- S- S5 u; L8 @! |1 ?05ou.php3 i* N0 f; }# y% l0 w. I
<php" G/ Z: L. R: x! ]: b
namespoc_e Controller;, V9 ]2 N  u2 n; ^) a" ^

& m$ F+ ^2 _$ }- Lclas_s AdminController{
3 y" s0 ^6 K4 I' P, R  ]' k- c        public functio_n __construct(){
" s1 ?4 N( @8 U3 b& }* P- ^% J  c! Z  o                echo __METHOD__,'<br/>';
: s# R1 {7 w# f2 H+ P% d    }
; n6 t9 b# g4 X3 j}( t$ t6 B/ H! z0 L6 Y$ B# I
----------------------------------------------------------------------------9 l0 o% o) ?0 W$ {; u" ]3 o

/ F- s* m& R9 m4 b3 a4.引入空间成员:
' T0 a0 Z: N, {1 q/ x: z8 V$ V4 _$ V
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
1 L% }9 l, K6 [8 y# U' t- ^0 `1 q* d/ X
----------------------------------------------------------------------------# L5 _+ Y% S! q. t* X# I
0 P6 s4 w* l% _8 v/ P9 K
04inc.php
- S: J1 d* x* }<php
4 E) f' X4 l; X6 d4 `namespoc_e Core;! D* l1 A3 X: z' J- c" S; D" P
use Admin\Controller as con;
& h: C. m1 F, e4 A2 O; D* i3 c7 N# J
/ O, J0 d. ?% Sinclude '05ou.php';
5 K6 T+ T# v; x. p
" B' ~) N. T: {3 Y2 J- Bnew con\AdminController();
/ g6 ^/ K* f( `* l+ Z1 n, C----------------------------------------------------------------------------- p% ^% W9 X  J* |4 j" v
05ou.php; S. f( K* D1 E# @* }
<php
1 N. ^# Z4 I' P0 inamespoc_e Admin\Controller;3 {7 ~( F, y4 W; i/ k3 w
' ~/ L7 ?4 E% z& B
clas_s AdminController{
! |5 T0 H5 q" V2 `* h1 ?    public functio_n __construct(){
0 a: F4 a) _+ A5 T* Y; z- G6 R& p9 ]        echo __METHOD__,'<br/>';
. e3 z2 p2 n5 V    }
7 F; F5 B: H3 y5 N}
5 I% l# `1 X, Q3 J: \----------------------------------------------------------------------------$ m- E5 j5 V% Z- t
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
! A9 ?. \7 m: e- `" n% v
' S+ N. n+ L  s7 F----------------------------------------------------------------------------" u$ n( Y* |8 k& G, U

9 h) w& b9 T: y1 b. y04inc.php$ P6 i  C4 _1 S. y; Y
<php, b  P  \# s% ~4 w& h2 T% q3 O# [/ F
//引入空间成员类
+ H: u" e! J- A1 i9 ]% @/ ~- w3 A. N+ |# \1 c8 H
namespoc_e Core;
$ ~+ W: r- b. i1 J3 Vuse Admin\Controller\AdminController;9 ]6 i- m3 L& s! U5 d$ M
include '05ou.php';
8 X5 a/ T; Q1 {7 m2 O+ B" c, A6 X$ `& G: V' r: y6 L" q0 Z- C
new AdminController();- j' H' G: o( `0 Z! q' y- D* u# C5 X
----------------------------------------------------------------------------
( V- c$ r% O% `& r) w  `5 e/ n9 \% j05ou.php
8 f0 b* G# {- [, h<php
4 O% y* N+ z& B7 W" A8 enamespoc_e Admin\Controller;
$ [! e( x* O4 W1 T) f& j
/ Q, k- v& i5 T( `clas_s AdminController{  r; K3 L6 c% q
    public functio_n __construct(){: V2 a& X1 I  L/ A9 G
        echo __METHOD__,'<br/>';
2 x! g; p0 z1 {: ?" f. C    }
6 }! r2 O. P1 a3 J7 F}
' X( w9 B; z5 z: V----------------------------------------------------------------------------; ?0 T5 l# I2 z
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
' {; S2 y# E  V! G7 W8 Y  w' E4 i5 |+ t) q3 H

  ?6 a: h) J, \) L$ k这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。0 {( t8 P4 P- Z2 w- l6 D; i5 {" Z
/ C' ~- u+ {9 i/ B
5 k5 D& d0 O& u. e
0 D0 S; Y$ N7 K, H% W
- ^. Y4 e6 {- D" l; n

9 @; |9 d# y$ \( g# g5 f, F; Q: b0 U: z5 _' ~- J
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2021-9-17 14:34 , Processed in 0.117807 second(s), 25 queries .

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