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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:$ y1 }& }) \  {9 h* a. B% j( M

9 B# b' W+ V4 m  s, K. I- A在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
' y& m( G3 O1 o. ~* q! G! r- Z2 a$ \7 g3 S0 U2 q) H) b

% m; H2 p- \/ d, r! C7 g
) D2 M$ b3 w+ {$ R4 e7 }1 H我们来详细的讲解一下PHP中的命名空间:
  v+ b) ^7 |% [6 r+ p6 u; l8 z" E  k1 C
语法:namespac_e 空间名\空间名;" Q! N5 O$ t$ p7 s3 `

: Q7 s) b% o( O" i  `9 Y说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:8 w  l  v: M% p) N% K
- h# v2 m$ l: E/ T
----------------------------------------------------------------------------' p! w' a" a* M& s

9 K8 `. Q, ?9 A; W% b* T<php' n1 q1 f, S6 I
! f0 i; E3 K, C  E' K/ n% D* m
namespoc_e AA;
7 c/ r; ^% J, Y# `& Efunctio_n showInfo(){
1 m- b5 r/ A+ R& g$ r    echo __METHOD__,'<br/>';1 B7 Z2 ~( \$ Q3 P" h8 @
}
1 i! M/ b4 _- P5 p( l* z/ X. Eshowinfo();
. J' o  J: d' q& v- ^
4 |: R# Z- u1 ]3 Xnamespoc_e AA\BB;4 }. C0 e+ ?, ]0 C  H- P. _

# }$ O, ~- S; P6 F0 sfunctio_n showInfo(){* {( ~& `+ C9 P2 T, I
    echo __METHOD__,'<br/>';
6 G! K, j  q/ X6 i# H}
3 ]' e/ D  H' ]! h% p//showInfo();! Y' J8 g0 I1 O
----------------------------------------------------------------------------# K8 @( C/ E3 t/ ?( X, y
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)2 Z. i7 R0 x6 S) D, [
8 q- R& z$ J* S8 G8 x8 V
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
9 m/ R# `8 e3 z/ `4 b
! t. ?  x7 E+ b* _- G# z----------------------------------------------------------------------------; `2 C& d6 r1 Y" u# h

) Z6 t3 C2 t4 m1 r) z$ ^5 p9 Y<php
0 W1 f; @. [% p8 gnamespoc_e AA\BB;8 z0 `, T: U6 s. e2 n
functio_n showInfo(){
- y2 r, E- m& {8 K    echo __METHOD__,'<br/>';
( J1 ?: A( v( G5 g/ E" ~}
  ~- _/ p. }. Z9 {) onamespoc_e CC;
+ T: j# X7 I) l6 G, Bfunctio_n showInfo(){! o( `$ |& D; K, w5 h
    echo __METHOD__,'<br/>';1 Z. E, K) P. `' Z+ T. A$ N& F% X
}1 `& C" d3 o. \" ]
namespoc_e AA;
8 E. ?; F6 @: Z/ m1 tfunctio_n showInfo(){
3 V! @; z1 ~3 u) r3 a" |    echo __METHOD__,'<br/>';8 x' _' u. {* Z# M! _( I
}2 ~9 [+ `/ G! g1 t
//非限定访问:用于访问当前空间中的成员
7 {1 u* B) A& T* b: MshowInfo();
8 \& }% U+ A0 I. ?6 Z6 d% y7 _//限定访问:只能访问当前所在的空间的子空间中的成员
8 C; j, V# b! I9 h4 C0 tBB\showInfo();( d! w& r9 z$ x: }& a
//完全限定:可以访问其它所有的空间的成员# c6 u  Q/ w, @/ `+ ~, H( R
\CC\showInfo();
% S9 `8 D0 d" K/ e& T8 X↑根空间标识符
% d1 G. u; c5 \% x# D! l----------------------------------------------------------------------------
5 g9 e% _. U& s+ I但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:+ ^* M$ P0 P: H+ |
& `- J* a* P0 o0 H, l+ I4 L$ f$ o
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
! f, q$ k4 g) c6 Z  Y
! e* b- i- J: l  N代码示例如下:, t/ H$ _% w' r* s* q4 ~- s0 M* g

0 ~8 z$ F2 H" P- |/ I* ?& X----------------------------------------------------------------------------
$ Q9 Q) l3 ]& y% D
% V% Z. y1 F9 [5 ]8 W# N- [. l/ O7 \
. b/ r. O- \+ B5 E  N04inc.php
, d  J# |0 q' \2 I( z2 \' Q7 j<php
& t* e% `5 \) b; z# _' i2 e0 s
namespoc_e Core;
8 B3 y6 X; t& M6 u, ]include '05ou.php';
% B# s; r) B4 b3 hnew \AdminController();
* ]' d" P9 i) u% a* L8 {/ F9 NshowInfo();
6 J* v& x6 }& G5 D$ O, C/ V, H
4 \' N( b- k0 Techo P;! F( J( B7 ]2 F
//根空间中的成员,只要类的访问必须加‘/’
  ~) `$ T5 z5 f- v7 R----------------------------------------------------------------------------
