cncml手绘网

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

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:
! B' @6 D% k$ h( K7 }
9 q5 e5 L2 X' h# r; j在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
& E* b2 C& G* ~( q" d
& d* f" l, Z: f . i' d& u8 u* @( l/ a
3 h2 I: j7 Z  M7 s8 g' I$ e
我们来详细的讲解一下PHP中的命名空间:
$ ~7 r8 R, G7 c( X5 F" I
1 ?1 b& P3 J& a. a  F3 g语法:namespac_e 空间名\空间名;
5 c- o7 f5 h' N5 B5 b  ]( [/ f* ~- Z# I% i- |; E) r5 N5 `- X
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:& c/ r- r# a8 O1 Z9 e/ b
+ h  I+ e7 H' ~% [5 X9 ]3 Y
----------------------------------------------------------------------------, Y" a* x: \# w. h
- _# z6 @: q8 m" b( N0 ?. h7 V
<php5 y$ H' ]8 y7 x# a) j

$ y  D: g2 W( }  a, t9 K5 pnamespoc_e AA;9 N" N7 d0 `- y2 r9 X& [) R7 I
functio_n showInfo(){
& q% K1 l( b& D7 Q! _" Q( S    echo __METHOD__,'<br/>';
3 S2 {8 M- O. J  e  k}
5 T+ ?6 j* r+ @1 {6 Vshowinfo();9 ]4 ]' a$ E: t. b  [. X9 I8 K

+ g: @- x0 e& cnamespoc_e AA\BB;6 _1 W& u+ K! d

4 j3 W3 K0 K- U% nfunctio_n showInfo(){0 E6 v8 A- ]! W4 ]5 d  C: O
    echo __METHOD__,'<br/>';
4 b/ _0 l4 i4 k: ^2 R/ u; K6 p}8 {' l* ^. {! X, g; d
//showInfo();
" C# d5 K/ G3 E  k----------------------------------------------------------------------------2 |0 r! k$ W$ t) N
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)( E! ?0 r, s  g9 p6 A8 x
$ f- n8 r& W& G' t9 w* b
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。7 o9 F8 F/ j+ p

2 ?0 a0 |1 t' [1 P  z9 V+ \- G----------------------------------------------------------------------------! o: q7 Z( ]: ?5 W& S
* \0 M1 w8 A% I( x
<php( ^4 D, @2 \0 Z: {
namespoc_e AA\BB;$ }- ^: @( B' k. \, Z" w" r
functio_n showInfo(){
% g+ k) a+ c( r. ?    echo __METHOD__,'<br/>';
" d* S4 c3 R* k4 T0 s1 T. t}
+ k" ~) U2 z/ O& S  `  snamespoc_e CC;& V+ N' {( h7 r  W
functio_n showInfo(){
/ @) {, L$ O0 k) b; ]    echo __METHOD__,'<br/>';3 R/ {3 I# m  `6 W) y7 l
}4 V) B+ O5 b0 D$ ~0 r
namespoc_e AA;
5 F" L; ^% d' n) y1 F; A# Dfunctio_n showInfo(){
) g# i$ k" o2 a) z/ U$ a$ t2 E- m3 [    echo __METHOD__,'<br/>';
/ M; w; v4 l1 @1 s2 S}0 L4 d' G& M( Q6 Y+ s3 [
//非限定访问:用于访问当前空间中的成员
/ P0 H0 C" [2 v' [# WshowInfo();  f+ U! [6 P! }) A. ]. ]
//限定访问:只能访问当前所在的空间的子空间中的成员
+ k) Q. \2 s; S4 \" `! C, ^BB\showInfo();! c& ?; [+ D( D4 u/ q" d/ w* K
//完全限定:可以访问其它所有的空间的成员: A6 j- W- M" _/ B
\CC\showInfo();8 f2 L' B: @! U, @5 R0 J
↑根空间标识符( t$ j  T/ ]/ a
----------------------------------------------------------------------------
" D2 Y5 V% U6 v( E2 q2 g3 z但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
) J- \) J0 u+ ~! Z) t$ i, V' Q1 d7 c8 Y* j8 p# t
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 A0 v9 _( T0 K9 C7 E# M6 P( G
% e, `1 S3 T3 h( Z9 h代码示例如下:
8 O* l2 a# }; ^5 }2 p% p8 y* R3 P; v. m! C* o8 J% M
----------------------------------------------------------------------------
1 M2 k0 Z) f1 A: H& X" `$ e/ z- s4 _+ h+ U: A5 a: e! n* W/ y: N

6 A* b7 l% b$ G/ g04inc.php
& V/ `5 w0 @! t% I6 k! p& U<php
6 G) n6 g. `) y0 l" C6 q6 [) R! I! h2 g, q: Z/ G( F
namespoc_e Core;
9 q9 J4 @, |6 p5 ~7 B7 v: \# Z. Uinclude '05ou.php';
9 [4 H; D$ C. v2 Enew \AdminController();
5 h6 n! u7 I# RshowInfo();
. U2 R8 V3 H( |. G, K9 i1 n& I9 q6 h
echo P;
) ~! }0 B5 D5 i: N9 P" z- c//根空间中的成员,只要类的访问必须加‘/’6 G' h4 e+ ]9 N0 o
----------------------------------------------------------------------------% ]0 X! E, o# A; H9 k

