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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
% i( g. a) g' q- b( K
9 d8 Q3 g+ E3 u8 |在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:1 M# j6 W. ?; a; g* N5 v

  Q  R3 o! h& G8 Z: K4 k+ Z 20181201105307520[3].png 5 j+ f0 Z9 l: ~, K/ t3 Y3 y  X! X& d
3 g. p5 n2 K, O4 J  `% w" [
我们来详细的讲解一下PHP中的命名空间:$ ]. y4 [3 ^- ~2 q, B. T& ?

0 h, T' l( V5 l. Q3 K$ ^6 l; G语法:namespac_e 空间名\空间名;
7 [3 J! ^1 d+ L; m! U: z& N& s2 M  R2 `
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:4 m2 H: k" l0 h) S
0 B6 v7 @: T7 O0 t5 I. B& F
----------------------------------------------------------------------------
0 Q0 ]/ U1 B3 P. {( f, d# Z' R
<php# y  A1 p3 x: _% S) ^

& s1 o& Z3 G, ^$ ]namespoc_e AA;
0 y0 v/ `" L( Z1 Gfunctio_n showInfo(){
7 H5 ~0 K) B# t9 }+ {    echo __METHOD__,'<br/>';3 ?0 Q( s0 f- L" ~( x
}
9 M" ^& L5 k- a6 G( Hshowinfo();
4 D4 w) m. m4 A1 I; u, U! r$ p
2 _+ v2 H- e& ~namespoc_e AA\BB;# m. G  F, _: g: i1 A3 d
- d6 Z+ q! K! W" x; @* v7 o* L9 U; F+ c
functio_n showInfo(){, Z# K0 k7 N" h- b  J
    echo __METHOD__,'<br/>';
8 W* K( t( E( |( k2 B}! b8 x, A+ U4 e& c4 t6 a4 z& S
//showInfo();; p( u: A- y- H1 p% [
----------------------------------------------------------------------------
2 w! d3 W: y7 l# l2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)% }* d: N$ C1 X! K( s1 N

/ }/ E! `* q& `7 C5 d  k) E/ E# e3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。( o$ J' `6 A: j# G: b& p
) K: P7 Y3 X/ \' D
----------------------------------------------------------------------------
5 L% C" m0 ?6 z# ?, o/ H# N. c" R3 Y' X5 P( f: k' s# J
<php$ d4 h1 r8 B7 P) w% o
namespoc_e AA\BB;
( P% V% m: _+ v3 x0 vfunctio_n showInfo(){
" O' G3 L5 {8 K    echo __METHOD__,'<br/>';
7 n$ V- P# @, E$ h  R6 a1 z}
* `% S& a" ]8 b2 x0 u  wnamespoc_e CC;9 ^- n& r/ ]% d1 {5 ?' T+ d8 S# H
functio_n showInfo(){
3 \& l) p5 T; ~7 p" U; C. C0 ~    echo __METHOD__,'<br/>';) X  _; q, J' F! B! @  A
}: s2 z& D$ x2 u3 F$ @/ B
namespoc_e AA;
9 _( U0 l% M2 A' h( q2 r* Gfunctio_n showInfo(){) K4 h) x+ [/ K& F* _) x. e& e
    echo __METHOD__,'<br/>';
: a2 ~9 k1 \5 S( |# b! w" D}
8 x2 q; W; b( B% e, w2 S: i//非限定访问:用于访问当前空间中的成员
" S: _# F2 @& P' g! {showInfo();" _: R, m) C4 U! U$ Q
//限定访问:只能访问当前所在的空间的子空间中的成员
3 C* w$ u0 V9 R9 g! T' eBB\showInfo();5 l* w& @; \8 m1 H" X2 q6 h( ]/ C
//完全限定:可以访问其它所有的空间的成员  _! K$ [4 N* x; ~
\CC\showInfo();( w! d+ f2 l: U. F
↑根空间标识符
. `. B3 g9 e! c/ W  S  H----------------------------------------------------------------------------
1 S3 K5 @" m: {& O3 @% ]6 `: v: o但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:; N; A; D. K. J$ Z
8 {2 E6 o6 O: f2 q. t
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
' J' M8 x5 M+ [# [6 h8 i" T: k# F( {' C
代码示例如下:
: ~# k0 f4 I# f0 r
2 _4 {# f' l# r% r( _4 a* t----------------------------------------------------------------------------
2 m4 e. X2 h8 O7 w$ j7 Q; H) r
/ o3 x/ A4 O6 q1 c3 r* K: P/ R; \) R
04inc.php
2 g( u8 k7 ?: N# }) t6 |2 B0 ~<php
- ?: P2 d  }% I. e6 A0 ]9 Q1 H" t6 ~2 ^0 ~  p
namespoc_e Core;- s6 S7 B8 j; Q! e# b# X/ O5 b7 p
include '05ou.php';
" n: j6 \2 [/ V/ B, i4 L* Anew \AdminController();
5 r6 x6 L* \( Z" P; L/ c  ushowInfo();
4 X- J3 s3 L5 V) W- ?
1 }0 S! B* Y9 r% {" }echo P;  C8 K, W0 H: i2 X" u, _
//根空间中的成员,只要类的访问必须加‘/’' G+ }, w, j0 E0 X  z) s
----------------------------------------------------------------------------
# Y" @5 W! B. @+ t0 H& f+ Y9 v+ i/ L: m- t/ P9 G
05ou.php0 T: Q: v4 W$ |- ^$ F
<php
5 k- f5 M$ Y" B3 lconst P=5;/ y; X- X9 h: P4 j6 W$ y
# j8 t' j, A$ m$ M" T9 b
functio_n showinfo(){9 I3 X7 d) \  s8 g; a
    echo __METHOD__,'<br/>';
/ i& T6 l* ~* U6 \$ w; c4 k- `}; x4 p( f% H" V: W; l

! d1 p& |; x- g3 ]0 r3 V3 z4 mclas_s AdminController{
& }6 r1 @$ K- L) V- w" |9 b6 y    public functio_n __construct(){, L; k+ ^, Q  C$ f/ e: H
        echo __METHOD__,'<br/>';9 V; F9 l# ^6 g, ]' ]& v6 e
    }
4 h, @/ M" g5 Y. p; X3 u}
4 ]5 f' N- t1 H
' E1 b+ v$ n. B5 |5 u第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。" B0 G, z, N# w* E% |; q! j
----------------------------------------------------------------------------
0 D; H3 ^4 r5 ?- v, V3 F8 ~2 B04inc.php+ g- D+ ?! q: v$ _5 M
<php9 _3 A# }" t2 g8 R2 [

$ x+ b$ M) B* Znamespoc_e Core;
$ z; o5 e8 {9 Z7 ]include '05ou.php';
# |+ f+ _$ s; J8 R0 T5 F7 Bfunctio_n showinfo(){4 I3 U2 e2 N+ B- [# C1 H4 A
    echo __METHOD__,'<br/>';6 J+ Y! g8 M+ M9 {4 T# m
}
: a! A2 ^5 I4 i
) e( a0 J( M  `" u: inew \Controller\AdminController;
3 C8 O7 A6 ^4 i2 [7 q* R----------------------------------------------------------------------------
) z6 [, z8 ^5 a2 C4 B% l) a05ou.php. K7 z* Y" X/ @
<php( r0 n: s' R2 ~! ?
namespoc_e Controller;: \2 H; e5 V( b7 }

5 @& x4 @8 ]  W/ gclas_s AdminController{
8 c% X7 Z5 f9 Q) J; R, c3 r        public functio_n __construct(){
" o8 F; |- }% J  m: H                echo __METHOD__,'<br/>';
, N, H! q- r6 t& e    }; H6 i- B  E  m- j9 U6 n
}
: Y3 T4 ]: x0 C----------------------------------------------------------------------------- B8 U$ B3 f0 }( s

3 _. |- C2 ?2 c, F8 y4.引入空间成员:
1 N2 j9 C9 \. I: U* B) J% T1 c
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
/ n! s4 w0 }: [% }# x
' e( _' I) j. d) r----------------------------------------------------------------------------; U8 J, `" A- Y" V+ F

: h& }. Q& O# m! Q7 T04inc.php3 P' n$ m" w! Z+ n& f5 A2 A
<php/ }, y# y$ i: {0 C6 z# Y- {* m. K
namespoc_e Core;) S* y3 M2 F& |5 f! x
use Admin\Controller as con;
5 ?5 [" B; a1 u1 z  T6 k
% W3 c" K" a+ [9 E/ w& linclude '05ou.php';. c0 F" ?' ^4 f& r* l8 S8 o6 q

1 R) V4 w  V1 h6 {! l5 ^. Dnew con\AdminController();6 k( b+ l! M* c1 g8 k; I. G, Z% P
----------------------------------------------------------------------------" ?- y$ N: G7 p7 S* s! [
05ou.php
$ `2 S, I4 |4 c( K! C0 v<php2 V2 h# l" \6 I3 ?& r+ d5 S
namespoc_e Admin\Controller;$ j& }* _( [1 f9 h$ E1 U
9 @& K2 G9 `6 x  F* X5 d
clas_s AdminController{" W& O: }+ [. s) S" ^
    public functio_n __construct(){' {; s2 N. ^; [8 S
        echo __METHOD__,'<br/>';; ]. w* e0 U6 @" Q! n$ U
    }
. D; m) ?! M8 `' M$ Y8 r" L+ ?}+ d! `, Q1 }$ H) I( {% [
----------------------------------------------------------------------------
2 Z9 T* [6 A7 m4 }: b; y$ W2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。( ~/ Z0 l' p5 o5 V- z+ W

( m8 F9 P' \& S* K$ J----------------------------------------------------------------------------* K1 z2 X; R& T

/ |* a& E$ W- d( S. Z4 m1 |04inc.php2 d+ V3 O/ ?! {4 h+ _3 E" b8 G
<php
, N8 G+ F; Y' [//引入空间成员类8 V7 a- h* A3 ?  A$ {

8 Z. X: Z4 M: b/ q, ~namespoc_e Core;
+ B- U2 b" B# quse Admin\Controller\AdminController;' R' V( D1 k! y3 G6 y
include '05ou.php';4 ?+ l6 S5 h# D+ m) P2 U! ]
' Q$ P/ x5 p+ @2 l
new AdminController();3 R5 ?# D4 o6 M6 L1 m( }
----------------------------------------------------------------------------. ^: g$ w1 p+ x( p0 H5 d9 K' V) t
05ou.php
* i: r% M  q, ]<php$ U. {  U. J9 \; z& Z
namespoc_e Admin\Controller;
( u% a4 M8 Q$ y% }8 ?
% z' x8 W, y0 i7 Q7 Tclas_s AdminController{& H! }3 |7 ?3 }9 ~4 X5 `8 A) R
    public functio_n __construct(){! V6 p: Q3 G, b5 Q+ ~& z
        echo __METHOD__,'<br/>';
1 F& a% P. x3 i) F+ `1 t    }; W! b$ t1 L, s) C9 G) k# ^2 h3 @
}
8 }: A: ~: \; Q& E----------------------------------------------------------------------------
: ~& ?0 j* e* |  M5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
! Z0 V1 J, ]* Q
  \/ S. s/ B$ x! d0 c& @9 }. K7 r: N6 G  k( o! W5 n5 v
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。& L4 O$ \1 Q0 w2 }7 V2 z7 b
$ D8 x  D8 Z+ z, X2 Q- l
+ ^+ k9 S$ w1 I6 e; L

+ U/ S+ g& |% C- N/ u( M$ b1 n! I# s) X8 {6 r
0 P7 Y" P, d1 `/ Q1 F2 q

0 B: x: f- h- c) J' t8 {* H3 U

最新评论

GMT+8, 2025-12-7 23:06 , Processed in 0.055018 second(s), 23 queries .

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