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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13657|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:
$ ^0 ]7 _  q- l/ |
3 ~# s; |3 l2 w/ y: ^4 v, {  }; t) m0 M在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
% r9 B# l- [9 [3 F, C5 ^
- }1 {" G6 E' ~0 Y4 U& B 20181201105307520[3].png
% _5 r. s4 S; I2 q4 ^% F& ~# C6 S/ X! n
我们来详细的讲解一下PHP中的命名空间:
& v" C9 `2 c, A5 J! b5 z( ?1 @+ A9 E* W( l
语法:namespac_e 空间名\空间名;1 m7 x. j  p' J
- z- c* m( f! i" F% S5 Q
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:2 Y. z* t: J+ z0 V- q! |* p

: r7 a$ q0 [0 E3 g. k& a----------------------------------------------------------------------------
, Q. W. D. i2 f5 ~, Z6 I& I/ q- t8 ?1 t
<php
# y4 `  i/ ~4 Y* |1 X
* T- l$ E5 ?0 F' |& ?; d% h8 u% vnamespoc_e AA;! k* z6 j" [8 Z# R; a9 R8 s8 L9 a
functio_n showInfo(){7 ~3 E/ D: O; \: t2 X) g1 @: u
    echo __METHOD__,'<br/>';6 G) I9 R0 J3 N3 `: e" m
}
* \8 c; J5 J2 ~3 L7 Zshowinfo();
" F" G4 {- c& I$ v( y( v# m6 \' ], c2 s: T: A" M2 B- [
namespoc_e AA\BB;/ |) ~9 G* \$ @

6 ?7 a) x9 {5 Q! ~% M6 m6 [/ ]/ Dfunctio_n showInfo(){7 j5 S, o  z/ u7 l( [* w
    echo __METHOD__,'<br/>';" J9 u6 C. V; @0 w4 {
}
; Z) `$ z( C3 _: v0 V//showInfo();6 U7 h* q* t8 d) H9 r
----------------------------------------------------------------------------8 H3 u1 [9 u9 ]) T! N
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)) ~3 ]; w$ b6 Y- H$ o* Q; R

