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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:5 e3 q" u6 B' {: |

# P0 U) Y$ v1 @5 e: i7 F$ y% k# \# C- t在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
1 J1 ?$ U7 D$ n! U7 s2 X
' d$ R1 `$ X# z; c0 e4 S+ @ * K# _3 }" x- p+ n6 f! R! l) j1 V
" n( u/ r7 k8 u3 q/ g/ v3 u6 n# A
我们来详细的讲解一下PHP中的命名空间:8 P7 X2 h4 m& p* l4 |

# g, y) D  M5 z语法:namespac_e 空间名\空间名;
* r8 g, L$ m% p2 R# g( Y% B3 n7 U2 s0 X& k
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
0 U7 S  Z. s3 \. T' n( N2 h$ \
) n, H% d: k  w----------------------------------------------------------------------------' j% m% x, p; x0 D' C1 t, a
- r( ]& t; M6 Z$ _+ p$ G
<php
0 O7 S; J$ Z, q% R( N
- }" t# {- X. o, z$ knamespoc_e AA;1 f8 I, T6 j) {8 ]! L$ v. p: D) Q8 I
functio_n showInfo(){
* M: L9 ]+ p& L! U( x( P    echo __METHOD__,'<br/>';
) K' l( x1 o6 ]' M; @) Q}- O' R1 j" w+ Y5 Q
showinfo();% Q; z0 O/ q0 @* q; m- c/ s
. y/ x4 U" m! Z  D4 k
namespoc_e AA\BB;6 {  f$ J1 Q) i6 U
( K* ]4 L+ J, o! I
functio_n showInfo(){2 S+ D( r! ?0 L& Z7 m3 u
    echo __METHOD__,'<br/>';6 @. x) q& l/ T( K: T" j
}  }1 ^7 Q2 |( V4 X7 p! B9 l
//showInfo();
# |' A$ H' I. G1 c7 Z3 @6 c7 g* x----------------------------------------------------------------------------+ K) C2 x& y, F$ E; }1 S- U
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)$ C1 N4 ~9 w' s" A. C9 ^1 U
. R' X, |5 j" a' C! q
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。4 _9 M% R1 H' i: l4 ]
2 T; M4 v/ k  T8 K2 b; w) Y- a
----------------------------------------------------------------------------6 E7 _2 N7 F+ v- j
# U7 P0 r' ?' `, M& T; U
<php6 _8 a9 |& p$ r' J3 B2 U
namespoc_e AA\BB;
2 q8 M: R8 \  [# Gfunctio_n showInfo(){# t, E* |$ S& o/ _! b9 Q- T, q* w
    echo __METHOD__,'<br/>';4 G2 T( q- k) i1 _  A" c# M& G
}
! C0 `0 v: G: A, K* knamespoc_e CC;
% V+ J2 f: ]* r: y0 O; }7 ?3 Wfunctio_n showInfo(){
) H4 G: l* l) f5 D    echo __METHOD__,'<br/>';9 b9 N- c& y1 y  x. K4 H2 E$ Q
}: |, ^" e* @) v( a4 e
namespoc_e AA;2 r' _& `. k& r! e; [; U5 N9 T) p/ J
functio_n showInfo(){
5 {1 z! K4 e/ A9 r    echo __METHOD__,'<br/>';( ]1 q( p1 ^) E# e1 o1 {2 c1 E
}; U4 @$ f( i2 Y' l
//非限定访问:用于访问当前空间中的成员( e* C1 z1 y  C# y9 N
showInfo();
  v( P9 ^' g7 i' k7 f) f//限定访问:只能访问当前所在的空间的子空间中的成员6 u: t* X/ ^+ N: y
BB\showInfo();
% S+ W+ T5 x# b2 h# k9 T//完全限定:可以访问其它所有的空间的成员
  Q! f4 W) Q4 x  G3 n& O\CC\showInfo();
0 Y: t3 ?3 Y3 q↑根空间标识符" T5 k: n! _' r* B. f2 ]- x1 T
----------------------------------------------------------------------------
# }! i" ^6 e6 H5 t  g1 e9 ?但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:7 C+ g* s# P% e9 T: v. f0 t. j. V

/ k# c9 w* k( S6 Q' a当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)) H7 D/ _5 a! w# R$ x3 w
( I& D7 K' a0 I7 X
代码示例如下:5 s5 p. M( s3 x3 J9 a: Z
& C( D( |/ w/ m+ K
----------------------------------------------------------------------------  e* f, |7 m9 c0 E4 b7 o
! {* ^6 E6 d$ g6 _& p% e
4 r) }1 `" y. j& Q- d) w
04inc.php* o6 l0 V4 y2 A  N# ?2 D' j0 O* [
<php1 ?- s9 {# q( |$ ~& o

5 S& k9 t3 Q' S7 i  d# Rnamespoc_e Core;
/ D' U( t, q9 y/ ^7 q4 J# {include '05ou.php';& x# [" h4 @6 v- v7 Y& Z
new \AdminController();
' ]- n4 g- N1 Y0 O& |7 Y& UshowInfo();
! K! V- b; ^! T: l/ j  t. `* p, J0 e
echo P;
/ [5 F% [0 Z$ e5 j7 m2 d# D//根空间中的成员,只要类的访问必须加‘/’
  j# c3 s# L3 y----------------------------------------------------------------------------6 I8 G4 V! q  h2 G, \

4 Y0 l9 [. ~) G- H4 L  Z7 S05ou.php8 c. c& p/ |6 u4 c5 A
<php
$ u$ C9 S) B* U' o: w$ B/ f, e3 Tconst P=5;
: K# @& C$ ^/ S9 }6 U# A; U3 b& {$ ^6 a' ~1 v7 i8 D% W2 _
functio_n showinfo(){
7 a& n) m5 H! |    echo __METHOD__,'<br/>';% m* v8 E% }$ {* J3 w
}
; [8 r9 |6 M9 D* h9 w! g' ?( L' C9 @  |' k- [/ v( m! q5 q
clas_s AdminController{
4 e0 B, T" _6 J4 v9 ?/ A: O    public functio_n __construct(){
+ v8 V0 U8 K& K# c' p! {        echo __METHOD__,'<br/>';; j, o1 k, M7 a1 V5 ?
    }7 X6 X  C$ ]4 m2 ^$ \
}
" A4 E: d% d: W8 r! |" C  u: h, S8 [7 {* N
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
: j) h; k) {  v7 J) |" P----------------------------------------------------------------------------2 t" a& a$ B2 I! R
04inc.php% E$ F9 s* y* }$ N4 Y
<php. P! x( ]0 \- j+ k! s! B
7 I0 g4 ^% L: t5 h
namespoc_e Core;8 z6 Z# \, u" G% a
include '05ou.php';
; V+ W" B( M4 ~' d, ^functio_n showinfo(){% a* E1 S6 w* j" ^2 B6 w! a1 c& u
    echo __METHOD__,'<br/>';2 d" _) s6 d- W  G% m& {
}
5 P7 P6 W" [/ j" ^" ~! Q2 W* ?3 c4 e1 ?( S+ f! h8 U; i0 v
new \Controller\AdminController;2 q) N! W+ x( v3 @
----------------------------------------------------------------------------- F1 u9 d! t+ q) n/ X% \
05ou.php
2 x2 Z/ ?3 }9 L' J<php
/ x6 N9 [* `/ M3 j" r; C+ b* @namespoc_e Controller;
* o% E* T1 q3 l& x/ ^4 s" z; V# O# H. T1 q: I+ n
clas_s AdminController{
/ @6 _- \( Q8 @* c: Y' G        public functio_n __construct(){$ y2 N! F4 Y" L. z
                echo __METHOD__,'<br/>';9 y4 u0 F3 V! k" r) }! o6 H  K; a
    }
: p, e$ U- |3 U& _}
3 A  F6 a1 K8 s* [2 H  I$ c* U----------------------------------------------------------------------------; e, Z0 g$ m% L

- y. s4 `# w# N1 C- k* l4 L4.引入空间成员:9 ~5 V3 t- x% H) S7 R. y% [
" ^: E; h9 d8 |5 ]4 T/ Z
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
. g. b% g; V$ C" s) P# {% j" H
7 x) X" a( k8 {" {( s6 p----------------------------------------------------------------------------
. o& k" k- ~: T3 F7 S. W
% n- [8 l# B. E. Q04inc.php9 U& V8 a+ {: a- \, j
<php
* U/ G. m6 Z+ G& l, p" cnamespoc_e Core;
5 K. V8 t* j$ F" Luse Admin\Controller as con;
- A! J$ i- D: a( h
' [6 {, U1 ]  F, p/ oinclude '05ou.php';+ i7 |. F5 j$ j5 ]7 P' w  m

$ f& ?0 `5 x6 o7 m5 Onew con\AdminController();
* r/ `* r0 n0 e2 o, Y----------------------------------------------------------------------------5 h2 o1 n) ]: d. V1 y$ i- V' W
05ou.php
! C) z$ g9 e# n<php
5 ]" w, E- B; N6 h- a  ynamespoc_e Admin\Controller;
  }5 o5 o; B  c0 e, l; F6 e3 i) ^5 I0 \5 U" A1 y
