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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
3 v$ b6 A# H  l( v8 J+ p) K8 N  [2 n2 H& j0 h- ^- W' g
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:7 ^1 M' R; y. G7 `

" G, L& A. u+ O+ g) ?5 A 20181201105307520[3].png 8 p+ |% [& {4 o4 ~8 O, t

% ^# e  T, A5 q: m" V+ k我们来详细的讲解一下PHP中的命名空间:- ]4 `! z* i5 @: E. p( P5 d* w& e  E
8 i& p: l! Q5 n$ k  V9 l
语法:namespac_e 空间名\空间名;7 Q; j/ K' c: z: [' o; L( z

+ P* W. M; b! g1 r说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
7 e/ L& U' v1 L* U. m( K3 z+ a: s1 g9 `7 ~3 h/ J% x8 H
----------------------------------------------------------------------------
/ ]3 X$ s5 X! J* M( Q7 {% O7 q- t, R2 o! Y. C0 |
<php- J1 k) X& h5 j' _, ]: F" v! Y
6 ^& a9 u. l6 h0 M6 L: {- b" M
namespoc_e AA;8 `6 {% Y1 M2 h: A- w( w" v
functio_n showInfo(){( S: B0 \) A' m9 A* I: t
    echo __METHOD__,'<br/>';2 m. |2 C% o. q! l8 s
}0 S" K: H# `9 V
showinfo();5 L5 t/ C( x$ n6 |0 b% M6 \) X
# v% Z+ }$ H0 T# u" Q3 D
namespoc_e AA\BB;
: w/ q& s; k, v) K, A- x, }) J5 g! E, I& O4 e, b
functio_n showInfo(){
/ N+ j8 q3 M! k. U- B    echo __METHOD__,'<br/>';, I3 E$ |* H7 |1 A' T1 v1 S
}
2 t- _9 h5 Z( I6 U+ M. u//showInfo();6 e5 N9 o) v) K' y* y/ u
----------------------------------------------------------------------------2 o6 x8 @+ J/ [
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
! L3 Y9 i4 s7 P) P% |4 k% I' a' @+ Y9 o) U, q
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。. K  c6 z. n, V1 c- Y8 \8 M

