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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:' C: F  P8 {5 N# P& ?6 i% B
  ^5 b: v, g: K) f
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
3 @/ ?( k" o0 p; o1 }
0 y; \9 s/ F: T+ Z/ y0 B 20181201105307520[3].png
: o6 S: `. }& R7 {( G. ]6 f" B4 B; a  k
我们来详细的讲解一下PHP中的命名空间:
5 U: ]5 i0 W* ^3 j! T9 s8 q% C( `: c
语法:namespac_e 空间名\空间名;
5 o; y- ^% B* k: Z
3 ]- a6 J) Z% _- ]4 m: ]$ v0 O( H说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
/ K4 o- [3 X* b- U% a
5 N/ ]) k" w. y6 e1 ^% t3 @----------------------------------------------------------------------------1 L8 ?1 S/ J9 k0 A

3 B$ |* |9 k" h& q6 B# J<php
5 V( B3 ?) D' N/ s9 K( O5 \: e9 p1 Q4 x4 m! _
namespoc_e AA;1 U3 M: B! X( m$ H7 d
functio_n showInfo(){' @& J0 a: z2 q9 ~+ D
    echo __METHOD__,'<br/>';2 x$ N5 E, W6 x( C
}7 n+ [; _3 I, |( ]" s5 D
showinfo();
  q5 |" I, V1 S* P$ h
7 n: j. d% B* Jnamespoc_e AA\BB;& ], T& |+ w* ?; g, D

# z. m$ Y3 \/ x. t5 Ufunctio_n showInfo(){
% a7 Q1 N1 [+ L    echo __METHOD__,'<br/>';
' P+ q  S( I/ x}
3 `; v: J/ a3 \" Z//showInfo();2 j2 u: u) H% U' P0 v: R
----------------------------------------------------------------------------
/ Q! c2 K7 b1 y4 r6 w2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
: u2 X) }* A9 W7 g9 i# W8 V8 C- r! B* K, H3 Z
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
3 [) d4 C5 w( s; J6 X
; N: t3 C0 u- W! y----------------------------------------------------------------------------
# c: i3 t  d: j" ?# Z6 E7 b# M* Z
+ l9 ], R  k" c( [: }( w+ L! K<php# z6 \5 M) E: f( p0 s7 E7 L
namespoc_e AA\BB;! B* V- f2 c  i- x
functio_n showInfo(){
: _& E4 r+ ]# d- J- t: s' d    echo __METHOD__,'<br/>';
$ C5 Y; S. E9 M7 l+ u' o}
1 @& \4 O! n: rnamespoc_e CC;
; K2 S5 D+ h- ^- b: W$ Ffunctio_n showInfo(){) s8 b8 F9 D* A3 q4 H
    echo __METHOD__,'<br/>';' S& {/ x& e2 K) @, V  c! e+ N4 \
}# I5 i2 t  m0 v" B3 E+ g5 Y
namespoc_e AA;1 X; u. B- l) p9 U
functio_n showInfo(){
$ r7 v' p0 N. |: P- P* @8 s    echo __METHOD__,'<br/>';
3 J: I. \  h2 x5 _) ?. ]( X6 w' P}
8 P2 V" A7 x2 D6 j5 s+ e9 l2 i% Q3 l//非限定访问:用于访问当前空间中的成员: }" G4 g( U" g: ]) r
showInfo();& Y% n" Y! T+ ?1 n6 J3 J
//限定访问:只能访问当前所在的空间的子空间中的成员; s' V$ `, P! u2 I
BB\showInfo();0 x2 e  V8 S4 a
//完全限定:可以访问其它所有的空间的成员2 L+ ]' c6 \1 ^) n# `5 j1 |
\CC\showInfo();$ l3 j  g- _3 v
↑根空间标识符# m, D! J/ C+ g' L$ l3 n8 P
----------------------------------------------------------------------------4 V: Q& |2 d; d6 d* Z0 M2 ?6 ?
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
% y, _& Z  u, i/ d7 F6 R; J6 G9 Y$ {: K2 t
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
" l; g" U7 Q8 A- \! m
4 v- i" i5 a# Y' H; a) d5 h代码示例如下:
: P. c+ p4 p0 n- D% N, G  L; }; R/ K6 S* s6 D
----------------------------------------------------------------------------  m' w( Q' B# S3 r! ]: a

) p5 [: }8 K# `5 N/ ]/ x5 Z9 t% w& o9 C) s8 \( ~  v
04inc.php
! ?) r6 C" r  K7 V<php
3 m; b2 |- x) C' ^
# P; D' \; D# f' ?7 x$ o3 gnamespoc_e Core;
. T9 N6 f' p( K( T+ J. Ginclude '05ou.php';3 }) F3 t4 l+ G# p$ F4 M  V, o
new \AdminController();
, v6 l) p  |9 N+ b* P, @showInfo();, @) ?$ `3 W- ?1 w$ k

. U5 _: t  l) v. w$ T7 wecho P;
1 f9 c5 ?9 o) [//根空间中的成员,只要类的访问必须加‘/’
, A) a" j, R% J8 y5 C5 w----------------------------------------------------------------------------' j! w* q; B( ?. _# F

5 N  j1 y5 H1 n5 P4 J05ou.php
/ ~9 {4 N. C1 o8 Z<php+ l: o) ~1 c3 v
const P=5;
9 J. @/ }2 ^( p1 T+ O( w. K
) c0 u* G  T; cfunctio_n showinfo(){9 J2 ]. o6 l  s2 d) \
    echo __METHOD__,'<br/>';
" J/ m. z9 j) |9 G5 x}
1 c( w0 D5 X% w* T* p* ^! m) y$ w4 @& d. q% Z, r. Z1 l; a
clas_s AdminController{6 d4 H9 O8 c3 m0 M0 Q
    public functio_n __construct(){' F- i; m8 t9 t' H1 {/ Y% j
        echo __METHOD__,'<br/>';: l; N6 _/ D5 Q  R0 S7 o) E0 H( U
    }
! P$ b! ~! V( X0 O  A3 q: b}
  ~- C6 V6 D% a2 Y; y
$ }. _& ~/ F# `2 ]( W/ c第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
- A* W2 h" X2 p5 l: X- B7 z$ D: v: J----------------------------------------------------------------------------6 W/ ?) l5 M3 W* |+ c
04inc.php' C, M, k' W0 h4 H4 u
<php/ I3 c8 ?+ e% J! U: W

  ~) j) G1 }7 gnamespoc_e Core;
