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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
) H; E6 d8 O* ^9 R) l  T& w' L0 P8 p) q! e4 E9 i
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
7 O0 j/ q( ]! W7 J7 x6 f4 |4 ~) y& I# l' P& a7 ^  M  Q0 V( O8 A, U4 T
20181201105307520[3].png 4 s+ i" T/ ^/ b% w
' h% G- T2 I+ h- k
我们来详细的讲解一下PHP中的命名空间:
: t1 t7 n! ?2 n/ Q. ~+ o
; D, g/ W& J( w% H/ [9 q语法:namespac_e 空间名\空间名;
) X2 q, W- a- Q2 R4 d2 j; M  x* e3 N8 G, ^8 V) }
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- i- g: h6 @% V/ S
8 g+ ^- o, v  E' l7 }
----------------------------------------------------------------------------% N8 P& Z- a- I$ r& ~( C! H
9 {8 _1 q6 u9 [3 }7 M: b0 S( S+ {
<php$ l  {# Q. d: ~( k9 I

9 x, p5 K+ ]( c# g9 Vnamespoc_e AA;
* W# W+ ~! _. N, F7 `functio_n showInfo(){
3 @' s! ]  q- L: B- r; X    echo __METHOD__,'<br/>';
* y  N: h7 P6 }5 a}
! G8 f" `9 n4 c3 ashowinfo();( D5 E" w/ ?  g5 ~" Y1 L: k

. C  |0 w6 h* }6 N* Anamespoc_e AA\BB;% R$ u2 z( S2 R4 c9 L* y4 f9 o

' Y9 O+ J& L7 T, e. Efunctio_n showInfo(){0 y$ b; D0 F4 t/ x- B) r# z
    echo __METHOD__,'<br/>';3 l" K' F- [3 E* g+ o, V" t: T. g
}
; e( H, w' }3 @+ r. T* ?) O3 U+ M3 N//showInfo();
- }' P& c! l" v- K----------------------------------------------------------------------------
7 N4 u9 b; @* G' C5 j3 Y' i2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
; J# e$ L0 f+ g( D1 W6 B6 Q9 j* W
0 b& W5 y" Z3 O, X* m1 g3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。( T* E3 G- O  i; e( O2 Q: s

( S) r( ~. U- x: {( g, \# R----------------------------------------------------------------------------! [! F' `9 _/ W0 e

/ [& I) V- @: r( e& a<php- y' ~  y1 S' s1 O7 Q
namespoc_e AA\BB;8 P* m" d' X8 w* F& }
functio_n showInfo(){" f( p: n! X3 w
    echo __METHOD__,'<br/>';
- z$ G9 X* i3 _}
" [' |' [2 W- {! V: E# h" K+ M1 p/ Rnamespoc_e CC;
7 Y7 B! h3 f8 ]* \* Gfunctio_n showInfo(){
: A9 d5 X* t# i" d1 `1 {    echo __METHOD__,'<br/>';6 H8 u$ o/ u( O4 n/ m
}! {2 u! U% t) L. H/ d' b; x0 H
namespoc_e AA;
1 u9 p, [$ ?9 v- ?8 \4 T! Lfunctio_n showInfo(){9 U: j. {- b5 p1 s! F
    echo __METHOD__,'<br/>';
+ |( ~6 R- p$ G" h# R& D% b" o}! ~( j% N. ~4 v- Z
//非限定访问:用于访问当前空间中的成员
$ B+ A) ?, ~* `" G: ^! z* F7 LshowInfo();
) A. \! Q) I! E  x//限定访问:只能访问当前所在的空间的子空间中的成员3 J3 ^1 w5 v, I1 _2 p
BB\showInfo();
& J+ t% s; K& e$ f; \//完全限定:可以访问其它所有的空间的成员
: @2 Z( |* R" Q  c  [+ j) @\CC\showInfo();& W2 Z( g; D4 A7 ~/ j: Q
↑根空间标识符
9 e1 i3 Q3 k2 X3 `+ W" `  _----------------------------------------------------------------------------+ v; C9 S! w$ p0 l4 j
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:6 |# E4 F6 O$ ]% i4 d
5 y( `) m: w3 L! i) I3 ?
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)4 G: U* s/ h# x; }4 r
# u$ D0 M: q  H
代码示例如下:
' `: g7 K% D+ C* A* u) q$ o: W3 P, j7 F0 z8 ]" m: l
----------------------------------------------------------------------------: n5 N4 _( _% l. Z, A

2 n4 k, Z- x+ Y9 [- H
. ^7 P, T$ z* S/ V/ Z) }1 D/ S04inc.php! O0 N1 s# T3 q; W# b9 ?% a
<php
" U' m& c( @6 T( u- \
) C/ H' c7 X: onamespoc_e Core;
' J+ m3 ~( F0 I) Yinclude '05ou.php';9 f2 j2 R6 s! u5 W. W& E
new \AdminController();# L0 t+ W: z) X7 i2 X
showInfo();
9 X* V" [9 S* b: f7 ^
" T7 B- w+ x' H: A- Kecho P;7 X4 A) z7 a" P
//根空间中的成员,只要类的访问必须加‘/’
7 U8 A; o4 Y: q5 ~----------------------------------------------------------------------------
) E9 I7 Z' i7 K+ |% D- a) n
) t5 `" z( g' C0 h2 M1 r; N+ {( Q05ou.php
- j& J0 ]! N0 q<php. A, N4 B$ r$ ?# Q
const P=5;! K. b3 f9 x+ M+ r4 N

( c" y: G1 ~/ G5 K. g1 X4 l6 Ffunctio_n showinfo(){
4 t9 _0 O0 B3 X9 V    echo __METHOD__,'<br/>';# z! k, c' E* `
}: M" b, V3 M* w/ ?& u# ?- i
7 u  |0 E+ k! x, \3 A' P
clas_s AdminController{. w7 F1 ^9 @6 K- a6 p2 E9 W# B) }; ~
    public functio_n __construct(){, H. y$ t0 E! a4 o/ d
        echo __METHOD__,'<br/>';8 S4 w0 M3 L7 O7 U# p! S9 C1 i
    }
* A7 [- Q  X3 c( |}+ ?, M/ D1 Z& ^9 _+ B
& V6 _+ i. l/ U( _% N& v$ R) g
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。3 l4 |# J& R" d
----------------------------------------------------------------------------! `- u! O: T- \' F3 F7 w4 a
04inc.php
% X( L1 R6 M& Y) U7 j2 E<php
3 _' ]( \' K7 T, Z, w- V0 `) z' [% O, X. R3 Z! i7 v
namespoc_e Core;
9 ]3 V% z3 I, |  Z4 F7 Dinclude '05ou.php';
8 H. x3 e' x! P8 c/ lfunctio_n showinfo(){
; A& M7 z* J+ _. y/ v1 w    echo __METHOD__,'<br/>';
. C' L7 j3 a' V( M  |) `}
5 c. C) C  r0 G! D1 d/ A/ V' I, g
new \Controller\AdminController;& M2 p! d7 g7 `' L) c! Y
----------------------------------------------------------------------------
/ @, x  b6 j5 h- O# ]0 t05ou.php
. @& h% C# y$ L+ a, m2 y<php
5 ]( u- e+ F, V1 ~9 K. Z  gnamespoc_e Controller;
) d/ y$ z8 S6 }0 }6 ~) q( k; d1 X
& A% G* Y& T9 X. Hclas_s AdminController{. U! q7 p/ r- o1 X/ N  I" _' X
        public functio_n __construct(){, |! D# ^* c* G* o2 c/ g; I
                echo __METHOD__,'<br/>';" |9 @' i+ m: n. m/ H  `
    }; v1 D& |% M6 h( E3 Y) d
}  b7 ~; I) _5 L2 [# I: c; ^( x* S; U
----------------------------------------------------------------------------9 I/ d0 ~! z; c4 R' u4 x
/ u2 `) K& A! p, v
4.引入空间成员:! \8 P, r$ s) Q8 \

, H5 L3 s7 y# T# [1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
* ~# W& ~, J0 [" {" i) h# K/ z
+ Z% O. u! l2 v2 o----------------------------------------------------------------------------
; B1 e, W- O, D+ A& |5 u4 E; s7 V
2 Q7 l5 c: T  |# q04inc.php8 x( N. p7 j8 ^4 [6 a7 c
<php1 a0 N9 V( w+ I
namespoc_e Core;
2 g( r9 {( {! A2 tuse Admin\Controller as con;9 u+ d1 z) [' d7 D$ c- V
0 K* U3 L/ }2 i& ~# D
include '05ou.php';
* ~3 a6 O, P; ]3 ~. `  K* L  ?6 l' v3 O6 L4 K
new con\AdminController();. Z- K9 U( l8 i/ @5 k( X3 f
----------------------------------------------------------------------------
) s& m; c- ]9 c: m# a- `4 E& _4 D05ou.php
' l% @0 ^% J" K9 i; O/ Z/ p6 N<php' T6 z& t7 N5 C6 r8 X
namespoc_e Admin\Controller;4 r3 ?" ~, K3 V+ K7 a  N1 L

3 N, |* Z5 o* e) Gclas_s AdminController{: z6 }6 y! S& B1 a" R$ S2 I
    public functio_n __construct(){
; R2 V) O$ G& t/ S/ R/ ^' {        echo __METHOD__,'<br/>';
# K+ e- g2 K1 x0 E" n' w, w, s4 d    }
1 d7 u7 B6 l/ B+ f  G: d* E, R& N. K}% T. |; W8 c+ H2 Q
----------------------------------------------------------------------------
; M, F. [3 c. n2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
1 k9 J) F& `# j: T/ p* }5 t& Y' u4 F0 d' e# \+ x. r  J$ s
----------------------------------------------------------------------------
  X% \1 y7 U& @/ u% H$ y' ?
: W# Q: [& P* F. {: @- m: B04inc.php
1 g0 F* k/ N5 t! U+ ?: d" Q2 g<php+ R% G0 E) k" p' j, ^: \
//引入空间成员类+ R) @( B2 W' Y; w1 s( q9 b% {
" |" C# ~( f/ F! z$ N* @: H' Q
namespoc_e Core;; p6 X: H" {+ M
use Admin\Controller\AdminController;
' x( u! W, A0 r* Q) Binclude '05ou.php';3 h) K7 M. F7 D7 ?% @  |
! H5 G" O: |2 D# D0 }% t
new AdminController();
1 |! m3 j* O/ y+ x, K----------------------------------------------------------------------------
* S- h5 s4 ^& F05ou.php
9 \; Z$ W- U$ [# _<php1 r  _  g' Z- c% e; H
namespoc_e Admin\Controller;3 v; z9 r9 h% o, Z7 B

: c# z% r8 B2 C# g1 Vclas_s AdminController{
& i2 B2 L, F* m& V1 @# D$ S    public functio_n __construct(){' Q9 D5 }* o# `2 ^
        echo __METHOD__,'<br/>';7 {! m; L  h. w" D; O, ?" ?
    }
5 h0 S2 _7 w+ e$ z1 r! N}
6 Y7 ~' g% u! N, }# y----------------------------------------------------------------------------! w* i! `# S! D3 y
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
( y  Q# y% U5 a: J$ @' ^7 b
" y1 V5 u$ Y, o+ y1 D2 R1 ^; D1 G# `" g" R3 X* m( Q3 @* T
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。5 ^( a  B  y! l% W3 s5 S3 f( ^

, [2 R7 M* X6 u. e! J" i1 u0 F& T0 L; h( p6 A2 N/ P

' m" h1 ^3 Q3 ^% d+ i. p( C. X2 [6 }5 L
2 o/ C3 J% V( h: |! M

9 d6 x; L2 S2 T: D# z' x8 Y3 x( d

最新评论

GMT+8, 2021-9-24 17:38 , Processed in 0.112533 second(s), 25 queries .

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