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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
! g% o* c8 q: t8 O& w9 W
, U$ u/ S" V8 E# L2 A. m) G! P- ]( Z在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:. B& n) }6 Z  ^! ]1 W5 M
8 J7 }& s9 R/ X2 b2 }6 Q
20181201105307520[3].png
# V) D2 Z3 h' E( d1 D4 }2 [2 Q; I  F5 K9 t& X
我们来详细的讲解一下PHP中的命名空间:
- p$ ?& u- Y6 F( S
" S+ E( R* u! w- o2 u语法:namespac_e 空间名\空间名;
& G  f- }# y+ T6 _6 B: g, C6 X
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:5 d" Y% S$ s4 I, A0 w' m7 C

$ j" \( K, C8 [+ t' U----------------------------------------------------------------------------8 F" D8 N7 h2 U( a2 @

& ]. ~1 U$ q+ U% I  b<php
1 [; g2 D- L: o
5 A; I7 Z9 u5 S+ z6 o: u, Dnamespoc_e AA;
" ^! g4 C/ D% xfunctio_n showInfo(){
- b4 p4 h0 p# w" t0 P. H+ t    echo __METHOD__,'<br/>';
1 e; f5 g9 i! s' a  y( }}
1 T( x7 G- S: y" T1 b7 i# Q7 d9 eshowinfo();3 T6 L+ D3 o8 [, s/ t

1 j% `8 p( o! Q9 B. e( tnamespoc_e AA\BB;4 Q& m* p- L# ~* z( G# P

6 b+ j  m5 k! }- C3 k; l  `0 r4 tfunctio_n showInfo(){1 u: T! U0 p1 W
    echo __METHOD__,'<br/>';1 Y( q9 d! n* `4 H8 C0 @
}: i+ o' p) L9 N9 k- |
//showInfo();
, ^) T$ }- B0 @% a2 s----------------------------------------------------------------------------
8 Y8 {  s, c, ~0 W( V  r2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)1 b' i6 P! S. n# r( g3 j, |

2 g6 |  w9 g7 ~2 S; x3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
0 u* r8 ]! _1 ~  z( W/ w1 B9 x. N8 W* y8 X
----------------------------------------------------------------------------5 e( F% ^. x0 ?, C* D9 U# S  L3 t4 T

( i5 G6 y& j2 C" ?9 O4 s<php5 K% o5 j* V0 ^) F
namespoc_e AA\BB;
$ k% ?; c7 G7 O! `; Kfunctio_n showInfo(){
: X4 h6 N% Z0 Q  m5 I* K    echo __METHOD__,'<br/>';
0 ]3 ^5 I7 `3 s4 D& W}
$ e$ M( s/ W+ m; n+ b$ rnamespoc_e CC;
, V6 [: m2 _/ W1 W5 o: [9 Z7 Yfunctio_n showInfo(){* `& f( A6 k# f8 N* \$ I
    echo __METHOD__,'<br/>';7 Y: u& \- C# u0 j. [# H/ }
}
% l6 F9 a: M! _! Z1 `& n! r8 Onamespoc_e AA;
! l4 I9 _+ m; \; K, C* _/ C, l7 vfunctio_n showInfo(){3 s  ^# [7 q' H5 |, w
    echo __METHOD__,'<br/>';
8 F3 u6 A, U+ v2 a}
; `* M  o3 g0 H5 x$ h//非限定访问:用于访问当前空间中的成员/ @* M$ V; u$ c) H& @, L' m
showInfo();8 B6 f0 D7 A" s" y- H6 n7 l
//限定访问:只能访问当前所在的空间的子空间中的成员0 ?. ?; R9 `2 D! o
BB\showInfo();
7 [) u$ C$ T4 X: r& o//完全限定:可以访问其它所有的空间的成员" w. u5 O6 s5 M. d# B: v$ K3 V/ M
\CC\showInfo();1 p$ F5 e. F% r) l4 y' O
↑根空间标识符/ `2 _1 V3 @6 A6 ]5 p
----------------------------------------------------------------------------
" l% V4 A! a7 S  z0 i4 o7 W' ~但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
) L; l7 x4 ~4 }& C8 p! K! O- R) n  r
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
% {" H. L4 q" m/ c' `  s& Z( Q  q/ r. C- a4 g! e, t% l8 v5 g
代码示例如下:
: O7 w$ |% b0 w- h5 }
) Y' ~9 o% @4 z/ ^----------------------------------------------------------------------------% R/ n! w" m7 u8 F8 D

1 i/ w& @/ Z, f8 G9 F3 d/ h! I4 T. z3 F$ c2 R
04inc.php! \& T5 r7 r; M6 x/ c
<php
4 J, J" g8 L8 ?* X7 h% |# \3 R
3 @6 x+ D( q/ A8 pnamespoc_e Core;% Y2 o3 t! X% L7 l9 Q! Y" H. j
include '05ou.php';9 l, }$ x  R3 f3 D  V. z8 b# Q
new \AdminController();* q! L! h% ]  S) b* q
showInfo();6 R! y! L" K4 m" p
% n; Q  J- T) P5 H! c+ \% R$ k
echo P;
% ]) W0 y. R* l* `8 H//根空间中的成员,只要类的访问必须加‘/’4 [7 Q2 {2 _  z2 r' [) S) b
----------------------------------------------------------------------------, g1 `) N& p$ M" V" l! x5 L

