cncml手绘网

标题: php中命名空间(namespace)的作用和使用 [打印本页]

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:+ U- k! c) _- k/ O/ z- d
; e9 y( B2 E( x/ {
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:3 Z! w  q2 q# [/ a" e3 t3 q' I
& h$ W4 ]" S2 k  R! q7 S1 U
0 }- ?6 _1 W. u" W
  Y+ w$ F3 L# n, x8 a0 D
我们来详细的讲解一下PHP中的命名空间:
7 y. f7 d- c$ ^1 H6 v3 a& z+ k, D/ R) c+ R" q. M
语法:namespac_e 空间名\空间名;
1 N0 x4 A$ Q! x* R# C- e
* P0 _5 e5 `$ |, N7 O说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:4 k1 P# |( u# A' [( F$ V
+ U! Z& w# ]; s8 P+ g& h7 M
----------------------------------------------------------------------------+ o* l7 A! h0 S+ D1 U

2 q2 ~) M' Y  a& r<php
+ s- E3 u. y- @6 J" ]
+ i. J. G$ a5 u9 V% C# |: p  p: jnamespoc_e AA;
0 x4 l: }% m3 t0 H1 T- g+ G- Cfunctio_n showInfo(){
7 d8 q9 w2 V' G) s4 F2 w2 n7 L3 C    echo __METHOD__,'<br/>';+ I8 ?" b3 e1 L( g! ?
}/ L. ?3 d" X) P( Q
showinfo();, O0 K! Y* r2 P! u$ b. r! E

5 r$ y! `5 X& j! ^2 r/ J2 mnamespoc_e AA\BB;
* s6 _! M" d% ~* c9 i& f. j9 g' \* V
functio_n showInfo(){
, A! v& n8 z7 I* ]% x    echo __METHOD__,'<br/>';
4 [& K" n4 _! a4 |}4 i9 O' L$ c% x; D' ~  z
//showInfo();- c. F: E7 W& F" Z
----------------------------------------------------------------------------7 N9 D- B* p) l9 z+ z4 n+ O
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' Q2 F$ ~! ]% s; {8 z4 u* C$ D4 m

/ H% D" |- g6 ~* L4 U3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。( v" W& ^) L9 E% ]2 m# i& |" t
& A# ?- ?/ [3 w- J' C
----------------------------------------------------------------------------$ ~( P  P9 q4 h* v4 I7 K

* Q; T/ v, r6 R<php
) p6 b9 `7 Q+ Rnamespoc_e AA\BB;1 W6 \. T' U3 \7 {! j
functio_n showInfo(){3 l8 h6 ~8 j7 b- P! w
    echo __METHOD__,'<br/>';
0 {8 J: N* h  G8 t# Y; z0 A& ~}1 K( J; b7 i: w. p
namespoc_e CC;* u0 W0 K& W. g* }% j
functio_n showInfo(){) U, s5 Q( W& {: O3 L& Z
    echo __METHOD__,'<br/>';1 i+ J5 s: [2 Q! L& @; ?7 R) l
}
6 C/ H- l* A0 h1 }5 g. F, ?- w5 Lnamespoc_e AA;7 p: |3 x5 E) z0 }3 N$ ^
functio_n showInfo(){6 E' k3 {+ `, I9 j2 _
    echo __METHOD__,'<br/>';" }. Z% K, f" T/ p
}* S: \* F7 r0 s6 p" c% x, \5 z* d
//非限定访问:用于访问当前空间中的成员
& h2 u! u+ f  MshowInfo();
. j; R6 v2 o2 D# b  c//限定访问:只能访问当前所在的空间的子空间中的成员
  {2 X/ U0 x2 A$ {$ K6 g1 w5 qBB\showInfo();
7 K9 P0 t) Y9 r+ N6 D- I/ ]5 _1 R//完全限定:可以访问其它所有的空间的成员
5 p4 z: m5 ]5 h8 P4 L, C0 d\CC\showInfo();* y. x) X4 [" G& P: Y! D! f
↑根空间标识符. f0 r) p. J, c* g# k
----------------------------------------------------------------------------
2 ^- z( ~8 C8 f/ w1 d" y) y但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
$ Q+ p* i  g- y6 M4 P  X. ]6 m4 I
5 E; H5 ]6 F) Q& s当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)7 @3 F; e+ @: M  ~  i7 J

) F9 f- e' H2 f. ?( q) _代码示例如下:% ?4 m( V3 \) Q; |8 K* [6 @1 d  I
: k. Y" s  L) n
----------------------------------------------------------------------------" O, L3 |* V6 A+ Z
( C+ V8 }2 d9 K

