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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:) p- h- }# E& y- d
( x$ i5 v7 N1 Q5 R4 ?- ?; i2 e
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
$ U+ j! f; Z! c4 ^! }
1 }, _+ J0 D+ ^1 E! Z' a8 t 20181201105307520[3].png 7 p8 c! B8 H2 }

" z( c" x, \/ R% u我们来详细的讲解一下PHP中的命名空间:+ i' j$ m5 K: ]6 L' p1 [
* p" r9 d0 c- Z/ W: K- j4 c( K
语法:namespac_e 空间名\空间名;
) P  z) L) X1 @- O% `- @  D+ y; C5 l/ Q' d; Y0 l- V* s; M
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:/ _! o3 \4 I/ e

5 C; U2 w  S+ E4 P: N5 |9 X----------------------------------------------------------------------------2 I2 N7 R" k7 J
$ ?/ B0 j) o7 k$ z. {: Q5 j
<php
3 t  P1 o  x6 A2 l5 Z4 G1 f9 Y. P! n9 V& B  R; h
namespoc_e AA;
* [5 M8 g# [7 D4 \, G" h5 |7 Efunctio_n showInfo(){, M) R% c# a. `, `8 u4 g
    echo __METHOD__,'<br/>';
! q+ s! z. E* ?, A" w. s, c}
. o, Y6 x( v8 d8 q0 V0 A2 ^showinfo();
* p! F; w# b& B
/ q5 f( }9 g9 O9 O" Nnamespoc_e AA\BB;. h4 l1 ^2 P# Z

: e, N1 u6 {% q7 e7 D% b1 F. y, Gfunctio_n showInfo(){
6 }( r$ x3 T; z/ B9 d    echo __METHOD__,'<br/>';5 H( a6 a% o( l, j% `) z
}
2 @; n) J' Q# k$ _! ~# C//showInfo();% T' i6 y/ v+ k1 L- T# [" i
----------------------------------------------------------------------------
( @* X8 `9 o! B3 ^% w9 I, d2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
' r" H9 ~  A$ ?8 B' ^# Y4 k1 M( D* b! [: V% ^! o' \) J
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
( @. `! |* }( }2 t1 j3 Y3 C
3 u/ p8 G8 Q7 F' l----------------------------------------------------------------------------) v/ }/ r" D3 G' s1 U

