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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:3 r; e& J1 w1 G
9 U  Z  o/ P$ U4 |5 p/ m& }" L3 g* o3 u
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
# {- z0 N; x" a* n5 b4 x& O/ K: l2 f
3 Y' g% X* J: i% U2 n

# p+ _- p0 s8 {" g5 Q8 M, d9 s我们来详细的讲解一下PHP中的命名空间:
* {% F. Q" J+ \9 r1 `2 O
1 Z. ^) N; K5 D4 T& H8 `语法:namespac_e 空间名\空间名;  h0 V/ }- g4 M: t

9 p  B0 Q+ _; H) A说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:: h2 X( ]/ w0 g2 u
6 J" G. y: _/ D
----------------------------------------------------------------------------7 n, ^5 H. M& I. s1 t, \

2 T% M8 k  E# w: C$ C9 ^) q<php. J9 W2 q4 a# {- W5 E4 h

, |* Z8 D$ G0 Z' ]4 Ynamespoc_e AA;6 g" B  e! ]! w# S: x: j: U
functio_n showInfo(){/ d" z, b; K. \6 z) M! j- p! v) c
    echo __METHOD__,'<br/>';. j0 p. A' c+ ?# w* s5 r
}. |0 i# P+ O6 T# A# L9 S4 G
showinfo();: d: o; N' A1 M4 j9 I  L$ M& @

0 q# i4 y9 M8 ~namespoc_e AA\BB;
+ Y: \( s# o* t  R$ S5 f6 o3 W; a; E1 V4 Q1 K
functio_n showInfo(){
2 J4 Z' n5 x' ]  @) e  g    echo __METHOD__,'<br/>';
% R0 {# u, {8 N5 p& y8 n}5 Z- l0 \7 t$ i
//showInfo();, ?% O/ P: U4 p0 I' M9 B
----------------------------------------------------------------------------# t7 |( T6 o: d) D
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( W2 [' y, P. p& J+ ^4 g: D1 V
( c) s3 Y) ^$ d! c( X, n7 y0 s5 w5 a3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。% @3 p4 H( x) {: x# n

! e' [2 i0 N, e! }$ ?----------------------------------------------------------------------------6 p! c# X' T# J( y# m

$ Z  A; I" i: d; ]' \! Z- ]  g<php
2 E4 x  M4 d) ]0 v+ tnamespoc_e AA\BB;* I9 |- Z3 c" O# }% t% y( p* F
functio_n showInfo(){
9 @" O( p4 h0 T& z4 o    echo __METHOD__,'<br/>';
$ _% b) C; Z6 X8 V$ t2 G}* U9 o# X7 r3 S* E# Y$ \
namespoc_e CC;
6 \8 f. ~4 U' Z! b1 efunctio_n showInfo(){# q5 [* h! R3 J6 a% k" k
    echo __METHOD__,'<br/>';
- i% G& p7 P7 C+ M" W}$ @0 G, B. p, ?" w  T$ `! a$ d; j' E
namespoc_e AA;' x. ]8 o) }5 B
functio_n showInfo(){
* G! b: T8 _. a9 G3 t    echo __METHOD__,'<br/>';4 a- }2 a5 l/ t6 M, E
}. J8 u% x' i5 i
//非限定访问:用于访问当前空间中的成员  O  s. q1 i) U
showInfo();
3 S' x& [9 G! [: S+ h% r//限定访问:只能访问当前所在的空间的子空间中的成员
$ N( c" \/ D9 {( X$ B' ]1 T/ ^) [BB\showInfo();
: R" f4 ^& C# S5 h) D! G//完全限定:可以访问其它所有的空间的成员: i1 h) t* S- Y9 W: u
\CC\showInfo();
/ w" Q. c6 Q# P9 z" N↑根空间标识符
/ H) k4 K' i! `: L" E7 i& `& _----------------------------------------------------------------------------6 ?+ [! @  T7 E! h
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
# G% C5 `9 M: r) \* u9 M; h! M& r5 Z* B, q( N
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
( j5 J- }, O3 n: I- I
! T& j- t6 J5 c0 C代码示例如下:3 c) A: E8 v8 c! h
( H/ ~7 ]! T- F9 `7 U
----------------------------------------------------------------------------+ U/ W1 {% V5 [% U* L
, g5 x2 b5 A& }

1 o; Q8 b0 o1 E/ I) _: r9 D8 N04inc.php8 O6 K/ M! U. \& L% t; ]5 I6 y  h4 [
<php
6 V4 I) Z: t3 X. f* i  g9 {+ N7 n- ^0 T4 Q* O7 w: l& ~: }
namespoc_e Core;+ b) p; L# n, d) w
include '05ou.php';% X: p6 v. }# B9 S2 l, H9 P
new \AdminController();
4 v" Y- h- `5 FshowInfo();
1 d6 b' a# g' E1 n8 B
9 C" H8 n8 n1 B% K/ H; h5 Mecho P;
: q2 n5 o& k4 W& f, ?5 H//根空间中的成员,只要类的访问必须加‘/’3 [$ s8 C) F$ J+ ~+ f6 ?; V
----------------------------------------------------------------------------
3 b% w0 h* m& {$ W. j# I6 O2 R; i
9 n* F& h5 U  E- z) r' i7 K& b4 j05ou.php
- t2 K! e& W" g3 W% T3 N$ \+ r<php6 X) ]% `* {6 X, t6 m2 J9 |
const P=5;
  q& X* ?' D3 @- j) ~+ j6 A5 \
6 }) y2 q% g; S+ _8 ]1 W# Afunctio_n showinfo(){' }$ V' E$ R, L) ?
    echo __METHOD__,'<br/>';" U' U6 c/ Q" y$ q  M* T
}" U' Y' N) M7 ^8 k