& {# ?3 G6 S' w/ A9 w5 C- g  ^" r, M" x0 f+ U8 L; c0 p
05ou.php
' \2 W# N2 W! D8 V<php
/ P4 m, x8 N; Z3 ~const P=5;
6 d" j9 {& I. t, o) r0 ]5 C- v, v' N! Z2 y* a$ B3 m
functio_n showinfo(){3 j9 d! ?# {: _) n6 [+ _( U+ \. p( b
    echo __METHOD__,'<br/>';% k5 d* ?9 n5 D- B/ q6 ]6 ?  B  E
}. |$ K! U2 n2 R
) v# s3 a# i0 c
clas_s AdminController{
8 p9 |3 H/ X3 |1 X! a. a: U; z/ K    public functio_n __construct(){  Z0 {" t: l/ N9 T: W2 g7 l
        echo __METHOD__,'<br/>';
* e5 j) X3 g1 y/ v9 R: y    }% Z0 ?/ u: S$ M, g) T' c  C7 y
}
9 P' r, g9 S% o& V9 \9 ?) k" b: }5 }$ @* Q& h0 U6 p; {$ v5 l
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
/ t- g; t% c' ]5 S' r" g----------------------------------------------------------------------------) Y# g5 ~* r7 T! S
04inc.php
% v5 w3 C+ p! k% `! Y5 Z<php
3 a/ h9 g3 v! h+ O6 ?
' ^/ V% q* ]! W% J# [4 enamespoc_e Core;& W" i8 V2 W" r8 w* c) Y. I$ t4 U: {
include '05ou.php';/ A- W0 {8 H/ p0 b. {  L$ g2 d
functio_n showinfo(){9 {" o1 Y+ I* P1 d& {2 B* f8 S
    echo __METHOD__,'<br/>';, f: T  `1 l% S+ b& B  T
}9 @0 ?8 D- |* D" Z/ S) {! P8 y
7 B% A* l) r; k* H' I2 f. M
new \Controller\AdminController;3 q# ^% ~! x* q; H4 y" J
----------------------------------------------------------------------------; P# Q3 v9 n8 w* C
05ou.php8 _2 \# R  `& n) [, ?8 V7 t9 @: P
<php
( Y6 O; c6 e8 r# d7 pnamespoc_e Controller;
: @! P  |. R* f5 q1 I% ?" f& j/ L
clas_s AdminController{
9 D4 s7 `# q& _; v. {        public functio_n __construct(){
; `, W4 U8 b" Q) @6 F8 ~: r                echo __METHOD__,'<br/>';5 z" p+ C. ^2 e% V- d6 s+ y
    }; c6 [% S7 R4 g" f) T* x
}( _5 y$ V4 i) g) ^% J
----------------------------------------------------------------------------$ J5 E+ @- r) T: O( t6 e

0 P- G5 i% U. X/ c4 B6 `3 V9 `4.引入空间成员:
4 A3 t$ A4 M6 G
4 R& l( X* A7 m% |# y1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。3 P4 ]( e$ E9 U* x# D* n

+ p+ I& ^7 G& H8 x5 K; I----------------------------------------------------------------------------( a0 f3 {, @0 q# j; O( f
0 M6 {& e; ]" u- X. i  ]  m+ k: A
04inc.php
4 A5 s  y: j" U/ ]" ?<php
& R% t' B; B8 f6 Enamespoc_e Core;
) e/ K3 Y3 u0 Z8 A$ tuse Admin\Controller as con;
- Y+ a3 y  F; F, d9 G6 n! p0 D, y$ t1 k* I8 p8 F2 e
include '05ou.php';, w0 U7 L: v9 e/ c0 V& n# L& G, [
! l; ^7 ?$ u# ?( P5 U9 A" E
new con\AdminController();' X) i0 k5 k. G' w' j. e% B
----------------------------------------------------------------------------
" F6 I# A( c8 n% r- o  I5 r05ou.php" T3 d/ \' Q4 u9 |  i, J
<php3 J! V; e) u. w. X7 ]+ \
namespoc_e Admin\Controller;
" T. B" H; r6 z
: b- i- y( v# T& k$ S: a8 Q7 _* Hclas_s AdminController{
0 M$ Y  }- j$ T" ]- i" Y2 ^    public functio_n __construct(){! l7 S3 y. o& k- Y0 [
        echo __METHOD__,'<br/>';3 v1 S9 _1 I1 K3 Q' R6 ~- v+ M- I
    }/ {/ y6 C+ f4 C: P
}
- M& s# o6 @: R" U5 h  u----------------------------------------------------------------------------
* z+ {! X; Y' _% j! d2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
- I) Y% i* q4 z) n, }3 J! P: ~0 F7 y( j
----------------------------------------------------------------------------3 G5 |7 }5 B- ~) t. k6 @! ~; c" u