+ H& c; p$ i  n5 c: K' E7 u<php
/ b4 \5 k/ o( I2 K0 _; Onamespoc_e AA\BB;
5 [; H/ L$ C4 m# o5 k& Nfunctio_n showInfo(){1 Y" L" ~0 g+ y7 b
    echo __METHOD__,'<br/>';* j. u( _9 G) U- a: ]. \
}- M6 @0 N& v# Z3 x6 N* w/ [; c! B1 e5 u
namespoc_e CC;
7 N$ \; a% m* y5 Mfunctio_n showInfo(){
) [' _3 j9 o2 k$ v+ H    echo __METHOD__,'<br/>';9 W- u6 B6 M3 ^' r. n% a! ~6 Z7 \
}( c6 s! ^0 Q  ^( C
namespoc_e AA;+ l9 s6 V5 R* p2 x
functio_n showInfo(){4 g1 l. t9 i0 p9 h$ t9 a- H
    echo __METHOD__,'<br/>';' T. P  b$ m% C! p+ o; `- K
}. \6 d7 C7 p4 U  m8 Z& B
//非限定访问:用于访问当前空间中的成员% h1 N3 b8 N" w, g' `
showInfo();* `# ]0 A6 G+ V: a
//限定访问:只能访问当前所在的空间的子空间中的成员
) }! `: Q; s- J* p7 DBB\showInfo();
; L. l- h% t. J//完全限定:可以访问其它所有的空间的成员, D8 X/ V, Y- p! b$ @/ {" `
\CC\showInfo();
4 B" D5 C8 C9 R' K; ]$ ]5 d2 w↑根空间标识符
( G' a7 D4 s2 X, D/ w2 u----------------------------------------------------------------------------. A# y$ M. K8 C* _9 A
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
, s5 r/ @  R7 X6 B4 s  D2 ^* h5 H. J. l2 W  R
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)$ ?; D5 f$ R9 Z0 [* }9 ]
" B! s7 I1 U& `. y  H! J' W
代码示例如下:
# R# L6 }6 J: u1 g" `( r) z0 `6 N: A5 m5 G! W# F, N+ b: O
----------------------------------------------------------------------------$ x$ k& z7 z* M4 X
9 I" q' g2 r7 @

  [( E% [+ Y  I04inc.php
4 {: I- _9 c4 u. q<php
: ]; H# b0 L" k/ F. H+ `, V( j1 h. A4 f: o8 ]3 H- g
namespoc_e Core;
+ [9 S5 r, r" V% q0 finclude '05ou.php';
: Q( e! @: m0 Q  v; mnew \AdminController();
" E1 q7 `. u" k- ~2 G" \9 rshowInfo();
( s5 L& O% k9 i8 o: P
- o6 }% x% d( t4 gecho P;
8 g" i7 m! [. z3 R- |7 @//根空间中的成员,只要类的访问必须加‘/’
. J, T' [& _8 |8 d----------------------------------------------------------------------------
. k" p" Z' ^: t; k! n: `
- |) H1 p7 N" h4 T7 u% c6 g; V7 N+ r05ou.php# b' t. o/ V2 f0 [
<php) N# |9 ~) g0 Z1 N+ u1 |+ X
const P=5;: u& f3 j$ L5 y

5 O0 H$ m" k$ w' r" t, tfunctio_n showinfo(){
" _( h) t$ S1 n# x    echo __METHOD__,'<br/>';
: `& B  L' {8 Y' z9 ?, b}/ O# t  E7 i7 W. p3 A  W0 f

' `% k. X' y$ ~+ cclas_s AdminController{+ g0 h/ I1 I5 p% O9 _' ]. g
    public functio_n __construct(){' d  y9 ?' X5 J: v$ t4 A" c
        echo __METHOD__,'<br/>';
( o( a/ a: D# x, e    }
' v8 O. n' A  {# f2 v) o- g7 x/ q}
4 n! a: o1 I: K( E! O# Q$ J  z' r
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
& K/ }/ [( v: w----------------------------------------------------------------------------
" B4 o! M  J/ ^6 b% a04inc.php4 W) t+ }8 C5 B' \, ?
<php4 \! _3 _  Z2 o) q9 `2 m
* N( S4 y/ z: P4 R
namespoc_e Core;
- Q* r6 ^; }5 D  Y7 i' m* Hinclude '05ou.php';7 u) x9 g, N- r1 l4 {8 s
functio_n showinfo(){
) |& J0 S' c1 K6 v* w9 |    echo __METHOD__,'<br/>';( j, l: [+ H' Q. \. t4 p* D
}
( O; ?& @" H3 D2 w& ]4 a
6 U2 f  i$ W" O! N9 A3 @new \Controller\AdminController;- w8 {% B2 ~! j  X/ ]8 @3 q1 N
----------------------------------------------------------------------------& ?% l% h( S, K# ]/ ?8 B9 q
05ou.php$ [$ G) R& T5 y1 w6 r" c
<php
3 o1 p$ j0 }% ~( H1 W- i( Snamespoc_e Controller;& z2 H! K2 N1 ~3 w& T1 Y$ v

# e) ]( `% {% n# O5 D+ c" jclas_s AdminController{% f8 @+ o9 M' @$ v+ i
        public functio_n __construct(){( X: [1 b- }0 `7 B
                echo __METHOD__,'<br/>';
! v; }# g, W  f# f    }
' T( Y4 W3 v4 z; |% u7 C}
% A" F" L# E, S& q+ @5 Y, a----------------------------------------------------------------------------$ c" h& `/ |% E2 }7 I0 H

% ?& |% B! R. Z, S. [: U& {4.引入空间成员:+ j+ f8 w6 z' Y* N* \; V" `& E
  b" d0 a+ l  |; }3 H& N# X
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
' U+ Q, f7 Y) W3 K  c
* y/ L& i- L& E/ Z. T  m----------------------------------------------------------------------------0 [0 t' O& b3 |) d% R

% O& ^1 `4 L" k3 K/ v3 U% H" \04inc.php2 p# Q- v" t: v
<php
7 r  q2 _! l9 Z' Lnamespoc_e Core;
$ U) i& @! l$ X$ K4 \use Admin\Controller as con;
5 Q) G, Z7 m. U. I% u1 C1 w( k; y3 L0 k) x% m% I' L" l
include '05ou.php';5 |: B# D, \9 o$ E' ]: [

% p1 J) s! ^2 U9 i/ J: Z4 f1 anew con\AdminController();
, ^  n3 C, \9 J: _2 _7 ?6 H----------------------------------------------------------------------------$ V" U' ?/ c2 Y8 [9 V& O6 ]
05ou.php7 G# C$ X3 ?% `  g* l9 r2 E+ ~
<php- x- T6 m/ e: Y) u
namespoc_e Admin\Controller;
/ T; W- d5 R. i( h3 i1 u5 y) c. `  z
clas_s AdminController{6 q: K! E( {+ @( P! ^9 [+ n9 J
    public functio_n __construct(){
5 W: q1 T5 C+ b6 ]        echo __METHOD__,'<br/>';: J8 }$ m+ K- d1 }' L
    }
* h8 H/ c7 ]1 u6 z; r* K! q}
4 B7 A! y! y" k  w' S3 v1 S----------------------------------------------------------------------------
5 z2 `# i, d& X4 e, \. U2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。3 t. R2 @6 L- V, i

1 p9 B3 w4 C. Q" p0 c----------------------------------------------------------------------------
; U0 ~5 ~- L6 c/ |' |& V" [
' @4 @# e! j, Z, b0 o  y% D04inc.php
; [6 k7 B3 i5 |7 w  A, {- W( R<php/ {% M! c- A+ I0 V
//引入空间成员类
5 A% P( o  b* `( l# |: ?! Z% Z& H
namespoc_e Core;
; h2 S) Z% M  [use Admin\Controller\AdminController;
8 E5 n3 L. D- {include '05ou.php';! \; ?- {4 h# v$ N4 N

  a2 j' N1 F% V/ ?- H9 i3 Enew AdminController();
* y: a- \8 w8 v# V----------------------------------------------------------------------------
+ Z2 e9 O/ Z! A/ q05ou.php
" N) o2 d  I$ K<php
5 N! m2 w- j! Z+ mnamespoc_e Admin\Controller;
8 S" R' c) A( m1 V6 {! n, [; G) f+ u, K% j  C
clas_s AdminController{9 K* B" J4 i1 _
    public functio_n __construct(){
% E0 t( c( f2 h/ S6 h2 X& X        echo __METHOD__,'<br/>';$ ]" b1 ^# {4 z( z' }8 c# b3 T
    }
2 e5 [! q1 ^* V5 B}
! e: U$ x* h" P  q! I1 u----------------------------------------------------------------------------
% F5 t" V' B! c5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
0 D5 ~$ x  ^, v, k3 l" h8 }. G9 p0 P/ K, Y( f$ p( \
+ q' S2 y: O' g% u: m& O
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。$ I5 S" b% c& d  K# Z
% c4 L: ]( l7 I2 B' L
! z5 h* e1 H; G9 y' w

  Q* ^/ Y; m& E, e3 s! v% w2 h
) ^7 m; [* E8 ]8 i' v; k
! U' M! m+ _% t( d6 L5 S* N  P# a0 o# m

最新评论

GMT+8, 2021-8-1 11:19 , Processed in 0.172323 second(s), 25 queries .

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