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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
+ a" Z  \; e/ L5 F# ]" l' _" v+ ]
0 y  s. s8 ~1 f' @9 ?. j  Q* U在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
0 E2 ?& A: H5 \8 J7 a3 N7 U' U. B5 V: I  ^9 Z  V1 I& x( a
  H% d9 _. P: P6 B& k3 U* W& t7 b

) S3 S5 }6 ^3 |8 V$ G我们来详细的讲解一下PHP中的命名空间:
' ~2 `9 F/ x( }; @- Y
) q8 u! D8 g5 I( }' p. E0 [! c语法:namespac_e 空间名\空间名;0 [7 v! [4 j9 E4 j
% R% \% H1 r# P: v4 {
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:: y' ^+ |- _2 a" s' i! k6 i

; A9 R5 o# ]- T5 B----------------------------------------------------------------------------
! l6 \0 e5 o$ \: T' ]7 Q" @' k! f' f) U0 U& w
<php
% ]6 S) b# {6 ]. v$ E, r
" l* f1 u3 `4 n" ?1 c4 Inamespoc_e AA;$ ~/ l9 E% y# L0 t5 S. A/ X
functio_n showInfo(){! Y& l3 E7 I. w
    echo __METHOD__,'<br/>';3 u: N& d8 @- L- ?1 m2 g; o
}$ L( H- V6 ^2 ]5 @$ ^; M; x
showinfo();- K/ I. y0 G5 c4 P* G% R  J9 w2 o6 n