( T- R$ w0 j6 }* M  D# M----------------------------------------------------------------------------
" f: V5 d) }7 J. x/ l0 `9 o! t  E: `' K& U
<php  T7 P5 B0 a* b
namespoc_e AA\BB;; W7 c& s3 c  I3 P. n2 D4 \
functio_n showInfo(){
8 T! d" g% V. `$ ?7 N9 n    echo __METHOD__,'<br/>';
7 A+ `/ T7 f0 W/ `" y6 }, S5 I  K2 ?}
- y: S& y: L, f$ K0 k; |namespoc_e CC;
* f: B4 `! D  O8 pfunctio_n showInfo(){% n3 ?! d1 x4 b6 G/ z
    echo __METHOD__,'<br/>';
+ F- d4 p5 f/ _, n}9 V, O! M! q  I% M) ^: S- Q
namespoc_e AA;
6 }( }4 f/ F' B4 Dfunctio_n showInfo(){
+ [9 b: L+ G  n% o# r$ ?' y    echo __METHOD__,'<br/>';
& U1 Q6 w! q/ r% d$ t}; E$ c' }5 I+ f. s# W
//非限定访问:用于访问当前空间中的成员
2 z5 m" n. V* D; O/ F4 r6 qshowInfo();1 l+ G8 \  c/ d+ i' f. f
//限定访问:只能访问当前所在的空间的子空间中的成员8 a2 ?8 M) ?" \
BB\showInfo();9 g: \: G+ D6 i9 y. j
//完全限定:可以访问其它所有的空间的成员
0 C/ J& B' A$ c8 E\CC\showInfo();; k3 [9 C' m$ z* l, ]: o2 d
↑根空间标识符, A: ?& J0 \  H( @+ ^
----------------------------------------------------------------------------
" c& d0 C2 }/ C" X( G* k但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
5 F1 ^5 K6 }4 f4 v1 h7 z: f3 r! p3 c, N
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)1 ~& K2 X  P6 P: h9 m4 q

: W) a  b# m8 C5 V) |代码示例如下:
& _3 x! I. T& D* q; B2 \% f8 ?3 N% R- ~& q+ J6 i2 Y# I1 N
----------------------------------------------------------------------------
0 h) ?% q* l6 _. \* o, X3 }2 W. U$ {% I# d' _

5 p- G6 m2 L/ J( s! X4 j$ L& C04inc.php
3 ^( y% w, |" o) M9 X+ Q+ B' E<php8 r% y- M5 @& g* c! B

( M7 S0 V) z% @: ?namespoc_e Core;1 ~( q6 ^: u0 Q) w& W) ]  r4 I
include '05ou.php';7 f) K9 B) j6 |! \, {/ Q5 C" n
new \AdminController();
/ r# `! P# X  Z6 n  SshowInfo();1 I& [6 _) ?! Z  o" K1 \  R
6 P( C' P2 P6 p% u8 B% J- b
echo P;5 m, v' E1 y! {9 \- T7 J
//根空间中的成员,只要类的访问必须加‘/’
+ Z1 h3 A  X4 i& Y8 }: \" G----------------------------------------------------------------------------
+ M- T, R1 b7 |
' E2 ^; h3 {' f. U8 y/ f) N05ou.php( S& K, o+ |+ D( b* V2 g% D# R; o
<php
/ r- V6 r& D$ S( V3 qconst P=5;
" U0 M  k% Y; I% u4 D
- x  S9 D6 W+ f7 ?functio_n showinfo(){6 A: w; i) A$ B, c! @
    echo __METHOD__,'<br/>';7 o  O& v2 K  C! N, e
}
- ?& x6 n& _% P9 ~8 h( K+ \- {  R
clas_s AdminController{3 Y; [. r0 n  i6 V  X2 A
    public functio_n __construct(){& |' V. D8 b- ]) |# M
        echo __METHOD__,'<br/>';% B, w' z1 h6 K2 c1 d. e" R
    }
# O5 F' b" c% y}; n4 w# |$ c1 ?1 B; \

) S; z) s# x4 z) c) l第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
: S! [; s' S: @4 Y----------------------------------------------------------------------------
& E3 L; n8 L3 I3 }& `04inc.php
+ U# O$ \+ F9 u<php
4 C7 w- }% p8 V2 F0 g' ~7 j
6 ?5 N8 ]7 Q% e8 Xnamespoc_e Core;( p) M$ i+ ^3 L
include '05ou.php';
4 r/ |# R- `( N* Dfunctio_n showinfo(){+ \! [" U! i1 j4 k9 a/ i& [5 h) S( s
    echo __METHOD__,'<br/>';0 v( Q- g2 A; l+ ~4 N& p) h1 p6 s
}* ~8 q+ K/ f2 v6 `+ Y% g7 m
9 V* n  @; S: A, V
new \Controller\AdminController;
4 ~) r3 h4 B& k  i8 f& L----------------------------------------------------------------------------' U) P5 p  A0 h, s4 I9 |
05ou.php
, l& T0 ~  p8 p& E8 O<php; u- w. s( L% ~0 s- \6 M
namespoc_e Controller;1 x/ S' b% x. n  z

1 G8 R( f4 b9 L  g0 S4 F" y0 Rclas_s AdminController{8 i) C  v' a" \( C" q* o
        public functio_n __construct(){
; ]9 L: o2 `9 _4 {                echo __METHOD__,'<br/>';
. r( u; ~2 x! R2 {, d- G    }
. P3 P! Y5 }) v7 f0 Y}
5 b* C2 T" H7 R5 l/ ~/ S6 O& m% }----------------------------------------------------------------------------
. r9 d3 F- N" R3 J- o- D7 i' T7 M- v+ z' ]
4.引入空间成员:: N6 I& [$ j% H! \7 B

6 \+ P4 }: F9 D; H1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。: Q3 j" B9 Y, u5 R# B

% ^, q$ E% b5 I$ y----------------------------------------------------------------------------
4 K& ~+ k) [" J+ i: H+ ?$ S3 M! ~* N8 R9 f. G
04inc.php- `1 z7 e8 H! H  O
<php  w. Z- O, j. Q7 i
namespoc_e Core;5 W% x0 d0 u5 a0 w9 n
use Admin\Controller as con;+ U2 m& P( i! k8 e) C) O

* y0 j- v" M% y: F1 g5 S  @2 Zinclude '05ou.php';3 x7 {) G+ B0 @: W. V
# m' z0 e8 t  W
new con\AdminController();
. |' p9 V4 ]) B9 C" B# J0 C----------------------------------------------------------------------------9 @* j( |3 d& Z
05ou.php
# @! @8 e0 D2 S- R+ f% m<php
- o; J) s/ Z5 d# h/ y2 r( L) inamespoc_e Admin\Controller;; L: e8 H" W; }) V1 M

7 L* C% S8 z' s/ W) L: Z% n: L7 ^clas_s AdminController{& `: D. ^1 P! y$ M2 H3 v0 B
    public functio_n __construct(){' ]  P( {+ Y4 O6 `" ^
        echo __METHOD__,'<br/>';
9 N6 v: o5 e* o  C    }
2 F+ c/ O' X; j- X0 _9 j2 _}7 k& f8 z; H- v
----------------------------------------------------------------------------
2 t1 C4 Q7 t5 P2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。4 b" z% c  n8 n1 ?9 N/ e2 k: h

- I6 G  A3 i' T% N# z: _----------------------------------------------------------------------------8 S( {; Y% y, F" z! h! Y
9 G) D9 w3 O0 X- \0 G
04inc.php. Q1 f- M, v* F& q, c+ S
<php; T; a6 D* x3 N8 }5 F1 r
//引入空间成员类
: l9 y7 b6 f0 w; Q/ U+ z4 h" Q
2 t- o6 {# s% _( b8 e8 @namespoc_e Core;+ J5 ^7 O( V- q3 H
use Admin\Controller\AdminController;
: Q+ A0 u5 H0 s0 r# \include '05ou.php';
  r9 u& [. w6 p. j8 z) A/ i+ D. J  H5 `
new AdminController();
, s' B* X3 `- x2 ^' C3 n8 h----------------------------------------------------------------------------$ }( u; O: Y1 j3 z0 x
05ou.php
# W, q/ q7 ~% W! p) B<php$ c  N, w6 p1 I6 g6 I
namespoc_e Admin\Controller;- H3 m& n  W; B( ?) J; q
/ b7 x$ u6 G; F7 M/ @+ O: C! f) e0 {
clas_s AdminController{/ K0 w+ _; U- c
    public functio_n __construct(){  `! x; c9 ?( i" n
        echo __METHOD__,'<br/>';3 x  I9 B7 J4 J  _" B
    }
8 d& M# K: g% I. U! ]}1 b$ `7 P) d8 y9 \
----------------------------------------------------------------------------
- i! x/ ?+ i9 h. K! @; F5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。% p  f9 S, \/ f. F+ _: L* B
6 Y8 m; n2 c. n) A1 q
  _" e- Z5 S: J0 A( d8 K7 D; _
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。4 |% K: A1 x+ d$ \2 i$ T
% B8 B  k7 p$ `1 K1 K2 s
; N1 ^& U  P% L# h

" R8 j/ d3 D) j3 y8 V9 E6 w) t6 ^& s
6 o6 W2 v9 Z# _' z. W7 L- N1 O6 C
! o0 w- J. k4 B, h$ g7 B+ m* ]& Y4 A# ~- A. ^7 ]7 u$ n

最新评论

GMT+8, 2026-5-16 01:14 , Processed in 0.061434 second(s), 25 queries .

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