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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:' Q) x2 R. J1 c, X6 m% y8 t9 T
- P  X- ^6 |. O
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
- W$ J% ]  {" y- n4 x+ W4 t% h) M

7 S  e: T4 |6 I8 s+ q0 R( L* x2 F( y
我们来详细的讲解一下PHP中的命名空间:
# H& R; {: p, S* Y3 z4 n& V0 P5 P9 N6 I; d
语法:namespac_e 空间名\空间名;
) _$ w0 D2 j9 [9 S* {& p/ g* z  {1 I" {. v
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:3 i9 |! ]: Q/ y

5 `6 C1 R$ a, `( x, m----------------------------------------------------------------------------
; e! P9 c2 g( X6 \3 b6 k" d, I0 g$ f  A5 i' D8 f- _8 @
<php
+ o- p/ t& O+ v1 F5 W
* \4 K! F' O% \* J( |namespoc_e AA;0 [) Q; t. T# _6 q: \2 C. `/ ?
functio_n showInfo(){
. n$ k0 ^* h$ F/ H7 r    echo __METHOD__,'<br/>';- {; e9 Y3 f" B  y$ y
}1 Z. R" Q$ F% G7 ^
showinfo();
  B5 b( e. u, i4 Y3 b
% d5 B( q: v7 u" S1 E6 Pnamespoc_e AA\BB;
$ ?! y; y/ G) G+ ], H: O
, b! L# s% ^9 sfunctio_n showInfo(){
. J6 K) q1 s1 v' p* W    echo __METHOD__,'<br/>';. _" E6 r# t5 J5 z  h- K
}
' _$ S* v6 ~( r- t5 S( q0 K" y; F//showInfo();
% \& h4 z( G7 g# |4 B( d----------------------------------------------------------------------------
% N( J# J( \5 o2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)9 S) L6 {" I+ l
& b: U$ l5 ?: p
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
7 m2 y. H% O8 t; I" A  x& w1 {! P) e/ C# V
----------------------------------------------------------------------------
5 r& |0 o4 O8 P' i- @/ q  N1 N2 H; \3 K! e8 m5 [" }
<php& i/ N4 L4 ^. C
namespoc_e AA\BB;
$ F( z9 f' N( k5 Rfunctio_n showInfo(){
3 |8 `' Z/ f4 e( G2 n7 o    echo __METHOD__,'<br/>';: }# V8 ^; Z) k5 z9 r
}' r+ `, _5 ]; I2 ^
namespoc_e CC;# W* j' t+ c7 X0 E+ y
functio_n showInfo(){
  y/ u6 ~$ P2 n( ^* |+ N    echo __METHOD__,'<br/>';& l6 k* ^' |) M' O2 P
}6 h( ~1 P5 ?* q7 ~% s& Q
namespoc_e AA;
; k8 q2 b$ {  s9 Ofunctio_n showInfo(){# [" v( a  f$ L' n3 T5 k1 W; G
    echo __METHOD__,'<br/>';
8 U/ P0 s% R0 _}
* s6 z3 ^: i$ I8 D//非限定访问:用于访问当前空间中的成员
* C/ k! n1 ?# K& M! k- QshowInfo();
+ S+ _; c! [* H//限定访问:只能访问当前所在的空间的子空间中的成员* f  i& x4 V9 \1 I7 u/ r
BB\showInfo();. F: b" k( S4 n. X
//完全限定:可以访问其它所有的空间的成员2 g9 l; e2 d2 G& Z/ a  P; C! T/ Y6 P
\CC\showInfo();
2 p8 j- J7 p$ Z2 I0 @↑根空间标识符
: d1 P- [, E4 o& @( k- d----------------------------------------------------------------------------
& m7 Z! L! L& S但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
+ I, Z; ]1 N' ?  H+ x  S
( m; O& W  X: \% S3 Z5 t当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)! H0 o- ^  F7 r0 h2 T+ W% g# A% ^

2 N  A. L# |1 n  g* `代码示例如下:/ ?4 O0 p* F/ L+ A

' u' V+ H' Y( H1 K( m----------------------------------------------------------------------------
3 a0 f' w% v  k' D: k5 D7 }- U+ a6 t6 g7 t2 `

6 [+ Q4 o  h2 P6 o' X04inc.php
- p! B, a; r6 z: B: c2 `' v: J<php! l6 \# Z% o% p+ n8 ]3 \
# V/ M4 G- K0 e* ]
namespoc_e Core;
, K: K% _1 {- Z  e+ |include '05ou.php';
& g: d3 j( O  |new \AdminController();5 l/ r" `& m, E* [3 o
showInfo();
$ C; Q% i9 g# W+ v; @8 W" X. J$ n
, u) e2 T, V7 Y$ ~/ {; ^% j1 oecho P;
9 n2 i# i  L, C! k$ R$ F# |* u//根空间中的成员,只要类的访问必须加‘/’
! F8 \0 `* k  {1 I/ C" h----------------------------------------------------------------------------$ Z% @" U, \- O) P, Z. ^
% m, N- P" E7 t. [
05ou.php
! |/ `9 V& b! Z6 L7 f<php
$ U$ ]1 a( S3 C! Yconst P=5;5 Z& d# r: m% D  d% c$ u/ L

# ^* W) N" \; i- ^functio_n showinfo(){2 h! j2 ~; U" t2 G4 d! i
    echo __METHOD__,'<br/>';$ }6 c( U$ U& |9 x0 M- J
}
) z! L( }/ H1 a+ Q2 f: M# ]1 g1 V/ d5 v% z8 ~$ P  a
clas_s AdminController{3 w' M3 X+ {; j8 H* I7 Z
    public functio_n __construct(){
% |& m8 [# l( V  I  \" H        echo __METHOD__,'<br/>';1 o. v/ e3 o  A4 b
    }
2 D4 e# J3 i% @4 F( W, L  n}& t" E- `# W2 t  G

- k# K* d0 `+ D  D8 e1 W% n8 D第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。) K1 w' c. X3 x: [/ L/ q
----------------------------------------------------------------------------: b! `2 S+ k8 I2 v7 c4 U" l2 \5 U
04inc.php; f4 l* J7 Y/ @# ^; a8 `# D- h, c
<php
3 K& H) _% p+ u3 j( a5 d- }% C4 s0 ^  x7 _# D
namespoc_e Core;
" \3 v& o& B8 w6 E: linclude '05ou.php';
" p# H. i" R9 q$ E0 q: b  x2 H( p" ifunctio_n showinfo(){
9 M. r$ {/ _; k0 |7 H' v! Y9 f3 ]$ H    echo __METHOD__,'<br/>';9 G# c7 z0 n. H9 G( y& F
}
% N: j3 j& w% e
6 \+ j" H' ^1 Snew \Controller\AdminController;( s4 a" b& d+ G; u, B
----------------------------------------------------------------------------
0 b0 ?6 I2 e' t5 f! [05ou.php
( X( X6 e' c7 }3 V7 Y" m( t) t% W<php; s) N5 \3 d: k$ L# n
namespoc_e Controller;
9 |8 }% }1 ~& Y6 a# U! _
$ F; S* h3 k" d7 ~/ uclas_s AdminController{$ i3 H- r' j* c9 N9 y+ R1 `
        public functio_n __construct(){
) H2 T7 v3 n, @+ L, F  C* S                echo __METHOD__,'<br/>';
- M! u& u& P. w    }
! a6 O: `7 ^; {* N0 J$ _2 U}7 c. X" m' M9 Z7 h2 K
----------------------------------------------------------------------------. P# g; |% e& ?- Q1 P# s" ~) e# b
* \1 p' k% G9 ^
4.引入空间成员:, b! B# l- X5 l4 P; v
+ i1 J4 I, @; w' D* G
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。. m8 L7 ^' s, I3 V0 |/ M

& P6 _( S; J! H0 X# I5 e/ L  c----------------------------------------------------------------------------3 v. }9 k: L4 M, C, |* U& r  P
: w2 O4 b7 H' ?7 T& h' w
04inc.php5 F0 s5 r8 `& m- P& e$ G
<php1 t& d* x9 `/ Y
namespoc_e Core;
9 h) p7 x5 y* F# @+ Z9 o+ Luse Admin\Controller as con;
, E" D1 r0 \6 u2 [' S2 ]) U1 J/ M
2 g. T  n& i, w( I6 G% vinclude '05ou.php';
8 Y! k( q( N  s( x2 a0 h0 p, m7 g, R% ~* A* T; l! T, |  K, P
new con\AdminController();
9 f9 N* A- v( `3 W1 k( c9 G: p& G----------------------------------------------------------------------------  Z1 ^2 x" c1 b: H( l' v
05ou.php0 t5 X7 I7 H, @6 a
<php
* j0 Y( u' f1 Y/ Tnamespoc_e Admin\Controller;
0 c3 V1 G1 l5 J' C8 T- C3 d+ f. x* ]7 n/ A& n: r% s' f
clas_s AdminController{
4 [/ I+ W1 o) f% ^    public functio_n __construct(){
' v: i+ ]4 G* X/ u; o3 Q; G6 |; U        echo __METHOD__,'<br/>';0 S# J- X1 S" a3 A& o
    }
% f4 S8 r) Q# I8 u2 E; K2 U  p}
4 i) P. n+ I# D! U----------------------------------------------------------------------------
, ?, B0 ?/ `8 Z& r) I2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。: R+ q$ ]% K9 `3 M" e( }

* L5 t" f8 K; n# I. y! D  D----------------------------------------------------------------------------
" u% s, L1 I& f6 O" F2 P1 ]. ~- a1 `
04inc.php8 D: x: t6 Z) n" X1 V7 o
<php$ Y! m0 t2 D/ R, J- ^
//引入空间成员类4 M7 t+ V2 ~5 k! k, i% {

6 J, g( w9 Y7 f# ]" Enamespoc_e Core;: ]# M8 O* H# V' T0 i" m
use Admin\Controller\AdminController;
9 k, q* [2 i3 N9 q. einclude '05ou.php';2 @3 @$ c0 G! s+ K7 w- L
( U  Z  H* D: y; F+ k* m3 h# m
new AdminController();
! ^! Q4 l  M% @0 g----------------------------------------------------------------------------
% c) |2 Y4 j( {6 t! [2 i6 s9 l05ou.php/ h& B2 _4 P2 i$ P
<php
0 N' R5 c! j" G( }& [2 |- r3 |namespoc_e Admin\Controller;7 ^( z2 s5 X7 k' |- H. D% P6 N9 W
3 u+ _$ U% k3 [
clas_s AdminController{
( D8 q& C3 l9 `9 O, @2 \  h8 y    public functio_n __construct(){+ S4 u9 x( o6 y. I' ]3 z
        echo __METHOD__,'<br/>';7 D- i9 q' _& d  ~/ \, R7 g
    }
# e1 V- o3 L8 P0 h# b}1 d7 w, \0 O: p9 o: E. I6 x
----------------------------------------------------------------------------
1 C8 {7 k  ^' A8 \( q7 P5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
8 W3 y$ h  h. h, v- ^/ n' g' c5 N
1 s6 j2 O. f5 S* T: _' |! a5 A$ P& ?5 Q# `, r# \1 s9 R$ Y$ S
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
' F8 K) Y- C7 w( p3 |% N$ [  i) b: i$ z$ G& |$ L( m

7 z4 [) a6 c0 B. }, V/ @1 W5 y# y1 z" I* |8 N) r

; s( {- j+ i/ H# x0 Y" q; n! y
. d9 v% G) d" e' |4 N- g: q" U) G; ]9 W+ U. @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:31 , Processed in 0.059934 second(s), 22 queries .

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