* @) e& O7 L$ U# b, B5 i4 G, @. S3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
. b) D( e. \  t6 K
0 A+ U* Y3 H! U+ Y0 v----------------------------------------------------------------------------5 M- B6 C: G) g* r+ Y( I4 }
8 g; K$ l9 r% y' m& t+ S
<php% X4 ?* u% \' ]( t7 H
namespoc_e AA\BB;
* F: I- X4 E5 J( R- d( d  Ifunctio_n showInfo(){; }! ~# a3 j. u' U+ Q7 \5 \6 \6 i$ l
    echo __METHOD__,'<br/>';
- g, ~$ ]4 y8 {! ~}) m6 ]( e) Y* @: f
namespoc_e CC;
' S# {, N- O8 d+ ^% Mfunctio_n showInfo(){
3 `7 @7 |+ ^3 b4 w2 B, f, ~; N" I    echo __METHOD__,'<br/>';5 e8 R% c( d% E3 m$ E$ \
}( ^) ?! n1 D1 ?3 m/ o5 e6 \
namespoc_e AA;2 f0 b! G4 R) _: S
functio_n showInfo(){! O' n: T. Z8 B3 }* X
    echo __METHOD__,'<br/>';
# J3 K" X( C8 \% q4 g" d}3 Z3 D+ J1 h. S4 o+ ?. R
//非限定访问:用于访问当前空间中的成员
1 \% s- j& V- E) O% a3 {showInfo();& B. b5 `7 z# Y7 h' j5 W/ V$ u, N
//限定访问:只能访问当前所在的空间的子空间中的成员/ {- `9 p" h9 Z3 r% _: {9 }8 j- ~
BB\showInfo();( ?. z% Q* Q. B# O/ W
//完全限定:可以访问其它所有的空间的成员2 ?, f7 b- h- G- M: q+ `
\CC\showInfo();2 c8 P, }- T6 M) D/ X+ g9 j
↑根空间标识符0 g2 S+ V2 H$ ~8 s
----------------------------------------------------------------------------
& H  z6 Q! ], s7 {5 W: z& R8 T但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
, ], U% ]) f& T4 i4 d/ ?/ j0 r# m" V% }1 Q! P  j& G
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)' D8 G& L' [2 M+ B7 t% P, P0 V

$ G2 `) o) b  o- y' R6 W$ Q! U, e) W代码示例如下:
, ~+ S9 b0 U/ w5 g# R/ w7 Q0 y
: T; v3 J, z" j9 {& j) N1 B6 d3 t----------------------------------------------------------------------------7 s7 N3 U" @% l7 N- j- N+ ~
; Q, y3 I4 j. N$ D, Y# A; M
( Z! G9 Y+ X3 N: K, h+ f
04inc.php. ~9 Y: y& s+ }8 F5 p+ ?
<php5 H9 c% _/ w# ?3 Y

6 Q7 k: }; r0 Jnamespoc_e Core;5 l& p* j5 ]! v. f" E
include '05ou.php';9 C1 Y3 x  M# k/ ^; m3 R, t0 ^
new \AdminController();
/ u! M1 H, q4 D6 R+ _$ T6 n* W; B# gshowInfo();
- W/ T- w- r- f' H; z3 u2 m
3 U4 _' h, a1 W$ u( j" mecho P;; s* m0 f. c& U! I. n9 H- n
//根空间中的成员,只要类的访问必须加‘/’$ z) e" x5 `  T; X0 j' ^5 o
----------------------------------------------------------------------------
5 T0 i1 C- ]# S! ?
9 i2 b! N- p- k, O05ou.php0 q% f" r! X  Q( @) s' L7 W
<php  Z  j; M" ]6 y3 w2 y; @" P: a
const P=5;% {( @' p* r' v2 g/ F: W

3 O4 \+ W3 K* a  W( b" jfunctio_n showinfo(){
6 o! F* Q$ ^, e" X5 \6 a    echo __METHOD__,'<br/>';
% _; Y2 Z8 h$ U) i! u3 @}
6 @5 G+ G* t& L& _+ M' Y& m  v7 V. A* O) w" f( Y" `# F6 m0 f- c( v
clas_s AdminController{
8 ?* R: @7 {; `2 U7 z    public functio_n __construct(){
1 e# r0 U2 \. }6 x2 G1 b- t( @; G        echo __METHOD__,'<br/>';
; q& r7 v  u' ?7 K  L$ ~: N    }" X7 \- e6 s# b- d$ _
}' f6 p. J0 _4 Y! u; a8 c
3 l' T/ N3 z2 b, X! f/ `% ~
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。/ h; P. Z" M1 L& ?" T
----------------------------------------------------------------------------
$ L0 U# u/ Z% ^7 q04inc.php
1 ?9 t( Y  w8 v( H# Q6 w5 \9 g<php0 a) d6 Y+ H% P3 \, k0 q2 ^" A
9 |4 X5 q/ k2 X6 R. \, R* C
namespoc_e Core;
% Y3 j. w" k5 p! E+ yinclude '05ou.php';
5 ]3 Z; _0 w. \: B8 g, M/ \, ?functio_n showinfo(){
- M* L, ?" M2 X. C+ N. x1 l$ l    echo __METHOD__,'<br/>';# O" w+ E% N* T
}
# [9 b& v5 w6 P% o) o" [9 \8 y4 Y6 n3 z8 c
new \Controller\AdminController;
7 Q* _" n! A: l$ ?----------------------------------------------------------------------------
+ [+ G% X" K) Q+ N+ u05ou.php7 d8 B/ c& o3 j0 O( w  X
<php, P3 S: t/ ?! i3 E5 N: P
namespoc_e Controller;
5 E/ q* X7 s6 b3 m1 l5 v: v: l. R
clas_s AdminController{
/ b3 J# p- U1 y/ P        public functio_n __construct(){
0 ], u3 V3 y: c6 a                echo __METHOD__,'<br/>';
9 I8 N5 \$ F) d  k4 C% F9 g    }
& x" k9 `, U; B* q1 L- y}
1 ?2 p$ ]5 A- \# E8 r----------------------------------------------------------------------------
( Q$ c, n, w' L7 c; e* K& {* s9 g& z$ B' k
4.引入空间成员:
( O0 M5 o0 U4 t8 v+ m9 b* f4 l1 @( d# d( w
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
6 Q: r5 j# I  c- s$ f2 w
0 s1 e$ D& f4 h. y8 Q* K4 ~, Y----------------------------------------------------------------------------: I+ ^- Q+ E% Y- u6 E% M( J% `2 u

: k" R% T; r% U6 A/ K04inc.php6 h* }# @5 y- i2 H; y- y. g5 b
<php. A% E, N  h3 b* y
namespoc_e Core;7 P3 q; X9 c& H# Z7 f
use Admin\Controller as con;* A$ B4 a, C# ~8 C3 }  U
# }8 y' v* Z! e( Q* a
include '05ou.php';& J. c. n6 l; t
) b; B) |, D+ k1 R9 D( ^  h
new con\AdminController();$ Y) [6 Z( d' x
----------------------------------------------------------------------------2 ?9 Q5 a$ g5 z9 K
05ou.php9 g6 |+ E! j/ `4 w; P0 ^" R
<php4 ^; @) ]1 T' l) E" R
namespoc_e Admin\Controller;+ q! u- R* `1 z  h3 B

2 j7 t% G5 L2 N- Vclas_s AdminController{
6 O7 o2 N* w  ^) J- q- E    public functio_n __construct(){' {! l- c" w1 [: Y
        echo __METHOD__,'<br/>';
9 ~' V( \2 K  C/ G) d) n: x    }
: i  M7 x1 \; G& \- E}
, w+ E; }1 n4 r----------------------------------------------------------------------------: |. W" C6 m& A' M# J. i
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
& M8 h$ i8 n7 V* a4 z" f, R. ~& A* C' c. e' m+ x
----------------------------------------------------------------------------
) O1 l. `% C4 u+ X2 O* i
6 [) s! h! k. |/ R6 J- V2 L9 c04inc.php
' L% ?2 N8 l1 }& q3 B2 H<php
% v$ s, _! N9 Z; J//引入空间成员类& ]" m8 O) n. X: M% L8 A7 X
3 E' @$ V- G. q$ H7 J4 F; q6 v. Z
namespoc_e Core;7 b4 X+ J% m1 d2 t
use Admin\Controller\AdminController;1 }9 W+ B5 q+ N* G" [- I; e8 N
include '05ou.php';
& T2 Q2 g( j/ a0 L# d! A$ K' L" [3 G/ a4 F: k  ?! k7 |( K
new AdminController();% i) O& L6 N& `8 |/ M+ F
----------------------------------------------------------------------------
+ Q' B  ?- O; Z% H- }' f05ou.php
% g( n  V+ F  p0 }% W/ u! H<php
! [7 o3 G: S! n, Gnamespoc_e Admin\Controller;( _, P! ^2 I; W. [

: C; J1 w, {/ {# p8 Gclas_s AdminController{2 a% G" p- J( u6 f: h, k5 q
    public functio_n __construct(){- ], K- R6 E/ j" J  F9 t& ?- D
        echo __METHOD__,'<br/>';" q: g- M! a8 x5 J9 i) L1 u7 \
    }3 j  u* S. c. m: Z4 X5 \
}7 M# X0 b6 D# Y. f0 X7 z! E$ E
----------------------------------------------------------------------------
  n" G0 M9 ~5 {0 l' D+ @" k! \  ]5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
3 t, M# Q8 @8 f( o$ E! f1 S3 q8 k
( g& s6 J+ W+ m. Y9 G! B- B
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
/ ]1 P7 Z# U$ }  i
' b$ l$ z6 S* b( h3 m5 S9 [' `; |* `4 S% g( S6 X

6 Z% o, g  h0 @) U. n0 I
; A3 x. o+ ^) q& x7 E% N5 `& O6 W# E+ f* f

( M7 J6 l5 Z$ h) r. O: U
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2025-2-11 23:29 , Processed in 0.202756 second(s), 23 queries .

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