* R" W! }% _- ?( ?! V, M8 p05ou.php: ^- F% G- `, L% j
<php
3 V( w. l4 G3 ^/ B; dconst P=5;
" ?( I% k  B2 f' _8 v* d9 b8 U% I
0 j, J8 p- n2 U8 Cfunctio_n showinfo(){
3 J& a1 A4 P: x0 ?& T" f% _    echo __METHOD__,'<br/>';
& n1 O0 A$ [6 P. u5 y5 X- O}
$ ]3 M7 N+ h2 B% h* f1 H) d, G5 @6 k( N. v$ N5 y% F
clas_s AdminController{
/ P" u, G- V5 r3 X6 ?    public functio_n __construct(){
& h. O9 q+ J/ a2 r2 T* |  T& I6 M        echo __METHOD__,'<br/>';" s* {# b: _0 @8 F$ p, n% v
    }
* p+ L: q3 x7 L. d! Y* r}  p) D. ]' N" q; i! T! H

6 ~/ x: @$ `/ x0 r, A3 ^/ U第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。. h5 K/ W. I; ^; I+ k( i4 i
----------------------------------------------------------------------------: R. s( |( k6 ^* v) @! _
04inc.php
( W" Z7 q# e" S. q3 s9 h$ g2 S<php
% z- b1 H, g- b6 c  A0 l
4 M5 V! T! S7 }- u) F5 O/ snamespoc_e Core;
: z* M: h" O- [, u7 u. j  |include '05ou.php';
9 v9 [5 B6 [* @8 A; n1 Y% a9 Nfunctio_n showinfo(){
1 a% I4 U& q1 |    echo __METHOD__,'<br/>';* g2 [6 {' ^2 O
}
+ ~5 G0 u2 M1 J/ @$ I& g0 n/ y0 ]: b
new \Controller\AdminController;% A& x  h6 i% D1 i. I
----------------------------------------------------------------------------
' V0 Y0 ], i! B+ |* Y/ k05ou.php) E* G5 v! U8 A5 J
<php
8 d& @1 C9 ?: D# s' [  X3 wnamespoc_e Controller;3 Q* U9 K% T8 `$ b

