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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
9 _7 u+ ~' J" j, d$ Q7 }
1 m& Y0 K5 g) j5 r在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
% H# z7 i' @# A# k) S" v3 z1 X. k& Y* W! @

' |. X7 X- L$ m+ y, D. E/ h5 ^& n4 a0 i, O
我们来详细的讲解一下PHP中的命名空间:  |3 _9 K2 P& _( Y  E% v1 x( o
! c" D3 j. U0 j  G* K6 `
语法:namespac_e 空间名\空间名;9 L6 |( T' ~* P

! V4 G# E( c# u+ N: C. \说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
5 ?! C) `1 i: p
; m& v  N9 s$ p  s- n! S----------------------------------------------------------------------------
3 s: u/ V& R/ ?4 ^. t
( k4 b/ X  Y/ D<php9 I1 W0 ?3 u9 k, c; x1 }
, D7 K: y0 u8 E4 D0 @! y
namespoc_e AA;  Y; O- h8 @0 A" f& N* c1 ]# C
functio_n showInfo(){5 b% T  i8 c, y  x  Y5 S
    echo __METHOD__,'<br/>';' |- m$ ^; Y# i4 v/ C( ^
}
) H) v) ^* u6 ^* X0 m- Yshowinfo();1 ]+ F' ]3 Y& J! c$ `! o
; W! U' u2 y0 I# t! M$ p
namespoc_e AA\BB;# z# `9 U- V9 e+ t
* Z. ^, z6 M/ z5 q
functio_n showInfo(){
. j. f6 R6 [( T) u    echo __METHOD__,'<br/>';$ y, Q9 V' r) z) c
}
6 y9 j# j# ?# F6 L//showInfo();
4 U5 E' Z" f, l' ~----------------------------------------------------------------------------" |  t  h% [2 d; j
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
  H* ?; _! s: ^8 P4 {9 ?& z' @* v% s% G5 w: F
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。, f$ S3 A# U% \& `0 ?  t" v

9 }0 I  x! R  _7 O4 f( J----------------------------------------------------------------------------: A3 {! f9 W% z$ F. |2 i( o  L

9 }* e2 Y1 Y  z; R% Q3 w) M<php
" f" f0 T. o, v1 y: c% Q7 E9 ~namespoc_e AA\BB;) O. ]% \5 z% B1 z
functio_n showInfo(){
, a1 c$ e$ t" C9 I    echo __METHOD__,'<br/>';
4 L, y; ?# o: N}2 x( _2 ^0 ^" L' _
namespoc_e CC;7 }3 w4 o6 L2 w: j* T
functio_n showInfo(){
; o% Y2 w+ u- V& N% r" e, x% w& J5 h    echo __METHOD__,'<br/>';
' n9 b+ H& v1 s) a' ^# M}  i0 x9 n3 T9 t* Y5 S* H
namespoc_e AA;, |0 s' f" {# j
functio_n showInfo(){
' {% G7 g1 F+ v+ a! X) @/ R    echo __METHOD__,'<br/>';
5 M6 k$ W6 e( _8 b) k}
" [. i: S" ~) C) g  _) ~//非限定访问:用于访问当前空间中的成员2 p; R, ~8 X0 v4 [7 n  S
showInfo();0 k, y( H' _" m, q& J
//限定访问:只能访问当前所在的空间的子空间中的成员1 z" A3 V: d1 e% D  T) V& o5 d
BB\showInfo();1 Y1 p: n: _& O1 T% V8 j. Y
//完全限定:可以访问其它所有的空间的成员' a4 w4 P& W& r" f1 F9 ]2 u! T
\CC\showInfo();1 P: a% M; U$ c$ l5 a
↑根空间标识符
  q. l% G7 V. T8 ^* J! }6 @# s----------------------------------------------------------------------------( p. c+ [6 o! g
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:' r1 U6 h& y0 h1 M5 F

