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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:* M+ i. S% ]; Y. U# F$ Y; ?

' l# U( t: j3 Z在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
) q7 \( h- D+ E8 o. v/ F/ ]% f: j" b9 Q7 G
; O3 O6 G- n+ O6 @
9 H; l, E: w, `* e- X2 P
我们来详细的讲解一下PHP中的命名空间:
9 d5 o- m5 k7 ~
( W3 A# J: ]/ T( }语法:namespac_e 空间名\空间名;
9 W4 ]+ H2 @/ ~; h* y9 d# j* z$ ~% b
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:# W' A' h1 B' H7 }! v
1 o* @! N$ Q& R* Z
----------------------------------------------------------------------------
- V8 Z- Y- @5 s. ^" _4 n' T& m- y2 F$ v6 o! E6 A
<php
# R1 o7 w- Q0 ?( p; i5 e$ A$ U; r1 Z* v. T  b% w' C
namespoc_e AA;
, }5 s6 z  W2 X' ]functio_n showInfo(){
- m3 t/ R! ^. x& G, `2 ?% w, [    echo __METHOD__,'<br/>';
6 p0 P, h, b5 U}
0 `/ N* F5 u; V1 Wshowinfo();
: m; p# p* L6 t) ~2 l5 r, ~% ]/ P! s8 J
namespoc_e AA\BB;
* d- c5 _* m7 m( `- g& x6 S: X. B7 V* W
5 m7 p5 I6 ^$ `functio_n showInfo(){# Y* v" S" g7 ^" X, D5 w
    echo __METHOD__,'<br/>';
  I& G& Y- ^& [6 ?+ w}
; b# U. p; {) @) Q1 {2 G* K//showInfo();
3 ]! W1 s% N$ r3 Z" Q. r----------------------------------------------------------------------------
+ Q0 Q* e3 f! ^0 K6 a2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
* q( v; r/ T) c( r( ]! e8 `* q9 F% U! p; [8 [! g
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。1 ^+ [' C, c- V
: c* t  C- a  P2 x' `) e
----------------------------------------------------------------------------& w) K+ |. k/ E( N$ z- T# h

$ \% x8 W7 R- L1 {<php) `6 i- @! w: Z' \. _) p
namespoc_e AA\BB;/ o6 N0 E" V$ ?) v4 ~
functio_n showInfo(){! C5 o7 k! r8 F! X  G
    echo __METHOD__,'<br/>';5 G/ a0 R. g& t- G4 q9 e2 a  a
}
& ]$ n% M; [6 o. e4 y: s, L. n. Pnamespoc_e CC;4 i8 @7 z9 L8 n3 _6 C4 E
functio_n showInfo(){* S8 a/ t1 R9 V0 U& S5 I7 N$ H
    echo __METHOD__,'<br/>';- o1 a' C& g0 Q# ^2 C5 V
}
% L. Z6 ~/ ~3 ~' c3 T4 Bnamespoc_e AA;
7 u  X  w0 H7 H! f* Yfunctio_n showInfo(){9 H$ V3 L' I2 `( f/ u
    echo __METHOD__,'<br/>';
. b7 H. G* H' V9 [/ {}& b# g# a$ g2 u  y" o9 X3 X
//非限定访问:用于访问当前空间中的成员
7 z5 Y* g' g$ O3 O3 k8 FshowInfo();
; I: }( |3 z# @9 o  x//限定访问:只能访问当前所在的空间的子空间中的成员
6 H7 V) V* K0 U$ }- {, wBB\showInfo();
8 q5 W! G7 y7 a% U8 o//完全限定:可以访问其它所有的空间的成员1 h& m$ ?8 a) F+ c1 }
\CC\showInfo();) U+ b& D& m! z4 s; D% A
↑根空间标识符
% f* S+ x( X% H2 n8 ^8 y/ x" j/ @; S----------------------------------------------------------------------------
; B7 R6 h1 ~: R) L& d- u但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
9 B! ~# f4 ?# C/ W) o7 z" o' b3 O/ U5 k
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)3 T3 u/ k7 N8 y+ [! }( D, B* A
+ G; I3 i9 e; T
代码示例如下:3 }+ e* S3 s. [0 P/ S9 q/ V' b
0 }/ c% h0 z4 @8 N7 e# V1 q/ Y
----------------------------------------------------------------------------; U3 }4 d3 D  |; P; N$ F