5 x- t' [3 n. m% J# r+ Y1 h: [04inc.php6 A" [* w% x1 Q
<php
6 U+ H: h, i. y4 f* R//引入空间成员类
% A( H! G; A8 m; J2 d1 }9 S" R7 i; P, C* L" |8 L& k- H
namespoc_e Core;
6 s" e0 ]% \. X8 Guse Admin\Controller\AdminController;
, ^$ z) ]: |' ~& [1 p: Z5 I) i. ?include '05ou.php';( l; [0 `! l8 \0 U0 U/ u- u1 {) _' L

8 {: |) k: v6 j2 z5 ~new AdminController();- v4 u  i, z# @
----------------------------------------------------------------------------6 J8 V5 A% t3 \/ I# q/ ]( J
05ou.php% o, y8 y( k5 B) U  t0 u  Z
<php* x- m# |) M6 P3 e
namespoc_e Admin\Controller;: L- C6 |0 e2 L2 F

( O" i% k  T1 o% aclas_s AdminController{
4 [, `5 Z% H  r) H$ t    public functio_n __construct(){. `1 r* o) h0 y2 a# s  c, }- u7 x
        echo __METHOD__,'<br/>';5 D6 V* M. w, G& F6 d* r# @
    }
9 s$ g$ h2 i+ s2 s* f) Q! Z( n}
( `3 h8 d( R: K* U: C+ g4 d( N----------------------------------------------------------------------------) `" V. w/ {6 }6 t% F/ {) }
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。1 F7 |3 I& a! I+ T6 F

3 \3 d6 i- K( R
/ _" ^* {7 a7 |+ G8 `2 v* _( R这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
6 |9 X) Z8 C' z3 e: v' S9 [; }, z8 |, g/ H. x" z. [' f# T

. z2 L6 d# h" z: i( i  H0 d- t) N- T6 l0 b! I

6 b2 V0 J) b1 @6 c) H8 z4 r8 w3 P  b, q* G
# _( J3 n  g, d9 o5 Z9 a0 Z0 q

最新评论

GMT+8, 2026-3-16 16:45 , Processed in 0.074288 second(s), 22 queries .

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