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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

php中命名空间(namespace)的作用和使用

发布者: admin | 发布时间: 2020-7-1 23:13| 查看数: 12629| 评论数: 0|帖子模式

1.命名空间的作用:
# o' P, k. t1 y7 c: S
1 Y$ C& g% e0 s在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:' C( u1 W! v7 L7 W+ z3 i
5 Y* H0 T3 p3 t- R; D
20181201105307520[3].png & i2 l) Y' ?. R! E+ m& ^3 b+ c% \& x

, h. X9 H* p4 v' c1 y; \8 F我们来详细的讲解一下PHP中的命名空间:
$ i5 f  e" v, R1 `  s% l( l, r2 k* B4 S
语法:namespac_e 空间名\空间名;
6 i( M5 B$ L$ u! z+ i* {. G; G
' B/ x2 o# |. h# K. j" e1 N) H说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
5 A4 ^, K! ?4 ^2 |4 {# c
: A4 P# N+ ^! P----------------------------------------------------------------------------
- T, M1 @! ~' L3 I( w
- d+ L+ @3 }% w& ?3 w0 N/ }& P<php
8 }" n9 y8 F; ^8 H- l, ], g: T- f# v8 z, U: ^% O% Q4 O3 e9 J
namespoc_e AA;2 W# {$ f* g" ~$ i( _. A/ i
functio_n showInfo(){
4 Z. Q% p/ H& Z+ X6 |    echo __METHOD__,'<br/>';
7 M; r% m# I& _% x  I1 l# X9 J}
7 Z; D, U, d( B; h/ w  eshowinfo();# f; o+ ]) q, Y9 P3 {

7 V7 d" u" H$ y. |) ^9 enamespoc_e AA\BB;
1 J. e9 S/ ]+ L# Y  x
6 E2 a- y& D+ i! W5 {3 Kfunctio_n showInfo(){
! _/ V6 g7 C  V! C8 r    echo __METHOD__,'<br/>';2 @2 H8 b0 N0 [1 A0 n8 \! w6 C8 G
}2 s% `: G4 r2 C8 n7 [
//showInfo();- R" ^4 ~; h: A7 K* u
----------------------------------------------------------------------------
4 S" d$ w& a7 e( _( {; t2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
5 [* d, ^+ y1 [2 R; t$ [. x0 ^
$ z% ^3 H* B: J+ \- {/ }3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。  `8 C5 U; _2 B0 n# g
' ~6 v- C5 ~$ }
----------------------------------------------------------------------------) R" S& n$ K2 y( s; j& Y

& _5 W0 U" ^3 S0 ~8 q<php3 V; y6 s' X. ~( {9 m4 w1 g% a5 _
namespoc_e AA\BB;( O' K) I  n6 V8 m% _0 d
functio_n showInfo(){5 G3 h2 _3 X1 h  R9 v
    echo __METHOD__,'<br/>';) J8 s- K* P) |# G) M  R9 ~7 A
}/ ]$ a; M. T0 c: U, Z
namespoc_e CC;
% ^  I6 H  O4 H( lfunctio_n showInfo(){7 p6 q. r' k( f+ b* O
    echo __METHOD__,'<br/>';
9 y8 m1 |! z4 T: r1 h, G}
) f3 t$ i, F2 @7 n. c) f- xnamespoc_e AA;4 |7 J" I+ w7 n  M. t( B9 |
functio_n showInfo(){% f" o* G' S. U- W3 ]- p) c
    echo __METHOD__,'<br/>';+ _; n8 [5 e9 p. v
}
  v; k8 X0 ]1 u0 T3 H5 a: |//非限定访问:用于访问当前空间中的成员0 _: L- s( f1 x" Z