$ Q0 `( `+ u0 M( }8 Fnamespoc_e AA\BB;' I; G2 ]! @  B
- \2 s: @$ D! G+ Y% x* V2 ]
functio_n showInfo(){
; T9 S7 v8 {6 I% x& e! ~    echo __METHOD__,'<br/>';
' X: t) `; o# g( N}/ K( s" d& M& t: E' n
//showInfo();
9 U0 c$ V8 e8 ]# V1 G: T4 o----------------------------------------------------------------------------/ P3 |1 T7 ]' L) a# J' |  j6 k& n5 w) F
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
3 T( v0 a- |3 {
9 W$ L2 g5 e1 ~. i: Y! A3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。3 y, q: ~' t9 u5 I6 X
0 U8 o$ `7 e/ M. Q9 D* a
----------------------------------------------------------------------------& r5 p5 Q* y5 [! |' H/ W
7 Y# w7 T0 @+ {1 r# y& {
<php& |" \( G: Z, S) h+ U- S" t
namespoc_e AA\BB;
: G" M' O& _* b' Cfunctio_n showInfo(){# i$ ~: e9 ^0 }% A, l
    echo __METHOD__,'<br/>';6 z1 m2 B" _- O# e( g6 @- V
}# B5 k" t* N& n1 p; `. q
namespoc_e CC;
" M, m, X' z% y) \0 ifunctio_n showInfo(){
2 N6 y+ ~8 ?7 E, o0 E" ^    echo __METHOD__,'<br/>';
* ~: S8 P- _( K. N- _! h0 S}
' z, c5 `, t5 lnamespoc_e AA;$ |; C/ v3 M3 {) m
functio_n showInfo(){/ l, z# c! C7 ]. f, P/ C
    echo __METHOD__,'<br/>';8 y- W( z9 u" U& Y! z3 K: ^; O! @
}
4 ~% p9 D! x! [% ^  O% Y. _" j//非限定访问:用于访问当前空间中的成员
# _. O  }9 F2 u  Q5 DshowInfo();
$ d- s8 I9 M  B7 L! F//限定访问:只能访问当前所在的空间的子空间中的成员
; G0 F/ c$ T9 M0 o2 hBB\showInfo();6 P: Q+ J# b5 D1 K
//完全限定:可以访问其它所有的空间的成员0 G' a4 Z0 T* Y, k1 B( B% @& @$ |
\CC\showInfo();/ j" b9 F4 I4 Q7 S: }( A
↑根空间标识符" K5 S! ]9 r/ `* h' A( G
----------------------------------------------------------------------------: o2 |6 v( v7 R  V& P" z+ b
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:7 z* ?( n1 j$ E* S
0 d- W* I$ d2 j5 U, a
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
5 H: J# x4 }7 `8 ?: |
  A! f0 g* c4 F# F1 c) ^代码示例如下:$ {; t! d- X# @
& H( q7 {' Q! d
----------------------------------------------------------------------------
5 P8 ]( H6 u3 u8 |3 C+ D  S9 v
: b2 }' S+ J) g8 w- E4 ?7 Q: {% F$ K/ T0 k$ T# {" p& L0 M$ t0 o* w
04inc.php
( Y7 j/ b: q: T+ q1 s# s<php3 L. ^8 U9 x8 x% g, u
+ r+ C/ J. N  @) a; z1 n
namespoc_e Core;
& b8 ]5 t  n) E; ?include '05ou.php';
( w2 q# ]* [3 e& `/ B- C% Pnew \AdminController();9 f! M) P5 M! l- n2 W, d! D
showInfo();9 w1 r$ Q! h/ v

8 x* M- j) c) Q3 f; A. u9 zecho P;
+ G: y1 t& s; q; w) y# s- N' O//根空间中的成员,只要类的访问必须加‘/’! j1 P7 V* C! r$ R
----------------------------------------------------------------------------" S9 X1 d6 D* z/ P
. D$ e( `1 M" ~& k+ Z) q
05ou.php. A# p1 A8 F: W( A8 i5 ]
<php
( L) j3 e6 q, ], M, A5 dconst P=5;" ^$ @& W2 L* W8 ~( a
- i% R; b/ J; r5 s6 u+ `9 A
functio_n showinfo(){
. D" E8 g; A2 f2 ?    echo __METHOD__,'<br/>';
- n" A8 e/ S2 D' ]  ?- v/ F& H. k}
9 D# s5 J! Q* ]  o' `) y2 p. E+ T! M6 z8 X6 e6 l0 y" z' u
clas_s AdminController{
% Z3 `) ?* {+ a* |, m% r    public functio_n __construct(){4 y) z$ g3 }: X" U  {/ ~# H1 O& n  ~' C
        echo __METHOD__,'<br/>';+ P$ b. A9 E' [. h. W1 T
    }/ |# w* ~+ w9 j* f- J) G" c
}
. f2 ]# G- n& e+ \2 V& E$ C7 r( A% h9 Y' P% |
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。3 `9 ^3 ]& J( i
----------------------------------------------------------------------------
  C$ b. n& [( d5 R/ F5 G- X04inc.php
; \+ `% |# j! ^/ h! a( k<php
$ G5 ~, X! T3 b; q" y1 L! y) a1 ~  Y& F' @6 n
namespoc_e Core;1 P- v. g5 c' P8 t% [
include '05ou.php';
# Z9 d' R  D9 O9 \' Y) pfunctio_n showinfo(){; M5 x* k9 k; K& ^5 w- @
    echo __METHOD__,'<br/>';
% ]3 ]/ I( m2 P}; K  U3 Y2 V; k3 D
$ O0 V9 G6 m- f+ e/ i
new \Controller\AdminController;
  ~) P' g& m' {----------------------------------------------------------------------------
6 v8 @9 E$ V3 d05ou.php8 B. H3 s9 u) ]8 C6 M& N
<php' H, g  T- \. h) }% S3 J
namespoc_e Controller;2 d8 r4 D5 {. W, T8 A; l4 e
( L7 R/ o2 `6 g5 V
clas_s AdminController{
7 W9 e; z+ C# M) w        public functio_n __construct(){. q2 Q3 U* W8 T+ e
                echo __METHOD__,'<br/>';
$ S* {! @! X# ~9 b6 o3 C    }
8 `2 h$ x5 F6 I7 [8 w}( W. z6 o, U! H3 p
----------------------------------------------------------------------------
! O6 c- M6 d0 `' E. s6 s6 |" [; a: y. b/ H
4.引入空间成员:+ R3 m* p( R5 h, ~, W' y
9 @* k2 y* [) \, s' \
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。* b: `- a( I' F1 E

  r/ R( C  G" x6 q) }5 f----------------------------------------------------------------------------2 j9 P3 Q2 u$ z

# y: q1 K, t% k4 r4 N04inc.php
5 f; Y7 ^) }- r3 j<php
% _7 r& H- h, D4 `! N, D) F9 ?8 F& {namespoc_e Core;
# o  Z; ]5 ~( a! _use Admin\Controller as con;
3 @$ S8 J+ A( M2 B' e
( \+ U; l  }' b1 jinclude '05ou.php';
  ^* k; o( M: \3 r" O5 F* z: n# ]* p  |$ w% ~
new con\AdminController();
9 Y7 Q8 y( N5 \" p4 d5 c8 p----------------------------------------------------------------------------
9 l0 W1 y. Z# ?$ p' f05ou.php% g7 h/ ?  u7 R8 A$ m: Q
<php  \, ^: M3 I4 y+ Q! B6 F* j4 _1 {
namespoc_e Admin\Controller;  e* s' B& k4 ~& O( l- K
" Y' D- U$ z( `7 @% p+ J9 J& b( u
clas_s AdminController{1 ~) g' l  g4 i3 s1 o' s, c
    public functio_n __construct(){! U. D1 Q: j) Q, p: l6 [
        echo __METHOD__,'<br/>';
' K1 ]* u) `! _$ B9 V2 w; `    }
, h6 q; S+ a& H% c}' t- S! D5 Y* Z+ d0 `3 X8 b7 D
----------------------------------------------------------------------------
5 ?: n( ?  ^7 J2 I% @2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
5 l) Y2 M# ^% {* K, ?* C$ R6 c+ p+ m6 r0 Y0 e! E, K4 r
----------------------------------------------------------------------------+ h  O) [* H! _
+ \; _6 s- O3 P9 X1 Z$ F) k
04inc.php
8 o' K9 `6 U: ]4 A" c<php* L+ J' i2 L  @: U& G4 c
//引入空间成员类* X. ^7 w7 a% ?
. A; _; q' [: t% `: K
namespoc_e Core;
& Y3 U6 r7 Z( \* y) P8 ?use Admin\Controller\AdminController;
$ o8 h: K$ h5 c; x9 [include '05ou.php';( ]/ B  n; D+ I' o: B& ~, W' W

# G; D% d: S. |% }, J* C4 |0 jnew AdminController();& ^6 h" \9 a& G% c
----------------------------------------------------------------------------; F. b- V5 |# j  ^
05ou.php9 I+ O5 P& {* T& \8 ^4 @" _
<php+ Z/ F0 p. }& \6 ?. {
namespoc_e Admin\Controller;0 F9 U/ Z1 c. [* l, l) B! Z* V' D( t
4 W/ S/ A& O+ U1 {" x: ^
clas_s AdminController{
4 n' k" o) x! o% b3 a    public functio_n __construct(){
8 T8 w! y, i  `$ g$ I! g" e        echo __METHOD__,'<br/>';
5 a* l# q' t  t* h0 D% ?- D! T    }2 [5 q$ u( V& p( x/ }. N: O
}
# ~: s+ ?& _/ j* G* F8 M6 g----------------------------------------------------------------------------" H! g4 x- m; C! j' i1 X* p
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。) B+ Z2 e' f- E/ T6 D# c: e% V* c
: d1 l- b0 P+ @* W  H: w! `

, Y) L$ x$ ]& [' |4 B& H这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。' `# i1 e( E$ P9 v
: m( f7 Y6 M2 y1 H
" s; W5 D2 U* N( P' U: I( h$ Z
% x7 }( s  b$ P! F
, K. Z. K( X6 K( B' Q, T, Y9 _2 b# D
- m1 F2 c6 t. U1 V

' ^& R( ^7 v: e0 g

最新评论

GMT+8, 2026-8-4 07:06 , Processed in 0.085440 second(s), 22 queries .

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