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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
  [; h; o; |& b# o, t6 D1 x7 p
( e% v2 x& n2 X( ]$ w/ Y在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:" c& v! @$ S- B; x/ L/ W
5 @3 p7 y, y% e) f
20181201105307520[3].png
. d/ ~, X: P" O3 t) Q6 u& E& F( v$ R5 I+ b; O; W; w
我们来详细的讲解一下PHP中的命名空间:
9 K/ \: C( E- ~) g& h$ k. l8 L: i" q/ g' r9 q
语法:namespac_e 空间名\空间名;; G9 e9 G. a7 a) B! d# Q5 [

+ t! K# t( C5 y. L4 j4 R# M8 F  [! S, w3 J说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:# W" o0 l4 g- l
5 ]2 ]* U. S5 F4 P' t
----------------------------------------------------------------------------9 T8 D! v! F/ c
' B& M7 O8 J  Y) G3 g% ^5 I
<php$ Z5 ^: i. v8 C' S. H7 a

- P3 d" Z2 A7 `, g' b0 unamespoc_e AA;
# L: Z6 A/ e( I8 A6 w* t8 ifunctio_n showInfo(){6 r: i" k+ m! P
    echo __METHOD__,'<br/>';1 c6 i+ t* R. D1 Z  d6 [4 o
}
, c" f& @% y7 y2 V3 bshowinfo();
# u' }! i0 h" m: Q5 I& g$ ]
" y6 Z: [. [; I$ Knamespoc_e AA\BB;" k* L8 k1 M$ n3 K

