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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
) x: T! S5 a; w
8 ?, s: ?+ e0 P2 F在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:5 S- C" B1 f; e4 j- I
8 x& p1 v# V+ O1 t* s

/ n( f! m' s, D5 Z/ ?
% Z% k3 ^' {) i; j5 x6 w8 H我们来详细的讲解一下PHP中的命名空间:
. M/ e* S, {2 L9 ]6 @" @4 }! F/ W+ ?, m
语法:namespac_e 空间名\空间名;2 P& |0 N9 d3 _# a7 B
# H0 q; D1 U6 z2 y$ T6 c
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
% ]* ~* ?! u! j8 u3 ~$ }6 g
: a* g' L3 T* ~* B----------------------------------------------------------------------------
& g" |0 I" L9 \, B. W" A+ k/ W7 O3 K
<php
) o2 ]+ W& ]. r. s3 {
' M) Y6 X1 Y4 l" |namespoc_e AA;
. r- ^9 t' @& C! rfunctio_n showInfo(){$ \+ _1 l1 H" `" q' p* o2 x/ K
    echo __METHOD__,'<br/>';. h! b) `5 {$ P
}9 b9 o% n% t9 e! M
showinfo();0 v; Q3 [% z- e7 t' X

8 i! b- d1 H$ E  n5 Pnamespoc_e AA\BB;
! @7 l" ~; {) z$ S; l( K
( [0 V- V/ Q0 P' @- O, Mfunctio_n showInfo(){; r. [8 ^) q5 ^5 v4 L" f
    echo __METHOD__,'<br/>';
9 B/ P4 p1 z4 ?8 w2 @7 y8 H# k" V}
+ ]4 R1 V+ [: H. @; w: a  K//showInfo();. n/ O5 f! @3 H
----------------------------------------------------------------------------% I- p* u3 \+ Q- @9 \) y9 D0 a. y. H0 _
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
$ _3 p6 d9 D$ L7 v/ g2 |  c* m: D+ o* C3 R
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) b) b0 i( l; d& ^. L- B
2 n% o6 V8 b7 T1 @* q----------------------------------------------------------------------------: i0 @1 W" y5 R3 Z2 Q3 \2 `7 K
4 e# y; o1 B5 Y' T1 `
<php
% n- [9 @3 C3 Unamespoc_e AA\BB;; ~6 a  U/ L; ~% A) Q
functio_n showInfo(){
* ^& l4 Z3 d; _! W( O8 M! e6 W    echo __METHOD__,'<br/>';
- y: \+ ~' ]0 v( J  L, ~}
" f4 @: V9 u& H7 S* n3 Rnamespoc_e CC;8 i$ q. n0 N3 {- f0 m3 ?
functio_n showInfo(){: r& F: W- S& [4 e& S
    echo __METHOD__,'<br/>';
9 k% K2 Z' c: a- W$ ?9 e}/ \8 [" A4 @$ s
namespoc_e AA;& \+ i% J, j" }/ a# _$ ?$ b' `
functio_n showInfo(){" U7 A, L8 R: Z$ u* f
    echo __METHOD__,'<br/>';
* `8 f# I' M4 q; A  r}- y4 p) h; v& j( M, A# q1 O$ d% L
//非限定访问:用于访问当前空间中的成员  f4 W: d* u% B; }/ p9 r0 o! s
showInfo();
6 K2 V3 o/ e: o$ m! N//限定访问:只能访问当前所在的空间的子空间中的成员' U# F. h9 N& M) L1 A) z. R) A$ ?
BB\showInfo();. ^0 s2 ~. \4 r8 d9 n- q0 Y8 P( D% A
//完全限定:可以访问其它所有的空间的成员
# w. F! V, A8 v1 i, P6 ?3 s\CC\showInfo();  S3 z. X  a; e9 O
↑根空间标识符
5 ^1 h7 Q+ \" p+ M1 l7 `/ \) m----------------------------------------------------------------------------
/ i, E$ ]4 A) U0 I" _但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
! K/ |% F: f* @: P8 W9 U4 u
, A& \5 J; X' f$ Z; o& u当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
) c0 J4 A" R" D, P4 s# |6 Y1 K) X& \& g2 V! M3 B
代码示例如下:! J% B9 v5 B% m' ~7 I5 F
$ q- Z8 ^' o, u3 o: v8 g
----------------------------------------------------------------------------
# h' _) {" R4 b  ^/ v$ H; d4 {, J+ Z  c( L3 O/ {! u
: {' S$ r5 H4 t6 h8 p. H: b4 V
04inc.php
2 y3 v- t. L( C, J) {% U9 i& |<php& t  }( i+ S" T* T! u9 W0 G; p+ y
1 J! M$ O0 s4 _! F! V% s. N
namespoc_e Core;
' k* a+ ^, X1 v6 [0 }7 S$ hinclude '05ou.php';- A6 S) q/ r1 M( J/ _8 S/ l! p$ I
new \AdminController();# N2 [) L& H) Q( i# F
showInfo();% |% R$ g" r7 k- Z

; C9 ?; K- g0 F3 B- ^1 \2 i! Lecho P;# F0 O0 G/ H! [, x8 L" R% t) @3 q
//根空间中的成员,只要类的访问必须加‘/’' A" E* W" Y) W
----------------------------------------------------------------------------
7 }6 s; P1 H; h8 j7 L7 m) {; N
( w- h7 D0 k4 W05ou.php
3 q! a. e' g/ W: I, O$ y/ a<php+ Y# O' G. W4 c4 ^; }
const P=5;
. f2 X& m/ O7 n, Y2 P5 A% S$ \
% Y9 M& @3 C! @  a- ~functio_n showinfo(){  y9 E( `0 g" [2 k
    echo __METHOD__,'<br/>';5 w9 v4 q5 b) N8 v4 `7 D
}, G# t9 Z4 ~9 H, W; C* T

0 x( o) C1 r1 u6 iclas_s AdminController{
  m5 W5 r9 @# G2 a    public functio_n __construct(){
; K. o( S: t+ L3 _        echo __METHOD__,'<br/>';
, e; _2 {" ?" O! f    }
% X+ {) h1 R$ u- q}! @8 e6 C3 |* l6 Y3 h$ T

5 n( N5 ^% r/ r4 N+ [第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
# ^" G4 `* d! {- g5 J" g3 U$ W----------------------------------------------------------------------------6 M5 t/ Z/ H- {6 R. {9 }) @( P  S
04inc.php
& c  O0 n9 c9 I7 S+ I: o7 z<php8 i) W: m5 p9 U5 d2 s
! P0 n& {4 b; V7 O5 A
namespoc_e Core;
  A- |- \& e' |' Z5 ]3 Pinclude '05ou.php';3 O" y' }" E- i5 V! a; A
functio_n showinfo(){2 ?# \& h% a' p/ \( M& ~
    echo __METHOD__,'<br/>';  F! I+ m3 d% _
}
* W: }; E6 Z8 ], Y0 `# q1 v& _, T2 W- Y0 U9 G# J* h" g
new \Controller\AdminController;
$ a, f* q  d4 i' _----------------------------------------------------------------------------: r3 }7 b+ x5 N) e
05ou.php
! t% Z7 X# U" v' M. `; P$ k- f<php
$ M* @- m" ]8 p& f5 nnamespoc_e Controller;
# J3 Q% p  I. T* G# h" J& P# b8 m2 l
clas_s AdminController{- j) Z* P7 r) s- T) e
        public functio_n __construct(){
# o0 \$ ]! A; ^2 q- t% I) L, b# z                echo __METHOD__,'<br/>';' v% Y* ]' @7 }, s  e( p
    }
) k( P0 r( D# d/ K}
; X0 r8 E3 v7 u+ r9 G8 z8 m----------------------------------------------------------------------------7 v. _5 a: r* D  ~+ F1 j
) Y0 w3 w4 K# I* k/ l/ i
4.引入空间成员:
2 H$ z! N# w6 m' T4 |
# Q) s0 l, v* A8 k3 H& p1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。( X/ T5 N7 [- `! T

5 |8 q+ W% j" {) L# _' w3 v----------------------------------------------------------------------------! s) @& X; f, c8 u" P4 U& |
( K: o& }: y! w  `( A4 _% {  K
04inc.php7 N8 b3 Z. z" h# [
<php  I5 Z5 r" b5 R- g' P0 i( M
namespoc_e Core;- v+ W$ |, w. }' i" m8 b
use Admin\Controller as con;: E& M' d. @, O$ R' W! w& f

% R* q# f1 t2 m" }include '05ou.php';# O1 |$ {3 T( A# U# D
6 E# J; Z# g) }
new con\AdminController();
# P5 J. u2 w9 y6 r! t/ c  g----------------------------------------------------------------------------. J& @; }9 r! Z& R1 k: h% X  v
05ou.php0 F8 O  ]4 ~2 W7 p
<php+ e2 T8 D3 o6 t" w
namespoc_e Admin\Controller;5 e" [' F( D% }' O! |
( T1 F, t8 t% \5 z+ l% [
clas_s AdminController{0 z4 V; P: J& m) ?6 ?/ U$ u9 ~
    public functio_n __construct(){
  {* h7 h) k- n, H" b! q$ e        echo __METHOD__,'<br/>';4 \- G/ J1 p: Y: B/ n: D2 w
    }
6 r1 M( ?8 g% R( m}
7 x( l3 X# }5 h( [----------------------------------------------------------------------------
2 Q2 g* O" c7 i. T+ ~( A. g* B! s2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。; l, }( c2 Y! \9 k8 X
& O- u; j) }4 K. H
----------------------------------------------------------------------------) u; T/ Q" B" j9 @

2 m* z3 X0 f& x- j# X% ]04inc.php
$ Z5 D! i4 V& e<php3 d. @9 _" ]. x# |4 h
//引入空间成员类
3 z8 o2 l3 B3 e! Q% G/ o% h( t" T+ s: C4 Y7 P
namespoc_e Core;
5 ?/ t: {" |! F" s/ @) Vuse Admin\Controller\AdminController;
/ j2 o: u" _! |include '05ou.php';
- c3 n. |5 O1 |! ?5 ?& G2 S  f# Y2 ]/ x8 ?  ^3 e
new AdminController();
; b, X9 y9 L% h3 Q$ J7 r----------------------------------------------------------------------------
4 P/ q- k* V8 q: P9 u7 j1 X7 b( i: W05ou.php
$ E1 ~* x6 @- P/ Q4 A<php
) k& @1 ?1 {' }( N) O' Jnamespoc_e Admin\Controller;- w: S! s/ M+ D4 Y6 \, D. y" C
# N$ s) j! E6 C7 Z, x7 Y( b
clas_s AdminController{. s# c3 L) L0 `$ _& Y
    public functio_n __construct(){
: G; m4 X7 C- ]* Q        echo __METHOD__,'<br/>';
& u5 |, M& n; q8 `+ M    }4 p: k- o+ G4 z8 g! G! ?: j
}+ j/ r3 P, v. ]
----------------------------------------------------------------------------- r& H  m& U. E# c
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。" S8 S$ l; x: p, M3 u8 b2 b

, J2 T/ e. r- f- M" N; v9 Y5 p: V
" V- Q) O" [+ q! p这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。' N1 B. D2 E( B9 a0 x; k/ _
  T6 w; v& n3 e" |, W5 z

; s# C, }( D' Z2 f1 m. s1 U" n' ?, F* C
( {- q2 q# l! @" s
& i5 U- I8 C8 Q) b
* b) k7 ?! i2 v! q

最新评论

GMT+8, 2024-7-27 12:34 , Processed in 0.130696 second(s), 24 queries .

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