showInfo();& ]* E+ L5 @6 t6 L  y' C
//限定访问:只能访问当前所在的空间的子空间中的成员
, u' W, e- H- XBB\showInfo();0 z$ ?. k/ \# H6 J9 h6 ~+ ?
//完全限定:可以访问其它所有的空间的成员
( x3 f# M9 ~  M\CC\showInfo();$ w. U: H; Q6 q" l' O* ~( x
↑根空间标识符8 B  t( z) U4 D" ?& k
----------------------------------------------------------------------------/ M$ D) _7 ^+ d
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:2 O! p1 z8 t( C5 W. C6 \
' z0 @$ A: s9 n8 g) [' r$ E+ j6 H
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
% ]" |2 u+ X3 U8 w( L. p% c: F8 l2 @2 Z1 P
代码示例如下:
" k% H9 Y( V! u1 J  z6 ]# G* n9 z# k2 z  ]" Z1 h% y( \2 Y  d' s! Q
----------------------------------------------------------------------------
* }& Y/ p: ~8 n; F/ I+ D
0 k! u4 W( n2 n5 R( v3 U4 V: m2 E) B& H, K# V. ]  p" ~
04inc.php
- h5 e2 _: n2 Y; \, ]0 L<php
9 U! w  o2 Y  `& V" p1 E9 _6 |  f" k+ N. s) @/ [( e6 H2 X, g% u- j- F  d* |
namespoc_e Core;% j  f$ m' f$ Y6 x' d
include '05ou.php';3 O' _: ~3 W5 w- h, S# n& k8 M1 Z7 |
new \AdminController();
6 o$ h* t: M% ~' t: |5 TshowInfo();
/ T) N. z4 L  v5 N# n5 p  g
5 W. Q9 C7 @8 W. g# i* z& P: hecho P;
5 }  C/ j& G5 K9 m* ]//根空间中的成员,只要类的访问必须加‘/’' Z$ J' W8 Z, ~2 e1 A* c6 W
----------------------------------------------------------------------------$ }5 c8 n/ h. k' Y
0 j0 O5 d, d! z/ z  I
05ou.php7 N, D: g/ j. X6 x7 G5 F
<php2 _" ~% e4 Z1 p) w7 Q
const P=5;
( I0 @  [6 I9 p: e' W+ q- M5 @# A: O4 s% |1 K( _
functio_n showinfo(){  W: o! {8 [; r/ b4 D: r) V
    echo __METHOD__,'<br/>';
- v& l$ i( A  W+ X# j- P}
6 B" u9 n$ j. o/ S8 Q1 X& B
8 J$ t7 g9 p4 S) s) tclas_s AdminController{& g: u, ]4 O) ^% `
    public functio_n __construct(){
& u) D+ Z3 X4 b% ?! F        echo __METHOD__,'<br/>';( P, J; N9 I4 l: Z! L! V
    }
9 o% \6 `8 y( ^" {/ ]}/ z2 R; j$ l& \# z- V, _

! N8 w5 G- |5 f* D, i# K第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。5 B6 ^" f% D8 s
----------------------------------------------------------------------------$ b* |3 {7 S9 y
04inc.php- f6 I# N* J7 G8 T% N1 D
<php. e( D% [1 Y5 u. s) {* c
# J, o: }# A& o. p) C
namespoc_e Core;
. ]$ g- O; _, Tinclude '05ou.php';6 T6 u; \1 ~  M
functio_n showinfo(){$ H. }0 Q+ F8 G9 M$ ^0 [  O
    echo __METHOD__,'<br/>';
' U* @) W  Q7 B+ {}+ l3 F- A( ~6 |+ V
0 G) g* ~' a' o+ r, h
new \Controller\AdminController;6 J0 J) T& T+ f  R$ z0 [% k
----------------------------------------------------------------------------
: y" \1 T$ {, V1 ~5 V, T05ou.php
% p$ j% V8 l2 F1 d3 C( y7 [<php, |5 z# B. Z+ \/ v# J$ _( D
namespoc_e Controller;
# E: O1 S7 ^* i2 d) \, u1 k) D) d3 U
! K# [4 k% O- ^0 c6 Y( Aclas_s AdminController{
; Z  O' a$ w! G0 d2 I        public functio_n __construct(){
  z% k1 e3 r/ o( ~* m! }8 U                echo __METHOD__,'<br/>';5 T" M8 n1 r9 H$ n3 H/ E; W
    }# \, n2 [9 |0 D# m
}
' {" ?2 K$ C0 u" b. G6 |----------------------------------------------------------------------------: X3 Q, e' n! X" \8 t

$ J. Q8 l4 T0 ~) m+ s: j% |1 v4.引入空间成员:* j. O1 B, m; W/ p7 ~* m( ^' Q
5 b% E, p: L* e, h" j
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
) U( ~, c: Q: k) W+ h# u$ U( W9 d' F' P# ^
----------------------------------------------------------------------------7 I0 O8 T- p& c' D- _# U. i
  E: w6 B! O- u) c1 T$ Q, t& B
04inc.php
' p; [0 p) {/ w* P0 m  y# f<php3 d( j! [7 f) h! P( Y! N
namespoc_e Core;- M) L5 N) l  I/ o% B* R
use Admin\Controller as con;
5 J% j3 s  b; ?* {( M7 r
6 K4 `0 W6 b0 U5 |  E& S3 Pinclude '05ou.php';
6 ?8 {; F2 q; e8 \. ]
- K3 B- Q; Q4 T, `* x- I7 C; ^new con\AdminController();- _: }* ?! F) g9 a9 I5 I
----------------------------------------------------------------------------5 v; e3 M* `$ V, ~9 l
05ou.php
) W' d1 C7 L% J<php4 Q+ n7 M- t  g- }0 I3 [- i+ _
namespoc_e Admin\Controller;9 S0 |0 Z# T+ x3 k7 n) L0 G2 v