1 I7 g$ Z9 K& `3 C8 {# _$ m5 mfunctio_n showInfo(){) O1 S( w# v9 ]3 V
    echo __METHOD__,'<br/>';! P" C6 M" @( c7 y% L: @
}
3 F6 h4 S, y+ X$ V. t- b//showInfo();
; b) Y$ l) X5 Y& P* t" `4 \5 v----------------------------------------------------------------------------
7 j3 R  a! G! o# {# C; P( `; `" b2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
: L3 d* {; _0 h& }, w
( `5 E1 g5 `, c+ Y- f2 w3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
3 P: \* e4 Y) k  n7 i1 ]2 l+ f- N& W% ^3 R# O" j
----------------------------------------------------------------------------7 H" R/ }( P8 u8 M8 }
0 Z0 |5 D3 P5 r& x$ p  p+ l  W
<php
4 f/ f$ L  z0 @( u% G& _namespoc_e AA\BB;4 V: Y3 C1 f0 c& K4 \/ {
functio_n showInfo(){
+ W% O+ [$ d& p6 P  o; ?; }    echo __METHOD__,'<br/>';$ v5 m9 ?. ^' _  g
}
9 I' m3 G8 X6 F6 @8 ^  _" Lnamespoc_e CC;
; z5 r2 f, L1 yfunctio_n showInfo(){* J' \8 ]1 {5 |/ u* u
    echo __METHOD__,'<br/>';
7 z* E8 ~4 ?- c7 [, N}6 _; ?+ I) o" a; q" v3 a$ M1 i
namespoc_e AA;: u4 Z' L4 @$ x% Y% `
functio_n showInfo(){
/ h0 |7 i6 E3 d1 E2 ~$ z+ |5 [    echo __METHOD__,'<br/>';* d4 _) P$ `7 b$ F& Y" e7 _
}: e! i" x! s7 a7 [
//非限定访问:用于访问当前空间中的成员* ~# l) K9 `9 K7 I
showInfo();
0 |% ^( _% |  M//限定访问:只能访问当前所在的空间的子空间中的成员
$ m( H, v6 N# |" x; \1 SBB\showInfo();. S% k- m3 `+ [& g6 u# V
//完全限定:可以访问其它所有的空间的成员' ?6 k6 R  v: Z1 t8 k. h
\CC\showInfo();3 G& Y/ S$ j, u& R
↑根空间标识符
) C& w% M: e( E# V' R6 t----------------------------------------------------------------------------0 Z# T5 Y* k5 |& U
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
- O& Y8 [+ A) _5 K4 \) J% h( ?$ H
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 ]' d1 }* P  r* f/ q* x; d0 f4 [; u! N  Q# i
代码示例如下:  A4 s  t& A( a, H& U

3 k. d3 B5 W6 p' e6 K1 M----------------------------------------------------------------------------( E% s) T. x, C. U

! p5 V5 ~0 c. I) {5 W: U
) Q- j, I9 E0 ~" y/ m0 s4 x& _04inc.php2 `7 N, k! Z: E5 p$ L3 y) ^
<php
" d8 b! e) _# T) @+ ]2 ^/ P, G- B+ G  _7 T
namespoc_e Core;
" T5 n7 H+ o* ~, minclude '05ou.php';
, ^) e* M/ Y' _9 v1 M& c2 Knew \AdminController();; \9 [9 l. n+ C& G
showInfo();( N1 ]" ^& i* R* h7 l% D; B

" {' P- f% I  \6 ]3 W/ g! qecho P;
" D& `( r" }# }- P; n9 C//根空间中的成员,只要类的访问必须加‘/’0 n% ]0 B/ Z8 f7 m7 z3 `& k
----------------------------------------------------------------------------
0 t, B- o; b# t/ R" J- v. t3 o) i" G; l8 }8 p' ~; ]+ u
05ou.php7 ?# N, S) C( b) m( R( g: u" Z
<php% p* r' T0 Y4 D- ]
const P=5;) N; n$ U0 P+ ?. N# C6 x. O7 o

" k: K! U" l+ \4 y+ T7 V+ L8 `functio_n showinfo(){
6 l  }. w9 T5 u" m7 y( H/ Q9 g; @    echo __METHOD__,'<br/>';
0 F0 O5 y/ _/ o  l) v5 m: h}% B- {! G" S/ q# y$ H
  e4 R" C# `1 v
clas_s AdminController{1 p- K7 g+ J! M+ r, V$ A1 ~1 z* ?
    public functio_n __construct(){4 ^* S, d1 U& G4 t! G& L
        echo __METHOD__,'<br/>';3 e5 k1 a* n( N  I; Y; }  d
    }7 ~+ J) G/ [" ?2 ?
}2 {! _7 t) B2 j, {; k
! ]- u1 _1 u/ a( O( h, m4 W1 H
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
6 z9 O+ {/ ~) f+ M----------------------------------------------------------------------------0 N: ^2 T0 T* N  e7 n
04inc.php
8 j. @- r+ k! z5 @9 d. p& K; p<php3 h$ @8 s8 o, f7 ?/ B

- q% w; Z: Y0 p% Gnamespoc_e Core;1 _2 Z5 S$ _4 U: |6 `" L& [7 ]
include '05ou.php';
' k6 ?' D' ~  X9 X; b. Q' S$ pfunctio_n showinfo(){. _1 T* ]% ^3 o. W" I
    echo __METHOD__,'<br/>';
3 q! n/ _' K8 T$ k" D}
  X' q; P8 O: \5 G8 k9 x2 |. K& {- o* X9 H
new \Controller\AdminController;! Y9 c# v; ^& Y; d' A& I) p6 d
----------------------------------------------------------------------------+ t& K8 A: X8 b' j& \
05ou.php! |8 m0 q2 f3 p+ o
<php
, n! c# D& u( _/ ?: {namespoc_e Controller;5 S! P  P: f% M

3 j* }% c* ~# i0 p$ Xclas_s AdminController{- R' A: b' h% l8 m) |+ U$ b* A
        public functio_n __construct(){/ J1 \4 d8 n: A% f% N
                echo __METHOD__,'<br/>';  p+ x! f8 h* r- z( x$ W5 j
    }
# }9 [9 n) f! L, c! }$ x  [}
- ]2 u) f1 O8 w2 p* Z/ M: t----------------------------------------------------------------------------0 E% V! n% }, U1 N, i8 W  y" E
$ ?3 p% U& M4 b2 E+ s/ V  v
4.引入空间成员:# g8 k- ~) b& @5 Y

) t. I- ^$ B$ E) F# m) _1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
9 d* ^. A* l, v! j
9 N4 Q) W* O6 x7 a! \& L: x& V/ t----------------------------------------------------------------------------
- r9 J" s* w$ U. B, }0 Y) t: S4 T- V9 ?* j( |# i" A
04inc.php
4 [6 u& T, Z8 Q6 @5 s, g) l7 r<php
. Q0 C% b6 K9 V3 tnamespoc_e Core;
  H! A- @- e* y1 ~use Admin\Controller as con;
$ `0 u- |; K3 }* G% u( z- _" y4 v, ?5 Z2 N2 k0 h
include '05ou.php';
7 w9 X0 _# B  n: A( p* p/ `
" s5 Y( I* I2 o( E; Y/ L2 K) b6 fnew con\AdminController();& v& H0 X! X' X
----------------------------------------------------------------------------3 H; b* v) C" z  J% G
05ou.php
. }* l. R3 Z1 T( W2 l, t# X<php* U6 s4 I( G0 E+ C; L% ]
namespoc_e Admin\Controller;: e$ w, I& T( g7 O
! n9 [8 [9 X5 C6 k9 T. i: T; m
clas_s AdminController{' Z* D; |% w; z; b
    public functio_n __construct(){
4 G9 ]: e* l+ ]2 f1 j# h        echo __METHOD__,'<br/>';
1 Z9 G9 h( I; }" W3 K    }
6 H' d# d7 t; e/ |1 p! l}( ]- V* ]& H* n0 i4 {5 m, E1 e- ~  I
----------------------------------------------------------------------------8 y7 O5 v& S* E( G/ T
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
3 t9 M1 r! {% u. ^( i/ ~  P, N' \4 L* a4 s& v
----------------------------------------------------------------------------
5 S# w4 g0 `& {- ]
, K: ]& j1 A4 `04inc.php4 q4 N$ k0 K$ j% a" s$ F* r" T
<php/ U) T% {9 f# Z- c$ O0 ?
//引入空间成员类/ T/ R* r2 j2 }
; n% I+ I8 ]$ z- o9 o. q; y
namespoc_e Core;" s8 S) ^2 _$ J6 Q7 A8 {5 L* w
use Admin\Controller\AdminController;$ Z+ U! ?/ R$ h) U$ u/ {9 @! g
include '05ou.php';: e  a4 u' N; ]  I. |* j

$ C' Z3 O5 `0 C  l5 cnew AdminController();% Y7 i  Z( ~  b
----------------------------------------------------------------------------: _% ]5 A( G7 d$ J# q8 T
05ou.php
+ Z+ @6 F/ d8 l<php: q8 Z. |4 u1 ^# K1 B" T
namespoc_e Admin\Controller;
' x1 t. p8 @$ Y; A+ @1 S/ M0 W0 V2 l9 B4 x, z
clas_s AdminController{
  }/ u5 Q% o* ~6 z) B0 |2 S    public functio_n __construct(){
5 i2 Q- M7 b. _, s6 D7 L7 h        echo __METHOD__,'<br/>';
/ ?0 S  r3 M6 Z" S: H% \# c    }
, }5 _  X) j# S8 E1 N) z& @}* ~2 R* t% t  C( x2 O# x
----------------------------------------------------------------------------  {( H5 I" r+ A; K" J
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。5 L% {) A# C2 p, M5 h
  E5 z6 p  x. E  P

. m6 T6 G6 ?! _4 [这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。, F' W0 h: }. p- o. k# }
1 z/ n5 J, K2 T
+ D3 d0 T3 G$ i" ^
3 {3 s! N  Q( ~: f+ F
. B2 R% w2 }- ]

' N; [$ ?' B1 v2 H* h* o
7 c  \+ D+ L) p2 a; ]" ~, d

最新评论

GMT+8, 2023-2-1 17:40 , Processed in 0.122861 second(s), 25 queries .

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