! M* y3 c8 e' B0 p. p7 L2 z. {9 ^
+ W. _1 \6 P* F2 @04inc.php: C/ ], v7 E! m
<php% t4 l5 c! v% B7 `$ K
) m- B' B8 ?# Z- O$ z+ Q
namespoc_e Core;
0 P' ~& w2 K3 z" S) ]include '05ou.php';: p3 }; f3 A( M( t2 G8 D
new \AdminController();
0 ~% C4 T. K- W/ M, M" e3 WshowInfo();
2 d6 D4 j- ^" Y, n0 c9 _6 I7 k' U- I
echo P;
9 F* f/ X: Z; |9 l) M  m8 n: V//根空间中的成员,只要类的访问必须加‘/’
! L, ^5 ~9 A4 m& Z) P----------------------------------------------------------------------------1 L$ W/ U- n# ^) E( _3 U7 y

, `' p0 q* e* |* T5 n$ Z3 _05ou.php
% c! D/ G- k1 s! }<php
  u7 y7 p, a2 I, }0 b! r6 O& @const P=5;
/ {# s* w! F; I! N# c; D& \* s7 L" h  }% C2 Z* l1 P
functio_n showinfo(){/ h$ j  L& R/ \; i- @4 `
    echo __METHOD__,'<br/>';
1 ^1 T# `' }: h( {. n}3 K' B- f* Q4 l1 g2 X* w+ n  |; t
1 ]4 b. T+ u& P* P7 ~0 T- ]9 y9 c
clas_s AdminController{
6 T5 \* W5 k; n    public functio_n __construct(){
! R: Q. y- h% V! ^" X$ u5 X" {        echo __METHOD__,'<br/>';) z% ^: u: u0 f, u' G
    }" e$ Z. R2 y, h. J
}8 g. s7 ?: r3 p3 M  b# c
- T& |, \) G  n# J
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
4 Z8 \/ k5 |5 u5 i: b----------------------------------------------------------------------------( w- V6 U" L+ T% M5 `( U9 V  F
04inc.php1 C1 P) n  N: x' z3 ?9 y8 x& U  B
<php
5 L5 @8 O6 ~& u8 f0 O1 w# N: ^% x
' ^' ]3 i6 u) M9 ~* X, j; snamespoc_e Core;8 _, @1 K& M9 D: B9 P' D
include '05ou.php';
1 \7 a% b% k) g% {$ L" C- @7 C* I0 }functio_n showinfo(){* p# ^0 w0 E/ ?, `9 j
    echo __METHOD__,'<br/>';
8 c1 X9 K; l" O6 Y' p( [}. S  N2 s) E7 w) Y8 w- N

$ \- |* J3 o# D5 E  vnew \Controller\AdminController;, q; |) i. {5 N+ E$ K
----------------------------------------------------------------------------
+ Z! p3 }7 A) @( @5 @+ T$ ^1 m05ou.php
) t% [4 D$ _+ Q, G. ^- M<php
9 E- d- g: m& G+ ~/ V8 a  knamespoc_e Controller;
/ i, k2 S7 ]* E  g
+ m( H4 s8 d( e* \clas_s AdminController{
% F" M* n! W$ [, t; x2 E        public functio_n __construct(){
7 _! o$ l6 U- t& ?                echo __METHOD__,'<br/>';
$ ~+ A* t6 Y. y5 s( t3 U    }
4 i. \& |1 W9 V# c; N# _4 i}6 Y3 T8 f1 w& s" U+ a# S4 e$ a
----------------------------------------------------------------------------' n) x% }0 _: a' b

% R% ^& u7 _* t1 l. U( Y! c( u4.引入空间成员:8 g, I0 s4 t8 x$ i$ O& i

9 }& P: F% p- ^- T1 G1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。5 C' D1 ^8 c3 L
' ]9 E: Z. K0 m/ M& b) x
----------------------------------------------------------------------------
( u1 w- k/ }/ t% J3 u
$ ?- {7 j8 A, n4 Z. ?04inc.php3 m% ], |- i2 E) q1 ^, J
<php
' J9 {) E: S' o1 U  F. n( C. vnamespoc_e Core;
1 q% U7 M7 V2 t, ?- V1 R0 tuse Admin\Controller as con;
- ^0 N% c" u5 ]/ m3 n1 a) ~& H8 v+ h6 _; j- I1 C( _, ^
include '05ou.php';
3 U& b& \6 f$ H1 T# P" M8 {, [4 U5 \% {: C
new con\AdminController();7 l( t0 ~- [) d0 V! X3 d6 _
----------------------------------------------------------------------------
! K# @4 `; F& C' t7 z5 G0 s# f7 G  |05ou.php" u" [) J, D: j) K' l5 J0 a: M+ D- X
<php
1 R$ p, ~8 a; z/ [  n' }namespoc_e Admin\Controller;* a+ u6 _; J2 z4 `6 V
* G9 [: }  T& D( T" n+ [3 s
clas_s AdminController{5 T4 r& c: H: m
    public functio_n __construct(){1 \& p# O% m0 \
        echo __METHOD__,'<br/>';. R2 P1 K1 \  e, h- k2 |+ i2 h
    }3 E' Q/ r; {5 F. Y- R) V. ~
}
! I9 L! f/ g7 q; i----------------------------------------------------------------------------/ s( I9 a7 p+ @7 O* V4 ]5 F1 r
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
! M) U$ L' W, u7 I
3 q: p/ V) X6 G6 A& O8 L----------------------------------------------------------------------------
- N7 V! E: ?8 l5 L0 y+ |8 z8 t1 A7 |& S( v
04inc.php' g- {# W  R3 }
<php4 t& B: G6 r8 N- Y3 c
//引入空间成员类2 A" p% f( J" j0 P4 p

! b2 ]( _( `! anamespoc_e Core;9 t" s' w7 I! ~9 D- D8 j
use Admin\Controller\AdminController;; a0 S, M2 S; f+ s# d/ {
include '05ou.php';4 Q. P* |$ |: p- N5 G5 j" ?+ f

4 J; c6 @9 C2 K$ Z0 f, b- bnew AdminController();4 D- c- q) g! u5 h$ {( K
----------------------------------------------------------------------------
; ^: l/ Z/ w+ y05ou.php) O) Q- d* I9 r# I
<php; t: I  [% A& N2 n% A& [3 r
namespoc_e Admin\Controller;
; k1 a# `8 F* I2 Q
+ V/ P7 }, e% Mclas_s AdminController{
8 b1 s, Z0 d8 j3 s1 ^% ]: x+ f    public functio_n __construct(){9 L7 g" w- N6 y
        echo __METHOD__,'<br/>';" y# J( H& o- P  Y7 d$ m
    }& R* }; O4 T1 z
}
/ o$ d$ ]* D9 U----------------------------------------------------------------------------8 I0 v  n  L5 U
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。1 w; R- N0 T* u1 S" p5 C1 W2 Y

5 u. C& T8 D0 `9 B5 R# S  p: Z
2 P$ g4 P$ ^9 W& @. y" H- G这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
/ U6 ]. B; |3 ?! H* N0 V3 }$ Q4 S# K9 z, H' [* A

, b  ?$ {- y6 M
1 x, E* I" L  Q% [" `3 m
) ]8 m7 [' S* J( C' Q6 I! Q8 L
  n  x" j( E# _0 h0 M
7 P. \8 V+ ]: n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-7 15:55 , Processed in 0.113920 second(s), 22 queries .

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