, l) n5 o7 X4 q8 U, N$ f04inc.php4 a: b5 y* x6 M
<php
, a8 N2 ?8 j& {7 ~
9 P/ ?9 O7 v# ~namespoc_e Core;3 P/ @7 Y* O. p$ X# T& G
include '05ou.php';
+ i" K6 ~5 z4 B- nnew \AdminController();
/ A5 u% j7 L) b2 BshowInfo();
# M( W4 v& C6 T9 E6 |) s- k
; t1 o* X/ h  i! a8 t& \. u8 E9 ?+ Oecho P;4 }; |% W% b1 J5 F6 R
//根空间中的成员,只要类的访问必须加‘/’
% @- U9 G) F# u  X. J----------------------------------------------------------------------------
0 B( l- e2 z2 D3 Q+ a' L$ [6 e) a, ]9 Z" C4 n6 T+ \! Y' d! b
05ou.php
- l% d. e( R9 F& A, y9 ~0 v% W<php! S5 F0 ^3 S9 q; _! Z( g7 c, X
const P=5;# ]0 X4 D: K5 ]3 k. h! }; t1 ^2 g/ H
9 |/ \  S( j' _/ q) E4 F; ~
functio_n showinfo(){$ y6 ?2 ?6 s, L' S+ z7 E; ^7 D
    echo __METHOD__,'<br/>';) D  r! e$ r! n  g5 m- i
}" w1 L0 x* @6 {0 X# Q
8 J$ H0 [/ T$ G6 `  Q7 l
clas_s AdminController{# o, z  ~9 t9 x1 G
    public functio_n __construct(){
, Q, @7 t7 r9 ?  y2 H; X5 v; `: M        echo __METHOD__,'<br/>';" s' u  H& g" Z( l
    }
, X+ B& @* ^. r/ s7 u# m}8 d+ {( i# d7 O) w3 g: ~7 s
# q: g1 G. j- w" t8 t
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。* n/ U' e* ]9 n
----------------------------------------------------------------------------
7 `  x% }" ]/ L' h04inc.php
* h* ^; I( J1 k7 J( y1 g, h2 N<php' J( a' u1 j" U2 k& }

  ]8 d$ W; {3 O3 k0 e: e$ enamespoc_e Core;
; ?$ b7 J, z3 \  W6 M( ]% ~include '05ou.php';
8 I7 ~# q. x7 [6 p2 F$ wfunctio_n showinfo(){
: k* R$ U" ^% i; p    echo __METHOD__,'<br/>';  t4 l# h0 y9 k, V' N" X8 W
}
9 s. l) o- p- }9 V8 o7 @  n4 n
6 C; n( d# M# e/ d- w" |new \Controller\AdminController;6 R5 y& a, D% w' ~" T: D) `$ y
----------------------------------------------------------------------------' X( }8 J2 K$ Q3 N
05ou.php
+ B- T+ L, @" `8 W' h<php+ q- o' Y. F( X7 o9 a
namespoc_e Controller;  x, o7 A: i4 ?' u
( ~. D; m1 |1 `1 n
clas_s AdminController{% V7 W' @+ q! J' Z  \  `. _
        public functio_n __construct(){( T2 E, m8 j  E% f% v
                echo __METHOD__,'<br/>';
* N& i+ N4 Q3 n    }. {2 f1 f; E% i
}
/ L9 \4 Q. F* ~9 E5 L. y----------------------------------------------------------------------------* w) H4 Y, L- ~0 S0 L1 ^1 }6 l

* {" Y+ N/ W( r% ?$ i# f4.引入空间成员:0 t" ~. {- |2 ^( ^
) V$ [4 o' ]7 z4 Q; |, Z4 j
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
( F6 M1 J6 j5 n& p; h: Q! [( D& d, D1 B' `& o, d4 \4 Y; O
----------------------------------------------------------------------------. ~5 W, [0 l0 y1 n# r1 P  x

  g  P4 r: w. [# W04inc.php) \$ ]) J* `; H; g! U
<php2 E% o2 W3 m: h
namespoc_e Core;
2 t- a% u( S1 v+ w9 a: |/ Q+ Suse Admin\Controller as con;; ^2 N5 N3 T3 o7 \2 i' u
, L  C+ P$ a8 j3 d; R& }5 k
include '05ou.php';) B* _: V# I" E$ F, K% F: x

  z; i' U; F% Wnew con\AdminController();2 F7 U" r4 s) f' D0 l: T' z; E: n% B
----------------------------------------------------------------------------3 q# C* R2 i9 a7 v
05ou.php
) Q/ ~( Y% I/ y* T8 j<php2 Q' E1 ~" J! z1 S3 j/ D. C
namespoc_e Admin\Controller;& H/ O0 u8 S: ]3 F% U& C

( {) J% }1 Z+ W4 V' q; w3 [% P/ L) xclas_s AdminController{
6 x6 B: o8 }% `8 Y' w4 P    public functio_n __construct(){
, e) J+ Y7 h% _/ _" B        echo __METHOD__,'<br/>';9 J8 I9 U, }+ w! S% ^, t8 h% `& `0 L. ?
    }5 w  S  o9 N/ m2 ~5 l
}
6 {/ S3 B1 V! w( X, X----------------------------------------------------------------------------
* e6 X8 }) ~. y$ ?5 ~1 K$ P" b9 P2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
! M6 K) B. C6 Q! v( K
1 l( ]8 }( L# O, F6 q2 o----------------------------------------------------------------------------
5 H9 g5 r  \8 o7 e. z
5 A9 {" K+ [! C6 M! T" O04inc.php# t* b5 ^0 B& M& Y. B2 q; }* c
<php
5 Y; h" r: Z. f! m" U( B" b//引入空间成员类
% ^8 {; d" ^, w% N0 b; |5 A! E1 j( m1 l4 G
namespoc_e Core;  [) ?* u7 j- s8 N
use Admin\Controller\AdminController;
3 ]! T; Q$ t7 z& Oinclude '05ou.php';
2 c8 O% e/ e/ ]+ X( n% A' C1 j4 j7 f. `# n) [
new AdminController();
2 P* ]  B, s6 Z& B4 n  h" u8 _6 J$ Z----------------------------------------------------------------------------; y6 l1 b# U% V: L* q! ^4 y
05ou.php
0 ?; [: V3 x% N6 \- h1 w<php
3 ^2 e1 Y1 @! |( z) n8 Tnamespoc_e Admin\Controller;  \  }8 V9 e0 a" N8 b1 {- g
- J7 I4 `2 X: N- `
clas_s AdminController{& o% I% h- \0 c- B7 f1 j
    public functio_n __construct(){& z$ s% J/ f( b$ s6 M
        echo __METHOD__,'<br/>';; G6 j' A$ t& v( g/ |& r6 p
    }
0 i" G" o' p* C}
% l* }3 s: ?- x: F: L& H7 {----------------------------------------------------------------------------
& f! n! d* `- w* e* Z/ s5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
8 u3 w) J* C" a% g( G% m( {0 }6 x  i2 K! t

1 o4 A# Q7 r8 j" f/ z5 [这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。+ i5 p/ g, U5 }, }9 j$ g" n+ k' u
1 e4 Y0 [; F7 t" f* a7 W9 }

7 q' v' u' h0 \/ O
, w, h. m( \2 g3 E6 ^6 V* ~' w; h( [3 ?6 p
/ N! g) g' C- k. g3 M- q
* e# k% E' @% y5 u2 }5 }! S





欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2