+ q' U" x- f1 R, v当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)" q7 K3 @9 W# o
6 Y* ^& l0 ], i8 g; b4 Y
代码示例如下:- |( M& I3 Y4 i! [+ T  b; i
8 Z) W: I6 m  j) N8 E) i: N
----------------------------------------------------------------------------5 V- @3 Q& G0 N- M4 N- K3 ]6 M' g' k2 p
2 i% C2 i3 k5 d  i9 e4 o

4 R; g2 Q& K1 j9 O- P04inc.php6 L3 S" K* Y) d9 M/ g5 ~5 f6 h
<php2 |( a. \0 F5 i' w3 v9 w1 I: ?6 {

3 h" a/ O0 F9 |/ r( u* R9 b( ?namespoc_e Core;( U2 u4 Q; H. \
include '05ou.php';* D- L" c9 K: e  Y1 e- V) B1 J
new \AdminController();* F* F% m- X. b% T, _
showInfo();
. Q* V9 B7 {& |' V, |4 G' E  r9 T$ b
echo P;
7 |1 U6 {7 i- A- K) ?& j//根空间中的成员,只要类的访问必须加‘/’$ j7 A+ K- `% t1 A2 c& g
----------------------------------------------------------------------------4 [; L7 ?$ l; z- d) i% f
! Q! Q) q* c! K1 ?6 t* a
05ou.php; p1 A. s* W/ q3 M; J
<php/ G1 G2 b/ e( b6 L* l  ?7 ^) {& R
const P=5;
7 z( b  h1 k3 v) F6 a' q  J% @+ k" U1 z
functio_n showinfo(){
5 w! f4 N7 y9 r  E: v    echo __METHOD__,'<br/>';
* I& K1 U! Z% M& b& G  Q}5 w' l6 Z9 W8 e4 c
5 l0 p2 T5 [9 x3 Z- T7 E( c" P
clas_s AdminController{( E. D5 N! k; K/ r' u
    public functio_n __construct(){
0 k; K% V% }2 p7 W! G% z        echo __METHOD__,'<br/>';
( p1 p5 g# E8 d6 l7 D' m" V    }
' H; M' p0 h  @# f: N}; G' u2 \7 Y* ~

, f% i* h6 c9 [8 ]2 M  r4 u第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。2 o, x# r: ~( _& q% }2 ]
----------------------------------------------------------------------------
* M6 N! ]! C5 w$ F: i3 n04inc.php
% f. [( Y+ t" _* N+ B  c# a5 a# o( j<php
) _& T6 B) L. u7 D5 \7 `
; v+ q1 R" v2 t6 F$ {: Z2 anamespoc_e Core;/ z' X3 J) p( |& J$ `
include '05ou.php';
0 m. z* x, @  \+ J: n1 C2 |functio_n showinfo(){1 P0 T, n. y6 P+ v# ^( n
    echo __METHOD__,'<br/>';
9 l1 S8 X$ H. d' y- E  f6 g}
9 d( H; I7 b) r6 M  ^% L) F% ~4 B3 B: p( u1 W
new \Controller\AdminController;- p0 x, T* u' h
----------------------------------------------------------------------------+ p" q0 E. E8 a
05ou.php6 j5 {5 g. F' m/ H  o
<php: i% E& A$ u( Q& T; I8 x
namespoc_e Controller;0 G) \+ j( {, x( i
6 q% }! K! x# }
clas_s AdminController{+ W& x, i; M7 C
        public functio_n __construct(){
& T0 q8 i& L8 ?- U                echo __METHOD__,'<br/>';
: q2 V2 q# g% `+ e& y    }! Q' s. t  @& `  J3 @
}2 W! R/ |; A8 u
----------------------------------------------------------------------------4 V0 Z/ f+ B% m! W+ M
7 w7 v! s7 |9 m( S. Z
4.引入空间成员:
% n' G; D- c; @3 R, j7 ~% H' t/ m6 E# p3 S
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
  p4 N- N, p% t
2 I- G$ g# r: n3 }  d- b) k----------------------------------------------------------------------------
7 q4 }8 K; `2 |2 E6 A  P3 \
4 f3 K' E, q/ ?3 {( R) |04inc.php& Y' M7 L0 K" c* y8 R7 `* E% @
<php' r9 c! J, }  }' b
namespoc_e Core;
& U3 y  K& R* l% r1 N6 Muse Admin\Controller as con;
1 y. I6 b" w# s: C
* k2 ~* A. q. V- E! _9 dinclude '05ou.php';. b. z, r" e+ D
6 Z# f! N- W7 m) S5 ^5 M
new con\AdminController();7 u8 k7 x* e+ B/ V: }4 k  w6 X
----------------------------------------------------------------------------9 [- _3 f9 x4 L) U, m2 `# }
05ou.php
; ]1 V% x4 L% W2 T) C* @" x<php) a! Y4 O* Z/ [# Q5 b, z6 ]: D/ z
namespoc_e Admin\Controller;
9 B/ {2 }8 g8 D; L! N4 }, q5 y, Q  A  z+ f
clas_s AdminController{' ]& y8 j2 ]2 u0 ~3 L
    public functio_n __construct(){3 H, Q' p$ N' x* ?* V: ?& e
        echo __METHOD__,'<br/>';0 t" L4 F3 L$ G
    }' x9 c$ z3 v. s4 o& \
}
% [- y: N" Y5 q9 q: _----------------------------------------------------------------------------/ ?! |( k/ b/ P7 n. D* f# B, R1 ?/ N% F
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
) b1 I  J0 {4 I$ \0 _1 Y" ^
/ N  T$ q2 x! D  u( _% b: e----------------------------------------------------------------------------" T- [* ~: w! F, u1 {

; m; V, p; }$ y5 b# e04inc.php0 G5 _# B( o; m; f& O5 X
<php1 {* J8 q8 y5 j" ~7 g$ a
//引入空间成员类
( H; H, w+ ~8 T- `/ p7 K, n2 r$ E6 ?4 _0 K  j4 U5 p
namespoc_e Core;$ B6 i8 b5 H0 M6 N
use Admin\Controller\AdminController;
2 L3 [0 M) r0 S% z% C$ }8 f% Zinclude '05ou.php';  Y$ G- X  i# t
6 S; J- h- g$ o; {) y* U
new AdminController();; h+ Y  {/ {0 P  i
----------------------------------------------------------------------------+ `( R0 G' z/ A& o) x2 O4 c
05ou.php
* u( c* ]2 p- q. P<php
$ M4 `7 c9 b" G: qnamespoc_e Admin\Controller;
9 P1 S+ E7 n  R! j
& U; W+ A1 b( {* T7 a+ U# j: Jclas_s AdminController{
* c9 P. x; K5 L) C( E    public functio_n __construct(){9 c& M6 e" N# J7 t3 g# j9 w2 i9 k5 F% W
        echo __METHOD__,'<br/>';. R: V2 E; Y6 w6 e5 D
    }
( o: |" C2 h& s}
7 ]6 y  k7 M6 H4 H0 ?$ T) B----------------------------------------------------------------------------* D2 a' K. ]( E) j2 d
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。+ ]' z  L; c$ d5 e% a5 f
" D& H- z& ?; o: \% n

8 F: Z, a: K& o. t9 j这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" t: N1 b# y0 q
& w9 e; r; n- c0 x# i1 `/ Z
1 |4 d% e$ b' e, T+ I9 `0 M) @# r2 t: e; M
" L: H8 t. s8 j  p

# D0 j$ Z/ s( H+ |
! b+ A5 t8 E/ v4 v6 s/ e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 16:07 , Processed in 0.082380 second(s), 22 queries .

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