( l' {6 w* M3 _6 tinclude '05ou.php';' H$ z$ b1 K, T2 s9 Z
functio_n showinfo(){& ^* n6 D3 O. t, s- X, x  K- Q  Y4 Q
    echo __METHOD__,'<br/>';
7 x% `2 l; K/ H( L% G' }" z}
/ |, g6 l+ H7 p4 g( H$ k
% u: c1 F/ s% }  R- C& T3 inew \Controller\AdminController;! ]  C3 x$ @7 l( _  n
----------------------------------------------------------------------------
& I. W8 K; N) r9 W6 _5 @2 q05ou.php, c' ~% K' m  h  v. f) U: V. j" ~
<php
' |5 i0 m4 j8 _' z  unamespoc_e Controller;2 V/ e* h# D* E/ L6 e

! o* n$ T. z, C6 Mclas_s AdminController{" E5 c: x$ P1 ]
        public functio_n __construct(){# {3 f1 w4 [' Z
                echo __METHOD__,'<br/>';( E  `- `3 ]/ [7 a0 N$ [! v
    }
+ I- U( D9 `9 A7 ?& I2 b' d0 d}
3 T6 Y+ Q/ @7 v! G( s# Y9 b1 @----------------------------------------------------------------------------2 N8 _4 ]. m9 `+ z

7 a* n# c* ^" u5 W& N3 k9 h4.引入空间成员:0 a, _9 D9 y% E3 p4 a6 `! m' j
9 N% N: B" _! Z. X/ m9 D8 E7 _9 _
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。. P9 J: _4 T  Q8 i% N

6 {  C# D* R2 }: @----------------------------------------------------------------------------) n% x9 z$ A+ y7 g) k2 g) I) v- x
& U6 R# }1 I( N( Y
04inc.php
* j1 G  h! [$ @<php
# K3 T- P* o% e6 [+ O$ I. \namespoc_e Core;
! _5 r: z4 G5 z3 ?use Admin\Controller as con;
3 l, g  I+ Z& X: h& z) d" N; Y4 s8 B5 j0 A: B) j; v
include '05ou.php';, V% n" f% d* n( U4 O' ]* `. _

7 \( @" `3 B$ q1 z6 |new con\AdminController();
% U. {, I3 I) `/ ~: ]----------------------------------------------------------------------------7 G, F! F7 x, Y" i* t
05ou.php0 e8 l9 m7 P0 m& j. J4 P
<php
4 g, ?- u0 G5 ^3 Znamespoc_e Admin\Controller;
1 h0 Y. g, t. m& s0 u
# |$ ~: N! p, Z5 q9 oclas_s AdminController{7 C% \8 c& e, e
    public functio_n __construct(){# L" P3 ^# I/ u
        echo __METHOD__,'<br/>';! Z9 y: g9 o2 x0 u% B; H0 k$ b* j
    }0 l- r" S& G# R; @; j
}: x7 E3 ~: ~5 Q( k  Y+ L+ I
----------------------------------------------------------------------------
5 @5 [- ~6 W! H2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。# I# n7 K9 Y' b/ x, c; l! d
6 d4 i) z9 o3 M7 `
----------------------------------------------------------------------------
' x$ P. c/ p6 {5 L9 }  u' X4 W
9 g. `8 w6 L/ I! G0 O2 [1 J2 j04inc.php# D4 a$ N# K8 d4 e! j$ X5 ]
<php: D' b6 V+ k3 C4 ?! @- h' ^& g
//引入空间成员类
4 [+ R4 N9 h# W; `2 g6 `- E: l9 [/ U" E: e* W- P# _5 M8 e6 `
namespoc_e Core;! E$ ^: c( F3 ]- X
use Admin\Controller\AdminController;8 p( L; x' F. p4 z
include '05ou.php';
- x! S/ e2 A* Z9 y' r% s$ R
& ~( u# q$ }0 ?. T/ R2 inew AdminController();* k6 L: ?: x7 p! Y- R3 s& [
----------------------------------------------------------------------------
' D2 m4 k5 `" ?8 g4 a05ou.php, q; t0 a6 g& P; f0 w3 [
<php
2 Y( E& B1 K/ ^1 d: ]0 t& cnamespoc_e Admin\Controller;* w0 X4 E4 Q. g4 k, B  A

7 t( N! `+ X( m3 H; Y- Pclas_s AdminController{
. q# ?7 h$ J% ^( i    public functio_n __construct(){7 c* o% b- m: n( o7 {- d! w
        echo __METHOD__,'<br/>';
; s* j5 J4 l4 a- D* O    }0 H( {9 f9 q) A0 W3 `* ~2 ~
}4 ?0 f( a7 C" H6 o1 ^
----------------------------------------------------------------------------
* [* V2 i# N6 W# \5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。4 }% N5 F1 ~% N2 p! w* c9 c

% l: \! G# p0 k$ A7 {5 k
) I2 D$ L. I  ~1 r2 j( ~1 g这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。( \! Y4 p/ Z2 i' X2 X2 p$ A

2 D2 M! c' z7 {- l  M' k) M6 e3 P( F4 H

/ s/ u1 n7 Y2 d8 A, c4 y. g% h+ |! G: u9 o

" O# [! U% P$ V# H' K, i: p0 r
- d+ v+ S8 T. c$ j

最新评论

GMT+8, 2024-3-29 23:03 , Processed in 0.139950 second(s), 25 queries .

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