/ R' T* F; {4 t+ j* I+ Pclas_s AdminController{4 j: ~; m, K: H' ~1 A3 m
    public functio_n __construct(){* q5 Y7 n0 U! U4 g
        echo __METHOD__,'<br/>';
6 T5 o8 U$ o! i% i8 S7 z    }
5 a, U4 j: [; Q5 w* T; D% k, W4 r}6 X4 A/ |- s6 T3 @+ Q/ Z
3 u- K) s. V+ t' Z" N0 h& f
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。* C6 i. G. ?- x4 y
----------------------------------------------------------------------------
2 x* G1 ]' Y4 c0 W9 j6 `$ J04inc.php. h( N/ S. L0 U8 R, d; k- M. k' u
<php
; H# ^2 ^6 r. j& W4 K
+ U2 R; x/ T% D0 ?namespoc_e Core;. o7 x/ ?+ [' |& z
include '05ou.php';  B4 P) S  U  d/ u
functio_n showinfo(){
, V2 S% @1 [6 o6 M( x2 d# }& N    echo __METHOD__,'<br/>';
: R+ O7 m# D4 v}
5 v6 x- w* c% s9 p1 ]8 x7 U! o) A% g2 }" [+ P% i1 H
new \Controller\AdminController;
) v& F% Y* O+ i* v+ q  }5 E----------------------------------------------------------------------------. v' Q1 |# \: l
05ou.php! a: H7 y( X  m' ]; i+ `) g
<php- ~% [. H$ ^8 O' x7 h
namespoc_e Controller;
# G4 w" }. J# F. r" y$ l
5 O) x# Q: C5 Zclas_s AdminController{
+ \. l) @7 }$ n& h3 o$ y1 p        public functio_n __construct(){/ f- V( K/ y. N: s( G! D# f
                echo __METHOD__,'<br/>';1 l- l6 Z- W  ]) _& O6 c& w- V$ k
    }7 L- M) a& y4 e( K8 W! c) }7 c
}
' i$ z7 }2 @; A9 N- {----------------------------------------------------------------------------$ `8 J9 e( g8 V6 B' T( K" w

# J3 Q) R9 c7 I6 G4.引入空间成员:
# }& L4 O0 @( t3 F
/ ~# q( n5 J9 o" S+ l0 B+ @4 g+ C1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。9 {, f1 F( ~( ]  E6 [, F* |

! i1 l: P( J- q' D8 q. o  ?5 L5 j1 b----------------------------------------------------------------------------: |- N+ H+ D* U8 H

* i% L* A* r4 X) w% m04inc.php- K8 W! v! W5 q2 T, C0 m, A5 ]. h
<php" K' c, `0 ?! O' u. p  {* B
namespoc_e Core;; h) `) m  `* J* u
use Admin\Controller as con;1 \( i5 r5 L1 U

5 T! m2 C) W+ K6 d2 ]9 x* zinclude '05ou.php';
2 c) c6 _5 X. e3 y, M: E8 S  m# r) M2 u
new con\AdminController();
3 U+ t: b* Q3 I7 u! Y9 V; f7 r+ l( c& N----------------------------------------------------------------------------
+ O! m- a, d5 W" d7 z05ou.php
% \; C$ w/ w: f, K  |+ p<php& h$ f7 O$ i/ j+ ?5 R4 m& E
namespoc_e Admin\Controller;
3 |; i  q0 h. {3 ?) f: u  t" Y8 J) K" u( f% A
clas_s AdminController{( @; x. {7 g) w$ O
    public functio_n __construct(){4 ^. l  U% k. j" i. i
        echo __METHOD__,'<br/>';
8 [" m. J9 C3 F- z7 ^5 W    }" l" I7 q: @& B" S2 S+ X
}
* a+ k* G1 N* g* J7 K0 r----------------------------------------------------------------------------/ ]7 @$ S9 P9 |5 m  s
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
6 B7 K8 M) O& W% M9 ?4 H+ p  s3 Y$ Q1 ~% g8 B2 g9 F
----------------------------------------------------------------------------
/ X$ j, [7 p8 f; `1 L
7 g  h; V4 D) C3 ~0 Q/ W6 o04inc.php/ `* F; f4 q* d- t' v
<php
0 u/ j; y0 M" m* C//引入空间成员类- w# W- F1 ~9 }3 S$ K  ~3 G- `" k
( z6 Y2 a: @+ a! h6 E, U0 i
namespoc_e Core;. a; D! ?" Q' [' C
use Admin\Controller\AdminController;
. X! e$ J1 Q. y( ninclude '05ou.php';& s* `8 h: s3 w

+ u5 ~' v3 l& _7 y$ J: Vnew AdminController();- g6 s8 B* C4 y9 v3 J7 `
----------------------------------------------------------------------------' B& \1 ~; R/ b1 x* E/ `) F
05ou.php
, k  C# R; H- i+ [. U7 ^8 x: B<php3 Y( Y) }8 A; {; ]* p' P4 c, n. S
namespoc_e Admin\Controller;) D1 e1 D2 @  J- T
" h. N# g1 i8 z2 }3 L0 y& J
clas_s AdminController{
3 |( `2 _; w+ s. [+ f; G) v. L" O    public functio_n __construct(){
; @7 _9 O5 A" w. r: f) |" z; v% `        echo __METHOD__,'<br/>';8 F- w, D5 F  u) l3 \
    }+ h4 R, @7 F, E: e3 m5 n
}3 ~" e0 Y  e+ V5 @, u5 b6 x+ ~; z
----------------------------------------------------------------------------
- M$ ]0 b1 W: N# u( Y9 z' N4 W5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。* v' `* H4 V5 C+ `% ~' O: X8 ^
& V; g1 K) v. b% s7 b1 y
- S6 D/ b$ h/ \5 F; T$ B
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
6 O2 F2 }' j; ]3 R7 p/ P0 q6 Z9 s
. I0 ]- k+ h) n/ J$ o5 J3 }# ^' e0 @* Z
2 Y: {) `9 Y" c: U8 \! V

5 L2 x& J7 G8 C9 m# E$ Q% z; i6 p
+ C( M' U" w3 d! ?+ A1 [7 s; r* e( }) @$ B* x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 13:29 , Processed in 0.061421 second(s), 22 queries .

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