clas_s AdminController{1 B) o  z& Q& E; ]
    public functio_n __construct(){- R% |: f! J+ w' r6 u4 R' A+ }- C
        echo __METHOD__,'<br/>';
# r- g* d% J8 z7 B1 `. x0 K, s    }
/ F( p/ D9 I" E8 J; Q! ?2 \' V7 G}/ m, `& L- s: U9 H( g' g: ]
----------------------------------------------------------------------------
+ o9 h6 H8 @1 F/ m3 {2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
0 W- C' x# Y# u' ]
) g4 Y# b" _: T& ^. }& L5 ?! b9 M----------------------------------------------------------------------------2 {/ b9 q* {$ P0 B  c6 i
; a1 r& o8 H# G  h# d$ e
04inc.php
7 d7 Y  z% i4 U) \8 h<php+ B9 S+ B9 I& P. y2 S
//引入空间成员类6 D! _" a. x: [1 r
) x3 I  J" n; M
namespoc_e Core;' O! p, [  ^- Q
use Admin\Controller\AdminController;3 _/ U# G+ i6 ^
include '05ou.php';# p, ~2 V1 [7 q" G7 b3 T. j

# \* `; t& H+ _& k  B3 e4 ?2 @5 Enew AdminController();* v9 ]. N  S3 \0 p  ^
----------------------------------------------------------------------------
' t$ @+ I: M6 z8 d# U8 j; A05ou.php
6 q9 F$ H3 F9 f9 {, H& u2 b<php" j1 {# i7 l; m
namespoc_e Admin\Controller;
# R/ U" F* w% Z, b! b4 F, b5 U: R. C+ @+ q/ N. F& r) N
clas_s AdminController{
( Y+ \* x# _; W' |+ Q& f% H0 c, t    public functio_n __construct(){" ~+ y) n/ X6 D2 Z% Z
        echo __METHOD__,'<br/>';/ ^) J: ?! j8 a; a8 O1 F* ^
    }
- F* X1 Z/ d3 E* {: p  j$ z}: ~# Z9 [+ S% z0 M
----------------------------------------------------------------------------% B. D1 p: N, L, B2 I% K
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。# h1 S. T6 w. Q  k9 J
9 q5 o- Q8 N5 O9 i5 W" Y
! c" }0 p- y* F1 J5 h' E0 }
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。+ m4 e) q( @" M# h+ H% ^/ O
8 u3 X( ?. F- K1 P$ W& D, ]

2 t, y$ V# X3 E5 b0 V
6 l& c7 S$ i+ p
: b: c8 _" C* ?+ W5 W
" L$ i+ G4 ?; l; u  Q3 a5 `, Z/ H" L* n# c4 G

最新评论

GMT+8, 2026-4-30 19:31 , Processed in 0.061421 second(s), 23 queries .

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