cncml手绘网

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

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:
) B+ W- x1 y; @- Z4 \
: r# @( G& _  [' B8 W! q4 J在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
. e' P- I9 h1 Y' E# c% p1 f* Q: \& m+ N; ?
# X+ I8 q* y" B# ]7 C( b8 F  H

. }4 y( |/ ^# y' O我们来详细的讲解一下PHP中的命名空间:
# K# k/ D3 Z' h' M) W
% g# z1 Q4 F# s0 w语法:namespac_e 空间名\空间名;8 \$ q- O! \1 s0 m

+ p& u( Q. L7 w1 C说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:/ r  s2 K( L7 U6 B% n  {+ S
2 @9 }8 l* i0 t  ]* |$ z
----------------------------------------------------------------------------5 |+ W& Z9 @; j8 Z- `
4 N3 N& e* e% u% O
<php1 x" Y+ H. R; M! ?5 d* q8 z

, a! P6 E* R' k7 n0 v* D& ^namespoc_e AA;+ [2 C" l$ i/ E" _
functio_n showInfo(){3 y. h2 m/ ]/ y
    echo __METHOD__,'<br/>';
0 z+ m' f, f: m" }7 n}
/ M6 t7 F2 C/ x6 m& e" |% ~showinfo();
5 Y2 |! a' f5 j; ^- |
1 s! j7 i2 w" U; Znamespoc_e AA\BB;
9 E" y! w3 }/ @+ c% I9 j
  U1 `6 `* F5 }( |: @functio_n showInfo(){
* x% i1 M% r" d0 g" B  p    echo __METHOD__,'<br/>';
) }+ B$ z9 b6 K}
+ j0 {5 x; y8 V7 V) v//showInfo();% S3 y" s) S3 Q3 a; U- a
----------------------------------------------------------------------------. C5 p; x/ o0 x; `
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
+ @" B3 {! N' B# p1 V
2 {3 _: }% d( t3 p; N- Q1 n+ u3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
+ r) X" }0 p3 C3 A
5 M! I3 ~0 A( _----------------------------------------------------------------------------6 f3 P$ U, L! U2 |% }

' m  r2 U- x! Q( }+ M4 B) B- @<php7 E9 ?1 {/ D/ s/ P, @
namespoc_e AA\BB;
/ z+ I! d9 @! d: E; v% Sfunctio_n showInfo(){
+ @" I  B" f/ p/ Y& k    echo __METHOD__,'<br/>';
& `# N+ X; X5 `4 n  H- Y! q" Q}
5 X: Y. ]" b8 C1 a$ A$ onamespoc_e CC;
+ l: Z- d  n, T9 l! ^functio_n showInfo(){3 Y$ o& a$ n1 N9 H6 s
    echo __METHOD__,'<br/>';! F3 l% d: D1 V$ ~2 w) ]
}" H, D4 i/ e2 R& {2 r* @3 u
namespoc_e AA;4 |) R$ `/ f; }& q# |
functio_n showInfo(){
1 g8 N! J: S* y% ?' H    echo __METHOD__,'<br/>';
5 P/ a& B6 h- I9 x; t}8 b/ v8 r, M  C  w, V7 ?
//非限定访问:用于访问当前空间中的成员( C/ s* p: O9 D" u1 b% ^8 T; d; o
showInfo();& f) }5 T' S7 l
//限定访问:只能访问当前所在的空间的子空间中的成员
0 I5 D7 g" E! aBB\showInfo();
: x1 Y8 m. v4 {//完全限定:可以访问其它所有的空间的成员
* z9 G! U4 k5 k\CC\showInfo();
. K5 F* O5 s) {/ M- T" R↑根空间标识符" u5 j$ `9 [& F4 k; b
----------------------------------------------------------------------------% D8 c- E1 F+ |" S
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
* _5 a# @# X% h' {5 C& B& F+ v+ I$ \1 E0 g4 s- |3 S
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)+ S, \& `7 D3 C) w" f
( f+ L* n1 g. W) K
代码示例如下:
4 r( N: @" V! O- \9 u. F  \* e
" z$ ?) i5 q3 I* K  v1 f9 l----------------------------------------------------------------------------
+ K, N: K5 o9 ?1 U1 Y4 l
6 F5 A0 V$ K$ ^1 E4 y! Z0 U9 g; U
1 k: Q3 ~* ?5 s0 N04inc.php7 E8 [& f5 e3 s: K
<php
$ V6 c' ?7 s3 Q" W; {8 M5 ^$ s5 {3 n+ B6 X: W3 h
namespoc_e Core;
4 ~1 |$ O1 D* Ninclude '05ou.php';
* }4 Z  V' m+ i( j) L$ inew \AdminController();& W# S- q% Y" k! U9 W6 U
showInfo();0 Q+ d; q: u; `- t. G. U0 P
# w1 V2 B6 Z, m, s* ~
echo P;
8 F: o- \4 S' V4 X4 d3 L! c6 V//根空间中的成员,只要类的访问必须加‘/’
/ o/ z" u1 G) i: C( t! v& f# Z----------------------------------------------------------------------------
7 n. B/ p$ n$ x7 [$ E. S; a1 f- Y$ D; W' Z. b
05ou.php  N1 ]; ^; A8 P2 z5 [; P
<php# F! F' C! E+ X$ H; ~( a* A: L" b
const P=5;/ @7 L$ U  R: }; Z& m: G
3 P2 R7 |7 a9 r# j2 j8 o% s
functio_n showinfo(){
4 u5 _5 {& C) g; t6 b( V( j    echo __METHOD__,'<br/>';
! h- P) \% m9 V8 G}3 s$ T9 c: l8 h9 I

/ {  j7 w$ i  F; E' D7 v+ ?: v/ W$ cclas_s AdminController{9 _* n% L% k' O! ?- L$ D6 q
    public functio_n __construct(){5 _8 r  a! r2 ^! I  w% N0 R5 q
        echo __METHOD__,'<br/>';
8 r0 [% j: I) Q7 ^6 f    }
2 T7 H/ {! F8 [$ T# C: ^}
  d* s1 L$ h( e5 \6 E7 H" Z; u4 {  E+ X  h( K' U1 o8 v6 m$ A0 J
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
) r. U% t4 j2 a  P----------------------------------------------------------------------------
7 s  W: [) A+ ?1 A6 {8 O7 E04inc.php
1 m3 @$ g# w: X* ~; Q, Y: T<php
" w' P" Z7 a- ^9 G, t6 y0 c* _$ G3 m. W) Q6 ~. e
namespoc_e Core;5 d$ A4 a# g+ d
include '05ou.php';8 a% ^' @0 a0 {3 c% t/ N
functio_n showinfo(){
" d7 w8 T4 ~6 K8 q* n    echo __METHOD__,'<br/>';
: j1 I; b+ o) F" b$ K}
. w5 A1 g5 H1 q0 C1 z( |/ }. {/ r2 ]/ n
new \Controller\AdminController;& a5 ^# J: i/ j8 `# Y( h/ W" k) \
----------------------------------------------------------------------------( |: a4 I, F& p2 q' e/ @$ i
05ou.php" T5 R7 A  k1 x' U2 P
<php
( `) h, o0 n# L( g/ i8 Hnamespoc_e Controller;
& H# u/ F: B) k3 ^$ \/ @  z2 z  a& }$ H" K" x
clas_s AdminController{; M3 u- p8 F; X8 \" P
        public functio_n __construct(){7 Y+ o5 n7 \! ^& [8 L3 o- W
                echo __METHOD__,'<br/>';. d' z; b: ?$ F5 r8 m3 J/ w
    }2 z" x6 H1 o5 {2 L$ c% O7 N
}
" `4 d4 t, {8 T7 Q: e$ G# y----------------------------------------------------------------------------
0 n% J; C8 {5 o5 ?5 ^- {; C; p1 Z- {- ~: p8 `6 L+ S- `; q
4.引入空间成员:
, p  N9 H! B0 u# O4 |. g
" a5 s- @3 d4 @5 l6 t1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
# @- m, L# ]  G2 Z' ^* ?3 U$ [/ j& {5 O, G( f
----------------------------------------------------------------------------
3 i! W4 T) @9 M' U; {* [  X% y9 O
04inc.php) l# ]: ?! L- ?
<php# c* N  w/ A- F& A3 b( p/ z6 v
namespoc_e Core;$ n) j! i; j0 z* a1 H: E
use Admin\Controller as con;
- k. Z& _% ^2 X; j8 {1 W$ W. I1 F6 l( |! a
include '05ou.php';
6 f, Y0 C" V, x7 y! }9 W$ d
/ M+ ^0 [0 P0 u: e/ x! onew con\AdminController();
5 B+ d" K( `$ h3 u----------------------------------------------------------------------------
" N$ [6 T% u1 K) X2 a. L5 ]05ou.php
2 Y! U$ g* q4 e& v. q: T<php
( u0 N0 B/ G1 D8 }/ \namespoc_e Admin\Controller;* V7 _& Z# X  l- ]
- A: t4 X- y: s+ |* x; W9 z
clas_s AdminController{- v& G. Z: C( B$ Y9 T9 ?
    public functio_n __construct(){" ^7 @0 p6 M) z
        echo __METHOD__,'<br/>';3 S3 ~9 \4 \& `, H7 ?  \& e( E) j7 L
    }
& W. `% s8 ?( l}3 _" D9 Y3 l' t' B+ y6 I# b9 ?1 f( r
----------------------------------------------------------------------------( t# T% K$ f' w/ ?' @( {; g
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
+ n9 W' g2 o7 g
! X2 Z; ~- [+ ]- X----------------------------------------------------------------------------* J. c' b1 v2 H  s7 z4 {

& t! K5 n9 Z+ U! q, W5 Z04inc.php/ [; E: v, M$ K) }
<php
2 g7 K8 u+ v( N  g8 U//引入空间成员类  H1 M: j# u- {+ S2 m
! t# y8 r; Y, z* X4 L
namespoc_e Core;
$ F1 T3 I3 Q: O- y/ D* Tuse Admin\Controller\AdminController;1 Y2 V, k4 H5 p! @- |! K; ]
include '05ou.php';) K  ?! Z" }8 z1 K! N
( o% G1 u$ Z6 ^. {
new AdminController();
; M. Q7 w/ p) r/ k/ j/ S----------------------------------------------------------------------------
/ B4 Z1 d' |6 \, F$ b* C0 O2 z1 \05ou.php
# r8 Z& m. N$ R4 [6 s3 \<php
8 e' K: @  y/ V& b. K2 M& D$ m# hnamespoc_e Admin\Controller;
: y, x0 g4 ?4 B  G3 z4 H+ Q5 A0 w2 ?. w
clas_s AdminController{  \/ Q& s& f! w/ c- j' J
    public functio_n __construct(){" a. h6 \# [" L4 B+ R, d: s# x) m
        echo __METHOD__,'<br/>';
, Y* b- c0 o% ?% U- H2 e    }
) q4 A# c" k$ P$ r: ?3 w4 z( C2 y}- w8 @, M6 F: z9 e! `& u5 |
----------------------------------------------------------------------------: T# U) e' _% x9 S8 ]
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
7 `% W/ n4 I) C
" d+ R( y1 b- s# O% r" q
/ s% U0 c' e! H+ `这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
, A- ~, R8 `) i' O8 L: Y5 b6 X$ z, J" U9 J( Z4 Q1 ]
+ A0 R% h' Q, P! S$ O: T

9 t% b3 l, o9 ^9 d
' y% T7 K7 z6 Z4 \3 {3 \# |! J9 E' b) X2 X% e0 o! b: }

" S4 Y$ v+ K9 z! K




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