' J- ~' l; P8 Q! y3 e4 Z  a% aclas_s AdminController{
! q5 n$ d, {9 g; _4 z+ E% X. q    public functio_n __construct(){
# ^# l- J1 p% r1 d  B# l        echo __METHOD__,'<br/>';7 n. K: c6 m3 _" r! k" c2 B2 w
    }) q7 e; r; O2 \$ R4 J) O& n6 D
}/ R! e$ R% l) q+ \
----------------------------------------------------------------------------
7 }; r! ?+ A9 O  K6 |; b4 b7 F0 g2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。+ |. r3 E8 ]& [' Y1 {& P
7 Z3 Z4 n& P8 O3 l: E
----------------------------------------------------------------------------
& v" t8 J) ^) M4 m1 o7 a* y+ T% k2 {3 R8 T& Y; o* x
04inc.php
2 P" k4 l# A# _. @+ m0 R# J6 B<php' b- y& P1 w9 O: `
//引入空间成员类
$ z. Y. r* h5 Z2 I% j& Z
6 L7 P! {. n( [; s. q+ B6 g2 b3 Wnamespoc_e Core;" ^: V& w: O+ d! h, e* r
use Admin\Controller\AdminController;
9 m- Y4 {4 Y9 J0 W" w  B% Jinclude '05ou.php';- a+ s; I. z/ g5 ?! }* K) K
2 X: o* f8 ~9 c% e( i2 W
new AdminController();
! Z4 T( Q% X  Y' K/ F1 ?4 Q- u; p----------------------------------------------------------------------------
$ s* E0 ^) J" ], t; N7 J# ]8 |05ou.php' b6 _& X  S+ c4 w3 i" q, C& @) W
<php# Y; a' Z% X9 j5 r
namespoc_e Admin\Controller;
9 s  P$ ~/ p; V' ?) ~7 W/ U
. N  n) u- l8 c& Y+ o. Uclas_s AdminController{2 C4 G! B+ r4 V- D5 ]) E
    public functio_n __construct(){( v6 m9 j) L9 i) B9 h5 A
        echo __METHOD__,'<br/>';0 e+ Q  B5 F3 N% b  N  z! n, G7 `
    }
0 j3 E2 h3 q& b) X5 m}6 b  ~7 ^& z- b0 ^8 ^  O" t7 p
----------------------------------------------------------------------------+ G6 O6 J' [3 Y4 w' r
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
+ C( t1 F2 x3 b! ?- S; P. G0 `2 E0 X3 Y& n& v6 [; t

( S* d8 r7 u2 o$ o9 i2 D9 P这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
' {, m7 i: |3 K0 z/ `7 Z. z* i

2 K4 }5 p: z- _6 P
0 J" I- f: ?) y7 p/ q
" b3 [. U" T2 d* x
# Y+ x+ B  C! H  K3 Q) }# i+ {7 J$ J  ]( }8 ~

最新评论

GMT+8, 2024-12-11 07:07 , Processed in 0.137491 second(s), 23 queries .

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