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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 18166|回复: 0
打印 上一主题 下一主题

[php学习资料] php中命名空间(namespace)的作用和使用

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
3 b! B" d& M: S3 H' G3 _6 j7 G3 x: H- J0 `3 W( s, l! [& f
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:9 V- g. t5 m" g/ E( m7 C
6 S  a( l3 ~0 P8 d. c/ P

$ b% L( H" S' @' P  Z( E
1 Y. _# K' M* W1 S) |我们来详细的讲解一下PHP中的命名空间:7 z: s9 _9 k/ C% }
# [/ F! g8 K4 x1 `  L0 K' S
语法:namespac_e 空间名\空间名;6 a  r5 v# c: y
- S* ~) o. U! d8 ?+ K4 F& }
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
& R0 |4 }( `) e4 z  a: X: s- Y; F4 ]6 E$ `
----------------------------------------------------------------------------
) `. [1 G) U; D7 Y5 |4 m) _% |( U
" `; p. [6 d+ O& u3 b6 \/ f<php7 U) a/ {: j6 K9 K; X' N4 T* G
: |- n8 ]. v( i" H: I
namespoc_e AA;
) o$ p2 D8 M( Nfunctio_n showInfo(){
, f! z! N# X4 T0 O" w$ @& C6 K  ^    echo __METHOD__,'<br/>';
4 K2 X4 u! v$ H5 a. K% h}4 L# K  J: b1 j% c1 x
showinfo();1 z9 e" _1 W+ E+ G! U2 z, f
- v! [# N  ^! R2 @% @2 K0 y
namespoc_e AA\BB;4 g2 o: e" b- O: m- f7 c7 d

$ d6 j" a9 j4 K! x4 z6 Sfunctio_n showInfo(){
1 v) o6 [+ H* T, p: z    echo __METHOD__,'<br/>';
2 l. n8 p5 D' A: e$ D/ Z2 {5 N( P- [$ F}- s" G' }" }6 n2 Y- }5 o
//showInfo();- D4 N' i/ L% Q
----------------------------------------------------------------------------
1 z, U% m) e1 ~4 H. M4 k6 G$ V. y2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
7 h. h+ S- k0 Y- ~" @3 O! j$ L! ?5 Y, S' Z& a0 O
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
7 Y! o3 V' x' \+ @4 [" P' \& ]( ^  g9 f  q& M5 g) `
----------------------------------------------------------------------------
( [' L) }) O! h) @2 d  B; o  R2 y7 _9 o8 }! y. Q
<php
( G* ~* I# x, s+ |3 _namespoc_e AA\BB;& s7 L! P5 T; b) f( T
functio_n showInfo(){
7 o5 Y# N) x9 b6 F    echo __METHOD__,'<br/>';1 e* I( {! {3 ~* F
}
; v  y+ J+ r/ B/ s  K* p" s) V7 Onamespoc_e CC;
1 d, P$ M' C# T6 l; w' Kfunctio_n showInfo(){9 ^$ D1 ]0 p( J5 z4 [- p
    echo __METHOD__,'<br/>';5 @8 C: ?4 a7 Z; Z( S
}
( A, e; q7 u, f: z9 ~namespoc_e AA;5 z* E0 i* O+ X# y) j$ r
functio_n showInfo(){$ |' |- _. }! `' d6 M) U2 q, [8 D, g
    echo __METHOD__,'<br/>';( I" [; l) m( O& P7 A
}
8 j& W$ l' N3 U* J$ f//非限定访问:用于访问当前空间中的成员( ]* b( f2 z/ h$ C$ @  d% S( O- I
showInfo();
* r! F2 i) G7 V; u9 u, x//限定访问:只能访问当前所在的空间的子空间中的成员
' {  x8 Y! w9 h/ Z/ \BB\showInfo();, x; f' }* p7 E/ I9 m
//完全限定:可以访问其它所有的空间的成员
1 F5 w8 S7 z) P6 _% }0 Z\CC\showInfo();
' W$ y( D+ g* I0 N1 G  [/ u0 I↑根空间标识符. [8 n) w3 K+ D8 p
----------------------------------------------------------------------------
6 @" q3 G% g& R4 K但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
# ]/ H  z$ \6 k4 B) T7 }3 ]: {
" k, \! ~7 D  X, ?3 N# O3 E- j( j当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
, K8 s! B2 t- C# t% p4 P$ l4 O
: ~) E4 Z+ W* s代码示例如下:: J  f( a2 d$ t) Z5 P

2 N' K6 j8 x6 w4 t" F0 Q) \----------------------------------------------------------------------------
* x' w# N3 A4 T! a/ x* X4 I6 `: `9 S$ V: u! Z- q6 g; G/ z
; {  }; u) b# ^' ^# B, F) I
04inc.php
5 ]5 a; F' N3 V  s" L+ e" N% w<php) R: ^1 I1 S1 d' F; `  J

2 R  F: m; w1 n/ G5 e* ?namespoc_e Core;
# K+ J& I/ J2 n# finclude '05ou.php';
/ ]% u1 j5 b, cnew \AdminController();
; D5 O0 \% Z; T7 g' `showInfo();
+ ^7 @/ |. u8 k$ K/ o
) A  r# k1 M( [; v: Fecho P;
# Z9 q' V& Z$ {" E, J) \//根空间中的成员,只要类的访问必须加‘/’2 g, R) ^- z4 g, I# i
----------------------------------------------------------------------------
& E+ C3 ]% p% ~7 x, ^0 G
& A5 g) }" b8 H1 ~05ou.php- n3 q( L* K) a
<php' O9 Y' G* b$ a4 z, @
const P=5;; @, o. O$ q: I3 {- s+ M
1 _9 u  l! d+ B- A/ ~* o
functio_n showinfo(){* M2 u) E7 m! V8 r8 m1 i( U
    echo __METHOD__,'<br/>';
( }' N7 F/ T& t2 C" Y}% j/ v+ k8 ^% R5 g
; p/ F5 R2 _/ ^$ q
clas_s AdminController{
) k6 e2 B# {1 R$ P( U    public functio_n __construct(){
8 [+ g$ @- i& q$ i0 R8 b        echo __METHOD__,'<br/>';' L  o: k, W3 M8 `% |- f
    }
4 H9 y0 `1 x6 t0 m" }5 r}1 _* ^& t) Q* u# k

* }0 m4 C. v" ]1 I- `) T4 y: h# X第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 L2 I& H7 d8 i7 k! T1 c) x
----------------------------------------------------------------------------
3 V# b5 p  |& s& b9 b  o- G04inc.php
' T* @  ^' g  k: Q/ K<php: w7 r- m8 _6 p% e. H# s

0 `( M+ s0 e# O: y- wnamespoc_e Core;
+ k* Q) Z+ v, X8 q8 |include '05ou.php';
5 e; T& R5 [- n* K% Afunctio_n showinfo(){
6 ]7 J4 L$ @4 J    echo __METHOD__,'<br/>';1 o( s4 t2 L9 S* i# u- _% t
}
8 H' D6 k( o* B1 V( D! Q2 c9 {5 G1 R) u* g
new \Controller\AdminController;+ w) i; f+ Q2 U# i& J' n
----------------------------------------------------------------------------
2 m0 K' p! f# y: V- e+ D05ou.php, L  e- `9 ^* P. d
<php
. N8 [4 i% z: M: ^5 G- @namespoc_e Controller;& V$ x6 j" b& Y! c/ R1 ?6 [' g

( ^: y1 x! W: Fclas_s AdminController{( d8 W! ]: j" r8 G! i
        public functio_n __construct(){
0 E- ]) G; T0 W                echo __METHOD__,'<br/>';; V2 G( |3 y: N8 @6 z! Y
    }  g# `% G/ g8 p  y9 k. ~
}
& z, T  u" R# a5 [( I----------------------------------------------------------------------------6 G) }' O7 ?% p- S! x. R' w
  ~# ]' E' G! f1 e# s- e) H, ]- S
4.引入空间成员:
6 W# x# B2 C2 F% o
& P5 I6 S, P; i* v1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
. ?% n) U, \/ H0 c& f: N" ^- A( D5 r6 b/ Z
----------------------------------------------------------------------------
' y5 ^) u# `2 U" V) }! F9 O1 D" v+ y& f. G% q1 X
04inc.php
0 f  d! A+ Q* y4 S: h<php% V9 Y  _2 d& b7 e: v1 l, z- ?. t
namespoc_e Core;
1 G$ |4 u; M, G$ [& [% {& kuse Admin\Controller as con;6 \% n4 A$ ^' I' V

! _" N- ^5 z, V; W  C( ginclude '05ou.php';- f6 ]8 P; Q& _- \

' W, Y' S: f7 F: x$ r5 H# snew con\AdminController();2 y: j% @* t4 a4 u
----------------------------------------------------------------------------# U" X, S2 s* Q0 v
05ou.php1 d# @' Q- l' `5 U" K
<php8 j( }& _5 w, F; j
namespoc_e Admin\Controller;; b% ^9 t8 @9 L9 p8 ~

5 m, w" p. X8 W% X( Pclas_s AdminController{3 `! G/ t5 Y* H  e- l4 @. p
    public functio_n __construct(){; ]6 h: a1 i2 @  Y! [
        echo __METHOD__,'<br/>';
+ u: x+ Q* T4 X5 h    }
- A* i4 M  S: y$ z- k}
' \. s# t% |  ^: Q----------------------------------------------------------------------------5 {. G2 w7 ~; W: _' W
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
" S- @& S# K0 ~, [" L, ?2 T. c4 N+ }; E3 G& y# i% q0 k
----------------------------------------------------------------------------' @8 l6 B. y. }0 r
) y% j9 ^7 w/ L( t/ D: V; h
04inc.php# D5 U7 j& v8 f: U
<php! C/ \! ~6 s% P# v7 p' }
//引入空间成员类/ s% U! w* w# u3 h
! }2 T( F' ?9 U+ f' K
namespoc_e Core;
$ A& |$ l( t4 P0 z3 l) ^5 Juse Admin\Controller\AdminController;
" ^( J# E' Q7 k" }include '05ou.php';" B6 d1 x' P3 o4 S7 O" z' i
9 }" i( ^4 m1 i7 D) d* c$ |) `0 J
new AdminController();
7 X. w5 A2 H  L, M+ N* D: S9 `3 e7 m' J----------------------------------------------------------------------------& e2 G3 x2 J3 F+ a& `  |
05ou.php1 N: z4 I2 [( A# s2 r
<php
8 T3 w3 B: T5 O( u" i- A" _$ \namespoc_e Admin\Controller;
, }8 F3 K. Q' Q3 x5 l, w. n) @
clas_s AdminController{
8 n2 Z* K' I1 S    public functio_n __construct(){# w' G9 Q5 ?- l( ~& v
        echo __METHOD__,'<br/>';
$ U; c9 A% o* G8 l    }- L( F. T; L8 W; y7 ^
}
3 C9 |( ]+ _: }1 e; d----------------------------------------------------------------------------
7 s/ U" [( a2 P6 {1 J4 u  C5 J+ |6 W5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
. o# l; z3 M; y( R1 J' G& w: y
! r) _( J' i. j/ @6 S7 l) y
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。  P5 m3 f9 ]% T8 @1 j, \
0 Y1 l3 V2 j! b( W( r$ m3 b  d7 x
# D: }* n7 m" k5 e8 D
( h  e9 n8 _* y/ p

) Q( N: `1 |, _1 w
3 d- U! S2 _- d9 f
9 r: U3 @6 Y" S2 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 00:17 , Processed in 0.066238 second(s), 23 queries .

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