& H: E$ T2 A( A' H- s9 o4 w4 sclas_s AdminController{4 K9 \% h5 h1 r" x: `3 l: d# j
        public functio_n __construct(){
3 i& |; T2 y- K; P                echo __METHOD__,'<br/>';
$ J1 e/ h5 c7 Z3 ?' {; x    }
2 n) i/ U+ X3 j}
1 d  c! c2 s3 N% ^2 D5 {----------------------------------------------------------------------------# {, @- ?: d3 N% b
* s: Y6 o1 t9 J( A5 J/ u$ y0 M; g
4.引入空间成员:
$ V1 Z$ i, R5 Q8 W" i
5 k+ E! @# F, ?" [9 U) k1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
" e. ?2 H* @  a# C
' G4 x, Y* n" S+ J- Z----------------------------------------------------------------------------
/ x6 i: ^5 p& ~7 I; h# R* }
- l# [& T% C5 b) y2 O04inc.php, }- E- m$ D$ t. T
<php" W& {( \- I2 j
namespoc_e Core;
4 G+ g7 K4 R$ `& Nuse Admin\Controller as con;
! u* ^# U0 O( K9 h# L% ^5 ]6 r. a
include '05ou.php';
% N% E7 S4 \* W& ]1 A
: D) v+ i1 p( L1 M5 ^  @( S" bnew con\AdminController();
1 N  x' F- h; x6 c: E. w# i; b+ J----------------------------------------------------------------------------! `  N& q2 F, b6 v* u, D
05ou.php
& e. N* q1 M5 h) g' D. c3 W% e; F<php
* u3 t- o4 B) m4 s6 Xnamespoc_e Admin\Controller;
0 H. s7 F% Q( `' F# Q; L" q; n/ r, r  k9 z5 q# y) l0 u( O
clas_s AdminController{  f3 |8 c; E8 @+ e5 P4 m8 F8 c1 D! J
    public functio_n __construct(){
  e8 C- G7 Q  G' C        echo __METHOD__,'<br/>';
9 d0 `9 K0 ~7 D) O' ?0 t    }, ?& v0 C( t7 K6 V8 |
}) Y3 Z% f& T* ?7 e! {/ K
----------------------------------------------------------------------------6 w, U1 v: }  f/ p& L
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
( }2 t' g3 Y4 E* m# ~: I- q
, [. B! w/ n+ H& e+ k( R----------------------------------------------------------------------------* L# N$ t& x5 K7 Z6 P

% X, d0 h  z1 Y+ j$ {) F  j04inc.php
) |5 J8 z4 ^6 f<php* r! }+ W# p  l
//引入空间成员类) I! l( H& G+ l7 R7 b

$ S9 c# u/ w" p6 Rnamespoc_e Core;5 |1 e% r* {8 B* Y9 I+ F" j
use Admin\Controller\AdminController;- F' u1 E3 D; A  j5 B8 u
include '05ou.php';
0 }# G8 k" V% W  u( R$ i- t) I  q9 f+ U5 W& O; Q8 P
new AdminController();
/ l/ V. p7 n0 a' _2 u; S$ _----------------------------------------------------------------------------
' G2 k1 \4 s; }3 w' `5 D/ r05ou.php7 s" d9 E: U, t4 ?* K8 |4 p
<php# ?- v& x$ K2 M; C, \2 g
namespoc_e Admin\Controller;
( k7 z4 F, ~; m3 @; |- X- j% g4 s/ i
clas_s AdminController{
5 s* z7 L% z" ]; a: [7 N    public functio_n __construct(){
0 G' v/ b; G% h0 e- K4 @) ]. u        echo __METHOD__,'<br/>';4 U% y* L0 V$ G* k; [, Q) t4 @
    }
3 Z2 ~# V1 |! i}; `( b+ y& K3 v8 Q9 h6 k& ~4 u/ e
----------------------------------------------------------------------------
" S$ x* k) A. b. s: R& a5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
5 _% H4 z( X* Q" g3 Y  I* y. Z5 P# Y8 X

5 _  H2 q. _) b9 N) ?: Y这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。' \5 d5 u/ E6 i) T

5 U$ `& ]; P& W6 k' r9 }7 y" A1 F
2 X& K, @& s) {" W' r9 Y) j5 h: @3 O0 X. D) {

9 K# Y+ N" ~9 k  X- C! W: {% j/ X' r) ]- a+ s* b# q4 e
0 {, W' p* ^7 h/ v

最新评论

GMT+8, 2024-4-19 04:09 , Processed in 0.144123 second(s), 25 queries .

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