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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:# M# x8 V4 F4 P1 n6 D3 S% c7 v

% ~; I  J5 Y5 N在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:& D' R9 b2 }( l( [( G  j3 ^

2 A8 i- @4 T% B) J- J 20181201105307520[3].png
& E0 q) ]( W1 z6 Q/ x) h
0 u  B! M/ O  U( [; f" t+ ~( \2 |8 m我们来详细的讲解一下PHP中的命名空间:; }9 H' d+ h. W& D1 L$ E

: {. x- S$ ^6 L. r- ~8 v6 z语法:namespac_e 空间名\空间名;' l' G4 R1 Z% Y3 B
! N2 r+ M& J- K0 [% q, d
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
7 B5 g; r8 E/ U) k( i. D9 D1 j% L" N6 \3 m4 X0 }2 [' I+ ^9 [( z+ v9 f
----------------------------------------------------------------------------0 |" G! w$ P, A' b' m

! V6 s2 U: x! |, D<php
6 G+ ?' ~+ m, P* e% N# X+ H" u% k) `3 d) F* N4 {) t
namespoc_e AA;
/ T5 b: o( i# T' G; f+ |" Tfunctio_n showInfo(){6 t% e: f4 n8 i) |  a
    echo __METHOD__,'<br/>';
5 f+ U" H/ O+ W7 N}2 L6 b" c* Q% A7 G
showinfo();
: G; [( Q- g( }3 m# t3 {
+ j% ]6 `$ x1 H4 n& lnamespoc_e AA\BB;
6 H' Q0 l% u1 U% h; K8 r% U
- V( J1 R2 ^, k% g$ Z/ d  cfunctio_n showInfo(){$ D' Y- N/ V2 B& f
    echo __METHOD__,'<br/>';
' s* y/ h9 i; t% r# r( Y1 W3 d}- y, ~1 c. B8 k4 V/ i$ [
//showInfo();
4 g9 @, Q( B, N: l----------------------------------------------------------------------------
/ h8 ]$ h9 A% r# z& C- s9 ?2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
% P5 B! K/ w- l1 e2 v3 V( q% c) ]; K6 T' |9 g: }! x- @  H
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。7 @4 F( U5 S$ `2 g" g
1 I: v- [: J0 n# ~
----------------------------------------------------------------------------
% _. z6 J( p5 v2 G3 n, J/ a0 @0 ^4 p) l7 E* |* B) I( D( y
<php: B( }& M; s/ R/ ^1 \$ R! S
namespoc_e AA\BB;
9 h) d7 n: ]0 O+ ?! cfunctio_n showInfo(){6 j& I+ N1 M8 K- W9 B8 ^
    echo __METHOD__,'<br/>';2 T8 Q" D0 l) a; f2 G3 T
}
4 \& v. m* z: znamespoc_e CC;
; E! T, J! P# C0 x1 w4 hfunctio_n showInfo(){9 J( h6 f* e7 {3 Y, s
    echo __METHOD__,'<br/>';6 l" r  j6 M7 X/ l# T+ g5 ^0 t
}
6 n, d) e8 [- u7 f6 \. a5 h2 lnamespoc_e AA;% L/ s% W9 W2 j) s
functio_n showInfo(){( B8 R; D6 k, K  L
    echo __METHOD__,'<br/>';, F! n5 \5 i7 Y  u( k
}
6 ~4 ?# x' }% W' a) j; X  r8 B//非限定访问:用于访问当前空间中的成员
( g: A' K1 g& `showInfo();7 w! V: x$ p# j* X
//限定访问:只能访问当前所在的空间的子空间中的成员
0 {$ j) u* H+ _, w# `BB\showInfo();
( g' p" c$ O, i6 h, ]% o//完全限定:可以访问其它所有的空间的成员: ?6 }9 v8 G4 S; t0 r
\CC\showInfo();7 z" |4 C' D: @( L6 H, }5 k  a5 L. O
↑根空间标识符
& g2 L( c3 D4 T5 T7 @7 d' d+ M) f3 [----------------------------------------------------------------------------( r1 r8 F( H6 o$ `. @
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
# a5 ], M8 F+ E0 w8 X
) B4 a1 q2 ^' Q- G  g8 d当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)- [8 @1 X# @1 {0 \) I
2 V8 ~. Y3 p0 F# _% l% f8 o8 @
代码示例如下:% `, [' i! L% l3 A* f( |

2 l" H0 c5 J6 @. X- B) g* e8 e' W----------------------------------------------------------------------------: k, M  F6 r: ^2 Z' R2 P2 u
7 ?# D% F+ O) c2 D& M0 Z
6 ~8 H& e8 [2 E- |9 A8 j& J, w
04inc.php
2 z& v# _) N  T- ^# h0 |<php
9 F7 o, P/ b, I; N7 v9 O9 w5 w/ I; U2 O
namespoc_e Core;! P1 V" b& D7 r
include '05ou.php';8 j' T# `5 |: m+ s3 X
new \AdminController();
' \  a1 @0 x# N' O6 zshowInfo();* D9 _8 D) ], b

! ]0 D8 L5 E2 L% t) \4 B; J$ pecho P;! y* K2 c  D( ~
//根空间中的成员,只要类的访问必须加‘/’
3 d7 O0 V$ X) D8 j----------------------------------------------------------------------------
# K( }- w+ T2 A1 V( K1 n, d( i0 ]2 f: s$ _& x* {/ f' Y* d/ `
05ou.php
, h, F; d, K2 ^2 x; @, C0 ^<php5 n+ [8 p% d( ?$ H/ c: z; |
const P=5;
$ ]7 q4 P' E5 [4 O2 H4 w4 G7 r8 `* {# M8 Y( R) x' o5 H: l
functio_n showinfo(){, H+ M; P6 u% ]/ N% D- d, o- z. b" ~
    echo __METHOD__,'<br/>';
3 S/ T2 l# ^( I  C+ M}
: w" n( v& d! m, `% ]4 b$ ]% v
clas_s AdminController{- q$ y3 a5 t1 N  [- C  Q
    public functio_n __construct(){
, F6 _) \; o6 o2 [        echo __METHOD__,'<br/>';
* J  h1 F5 ]) C& i# x    }
7 @2 n7 M* u' p7 `}
$ ?  P$ B+ L9 E# q- n' Z' d' Z! l2 W4 y6 M, B& J/ `8 l
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。9 `5 @/ m* e7 m+ a( F
----------------------------------------------------------------------------
8 v+ K/ W, H) Z/ L) i( O! R0 T1 J04inc.php
- J. Q" h( U( w1 X<php
; w% B& `* g5 h( S, X1 Z
4 l, c, V$ n( n7 B$ j) J$ E, {4 Enamespoc_e Core;0 u4 v5 C6 U  j0 R- c5 X* g+ r
include '05ou.php';
5 m, _* L( _& Rfunctio_n showinfo(){! @9 X. F( w5 M7 }' Y3 A- p/ Z
    echo __METHOD__,'<br/>';
7 R" e  t9 [4 s! ^}+ d+ K' H2 h* n: D+ X  }

7 N! ^& K( R2 z. L* ?. Ynew \Controller\AdminController;
! z* a8 r) M! b5 v1 p+ Z----------------------------------------------------------------------------% S' g$ i0 B. c1 r' d
05ou.php5 Z' C; i6 I  K/ ^& K
<php$ Y( E( N! |  U, A4 e
namespoc_e Controller;
! P2 ^8 [# Q$ _+ X5 @  {' z# Q+ M* k3 O0 S* d% D4 ^
clas_s AdminController{5 M1 f5 ?1 M5 ^5 Q) x4 a2 D
        public functio_n __construct(){
7 b% i- [8 s+ J                echo __METHOD__,'<br/>';
( L' v4 p# c- H# Y" D& G    }
/ t( _  y2 Z+ m# g}9 R# z  d! \5 r4 D
----------------------------------------------------------------------------
' x4 w- j+ N& e0 h
# `. c" f. m0 t; i1 Q; ~5 F4.引入空间成员:
& e; k( G3 ]' q! A, k0 w2 s7 G
) w  E* u8 j7 ]9 j5 v1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
5 b& M0 V/ ]% L! N# x! U- J/ Y2 M% y$ s( v* V
----------------------------------------------------------------------------: }' {/ k2 W9 l4 U& M" _* \9 G

& Y) ]) Q+ T- |3 p04inc.php
: n! G2 V, s2 A% ?4 v<php* w( Y1 P4 _& V9 Y+ N5 p3 @
namespoc_e Core;. @  w3 F; y5 ^! Q( e
use Admin\Controller as con;, M* v: S1 B3 p; B6 g: H( J! P

  ^; ]& r5 q  V# X" G, kinclude '05ou.php';
) }3 R% {. r( W+ U& W, ~8 c+ E
new con\AdminController();4 l! A/ i. y) S, q8 x
----------------------------------------------------------------------------# T/ V2 L! m/ y! ~: c
05ou.php
9 O: u: u* h0 x# F2 h/ X2 r3 ]<php
7 V5 O. _# l; p0 V" R; I2 Gnamespoc_e Admin\Controller;; G, `# @" u! p

) ~) f, |6 R! Z$ ^& Sclas_s AdminController{/ Y) s- A0 H* n" b
    public functio_n __construct(){# o" l& S! n5 v; G8 A
        echo __METHOD__,'<br/>';
2 }! @, A2 g( G    }" U+ m& `1 L( s* U+ m' d
}
- H! }5 d2 L- Y8 P( x% |----------------------------------------------------------------------------6 \# w$ O) C, K4 u' w6 U
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
- l$ b. S2 `- }% l$ e% u5 G: T5 R" V1 w( F+ q  Z% `- ~
----------------------------------------------------------------------------
! W: _! i6 m$ H
: k3 C" R6 z- F2 P5 W04inc.php. b& l/ x9 o7 i5 {. q
<php) M- X- E1 v: d/ j
//引入空间成员类
5 p: o# g+ D! c! J. F) x: c
  a& r# C2 O" e/ L  anamespoc_e Core;' `: s6 K# D* O2 y2 [  i6 O. ~& q/ s
use Admin\Controller\AdminController;
4 L7 M5 s+ g8 |3 Y6 t/ x( }include '05ou.php';
2 p+ C( ?; g& u" _7 ^2 O$ f! L" _' r5 g/ M! O
new AdminController();
- p6 B% ?% d5 c% Z4 @----------------------------------------------------------------------------
$ P8 z+ ]% [+ m: h05ou.php
! L2 ^* V+ J# `2 U9 \( T) d" c<php, y0 Z0 u% U' T
namespoc_e Admin\Controller;
7 t- a) \  Z' k! F: I
8 Y+ O& I- i3 e( `clas_s AdminController{
. j. |) z# j5 Q% X% Z    public functio_n __construct(){
. E" v- D& v2 y) M; s5 U" t        echo __METHOD__,'<br/>';
4 r  a' L$ F0 t) `    }1 o& z+ K, M' H
}! x5 _, }" H# D! H! N
----------------------------------------------------------------------------/ L( D/ \0 b2 `
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
, X- _5 k" A# d4 Z0 o+ E5 D
* ?& A3 a* m5 t. l0 `7 w5 g( D0 l7 y% `* H& }$ u4 ~/ m9 @+ O* a
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。$ V6 I2 U7 y! u( W* M

: k% F9 R% y( D9 R
2 X/ @6 L8 y6 C' |2 q/ J+ P1 l4 K9 A& t8 {
( L+ {. H' |5 m" R& g
9 |$ O1 ^2 t+ F% d1 x1 \% }
/ r, ?% y8 Y. J5 O

最新评论

GMT+8, 2024-4-18 05:09 , Processed in 0.130667 second(s), 25 queries .

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