* z7 }, q. ]4 M' n. q0 s05ou.php
( J. S( h* j( N7 x<php$ ~; L; O6 Y. U3 I1 N2 L
const P=5;
) r9 [! y  T& q7 r# q& [% O9 a) Q  ?" K& V! A5 a7 K
functio_n showinfo(){
4 n' q2 D7 o( i3 q    echo __METHOD__,'<br/>';7 k& }, P3 B" a$ ^
}
, N- L) \( [9 b' G6 ~
; j$ A3 Q# n, D1 @. e) F5 P* Y. ~clas_s AdminController{9 J+ R0 Q- q3 b: |$ _* G5 f
    public functio_n __construct(){0 G. i( u3 ~( Y, d
        echo __METHOD__,'<br/>';! B9 e/ L, n4 F) x9 I
    }
+ @+ L8 W: H) o0 |2 a' r}% d9 P$ A! F6 A; n0 K  e' j
8 ]  p% a/ H0 \. o0 u5 d5 a9 f
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
. R, h9 Q% h) \, k: {----------------------------------------------------------------------------
+ R1 g& S" k/ E9 l' l! i8 `7 o" A04inc.php
5 `8 e. x+ x# W* B4 Z<php' t/ h( x2 l1 b( `

0 ]- |# w5 ^$ w6 n$ m5 T$ Q4 |% gnamespoc_e Core;
! S  z6 i4 `. z" @9 t( ?$ Iinclude '05ou.php';
" f1 ~* i! W- a* C$ Z- K+ Mfunctio_n showinfo(){* h4 L8 ~8 K: Y; Q/ |/ J
    echo __METHOD__,'<br/>';: h; m& d8 I' e5 u: r$ P+ ?
}9 e0 e) S) X% h' b! h
) Z5 M, f+ h6 w
new \Controller\AdminController;$ z/ P8 p0 t( {6 P( T3 R9 J$ G; B
----------------------------------------------------------------------------
0 o% f! ~) j1 h, Y* U# s" t2 x05ou.php2 _% l' ?: q8 h
<php
  a$ ]. ?. U- Z: ?! Bnamespoc_e Controller;# w5 u2 I/ Q! B$ z
; V" ]; ?* \# x; ]% ]
clas_s AdminController{
" s4 E# ]: ?- T        public functio_n __construct(){0 d4 P! q$ Z( }- p
                echo __METHOD__,'<br/>';) m. \- V& b6 T+ c6 m
    }% c" p8 |9 @4 E: C, W5 p
}& `! {' c8 b' L4 _
----------------------------------------------------------------------------2 W2 ?' W; F; }
- ?2 A: z- L7 j& c, Z7 m
4.引入空间成员:# y, q$ |. s7 t9 p

/ @  c- W0 E) O6 }5 }! F6 [% _1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。' o2 Q7 M4 A- i* t8 C3 `4 r

6 ]) s5 ~( L: Z; u  \----------------------------------------------------------------------------. O2 x7 _& J8 r  L* x$ ^

3 r: E* O% {8 P9 L04inc.php
- @) A2 M6 o2 f; }9 L. n<php
- N% i1 L* u# H' Hnamespoc_e Core;
! H6 p, ]& G" l1 F3 Ruse Admin\Controller as con;
& g8 x! Y( {0 ^
( D* b5 ?1 v9 o, M" ^5 E, |include '05ou.php';) C5 S0 A$ g  I2 W/ K& y& F  `
, ]9 n  ^+ k: F4 u% U; e
new con\AdminController();
5 |9 w3 U6 q; f/ g% r- c----------------------------------------------------------------------------! E7 ^* |  ]7 p$ e$ B
05ou.php
4 [! B; A$ u$ z4 n  _1 u<php, ~$ m1 O$ L+ H$ \! S5 @8 o
namespoc_e Admin\Controller;
. \7 N! Y2 [4 C5 x, Y' G4 q3 F1 Y7 u9 Z
clas_s AdminController{
; Y3 ~, t# S& D6 M, V) I2 w: M    public functio_n __construct(){! n9 {8 t* y, |
        echo __METHOD__,'<br/>';
( s8 E7 c' ]# o7 d/ b8 s" A    }
( v. h. H. H7 `+ _2 g* p}
# j3 e% h0 n) e8 N+ d. C2 B. p" E----------------------------------------------------------------------------
! H7 Y; n* f( |# \. a0 o% K+ t; v2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。1 i, c+ J4 Z% e& p8 A

  O! d6 {3 y# |% [' K1 v----------------------------------------------------------------------------
: Q' t/ ]7 K9 H
! p4 Q8 W+ D# G' A0 A# f8 M5 M( k; ~04inc.php3 A! D2 j4 r! x/ p
<php6 n/ C8 r5 n1 @
//引入空间成员类2 P0 ]) L/ e3 Y) E: P, m
- ~* n: Q/ @: }% Q% d9 }
namespoc_e Core;
  ~5 e* m% f5 I( fuse Admin\Controller\AdminController;/ T. ]( v& s3 i, \) m
include '05ou.php';" y( \7 M$ G3 u* `& r
9 Z# g& Y, `! r) V* s' C
new AdminController();
) ?; O/ b& i" {$ q$ d----------------------------------------------------------------------------' e! {3 x: L, M" Y6 x$ t
05ou.php
; B0 B: T1 ^8 ]& z0 `3 w; h  g<php
5 M0 k" T- Q. v5 ]7 U! I2 ?, w& enamespoc_e Admin\Controller;1 T6 c; v+ H% c1 `

# b4 D5 [" R" i2 k$ u5 Gclas_s AdminController{
+ u3 R+ {0 ?4 o' W* j# a    public functio_n __construct(){
& C+ q4 f% A8 P7 K3 {) D; ?  F        echo __METHOD__,'<br/>';& A+ B% E% K1 f% K- e, v
    }8 B. t: e- ^  m( X
}
" P- ?# N7 `) K: c----------------------------------------------------------------------------& G# x( j" w2 Z  i
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
& V7 W3 `& h& T9 O/ V1 |$ b- J- x$ C
( {8 K3 j: \2 A# v4 B
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% E. t1 R( o3 M! z
5 j% \+ B8 _" G! h0 D
- L  v- F8 {* `9 t& [
4 G0 P' G) ]5 e2 o- D
7 a' U2 E' T+ j) T1 Q$ ]8 v  i5 ~3 n! ?- Z
% r5 |& }) o- q+ B





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