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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
: b0 d& k1 f$ W: ]9 m5 P
! c, J" `, Z" `7 x( Z8 \: R: x+ R, ^在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
. ]; u2 J8 }0 l+ _; K
! ]( R* f2 {2 }2 q1 u& d3 e
7 t( B* S% Y# g$ J' J! F% D( p1 J4 j+ l+ D
我们来详细的讲解一下PHP中的命名空间:
& J7 B& D( y$ F: Q3 @6 o- p6 p: J) V! U6 L. O. L1 `
语法:namespac_e 空间名\空间名;7 h' c$ L6 c' R8 k+ n
! n3 ]0 G  z: Z# _2 S4 Y
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
( ]: D) V# U1 k' @# R2 R5 y0 e& {: g/ N- t6 ]
----------------------------------------------------------------------------! B, v. m; j2 y& g9 u' F! I+ x3 w

0 o$ f* r1 X8 c) m. z5 ^<php
+ C& {# @- P$ t  ?# V# _
1 H, ]* G+ P: L$ G( N+ tnamespoc_e AA;0 S( ^, B. D0 q, R. Q
functio_n showInfo(){  ]3 O7 H, |/ h7 `' s( N
    echo __METHOD__,'<br/>';- p0 z" X. b* O9 e
}
5 k3 z1 _& n4 i, m' t5 Eshowinfo();
# ^1 M0 A  R5 D$ w0 r+ t1 Y' t! |' K3 v& O  ~3 I
namespoc_e AA\BB;  ?9 r# Z! l5 n8 x$ i& i

/ D1 {1 G& F, a( C2 ofunctio_n showInfo(){! {, f0 E! u1 I
    echo __METHOD__,'<br/>';3 t4 Q$ S- I7 {3 [0 A
}* O% ]0 `& v' x
//showInfo();
) E: Q' J; b* z" |----------------------------------------------------------------------------
3 |; T; H2 O9 I4 I  n2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' G6 \7 s2 U# {7 X) P! x/ [: G1 r' \
3 y6 W: Y3 t1 B2 D
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
9 N2 q0 }' U; q% B8 {+ U2 D1 n9 x8 O0 `- i# F9 i. x
----------------------------------------------------------------------------
" v$ b8 `, S7 W
, T  r$ M2 o, w+ q9 m<php+ R' K2 t# Q# [, M6 G
namespoc_e AA\BB;" `, ^) |+ i8 u; v. S8 D+ p
functio_n showInfo(){
! B. l# b0 ^# F. i    echo __METHOD__,'<br/>';3 l) O( {7 T& J, B+ {8 Q. A
}
  v# J+ O+ Q- ?! Nnamespoc_e CC;
8 X. ~2 g+ r7 ]7 q5 rfunctio_n showInfo(){
+ Q( i3 X5 e( I& I* u" Y" m    echo __METHOD__,'<br/>';
/ y1 W3 L+ ?9 i- g% F' @* V# y}* }! b0 H/ c2 s3 z/ p5 c3 V
namespoc_e AA;
" s* q! S0 L) J- i$ J; H4 t6 d: h$ L: qfunctio_n showInfo(){( Q& r4 A' o% }$ w
    echo __METHOD__,'<br/>';
; a9 a, G5 F! k" A$ _* @}# I- _( f4 l5 K" L. r
//非限定访问:用于访问当前空间中的成员
# ~& i# u  E$ u: T8 Q/ bshowInfo();5 t: R. A% _, r4 m
//限定访问:只能访问当前所在的空间的子空间中的成员
3 X1 Q# Z9 r# E: sBB\showInfo();: m) U( @- R3 z4 Z; d
//完全限定:可以访问其它所有的空间的成员
' o8 C  N) |/ n( ~( W; w/ A\CC\showInfo();6 [/ r! W+ e' Z" @  C7 G9 V
↑根空间标识符
6 L& {7 `( \# }6 |( K9 Q% t----------------------------------------------------------------------------  \! ~# `% K4 f6 b
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:) E& i) v: I8 z1 x! |, X7 J
* L5 p3 i/ S0 Q, B  `/ j8 Y2 B
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
- O0 m: |: G2 v( v3 \: J' s! S; g' k
代码示例如下:; w$ j# A) I( l7 s
0 }8 G5 O. \9 Q5 d  _, M
----------------------------------------------------------------------------
4 D& ]3 p2 V1 ~% f! \7 z( I0 u- v& j) O" P& a

  r& Y6 ]4 {. h7 r- O; T  T# W04inc.php$ P9 n, I5 e. ?8 \/ N  J
<php
1 b) t) l6 w- e/ u1 d
" b, |) {0 z' _9 _namespoc_e Core;
  M4 z7 z9 I3 e6 z: einclude '05ou.php';
( _3 \0 G& u1 \- h/ Vnew \AdminController();$ `( d6 L7 @0 [# C: r, E( a
showInfo();
( T- D: a; }& O% t. z+ G4 v
1 T+ p" l% z5 Z; e( Jecho P;3 a* s- B6 \# U( t5 }+ k
//根空间中的成员,只要类的访问必须加‘/’& X6 T: B3 `2 ~; k
----------------------------------------------------------------------------
: O0 |, d# y8 a- I3 X# q7 E2 ?6 J
05ou.php6 a3 W, o  X8 A% O5 N
<php0 J' M  {9 m$ c+ }; I- ?
const P=5;# \' n) K5 w; H' f& F( e# M
8 R  k& }- Y. i2 m* C: \* \! ?4 H
functio_n showinfo(){( C) S2 ^5 F- l6 Q+ t5 I: M  f
    echo __METHOD__,'<br/>';5 ]7 }' G0 x' v0 m1 Z
}
' k+ q7 {/ V# b+ _! f
6 a5 e, C' k( Q' U2 Lclas_s AdminController{
+ o, c/ N$ a) E/ |0 k    public functio_n __construct(){0 {& E: f- q$ `. V9 m, c8 s; y3 Q
        echo __METHOD__,'<br/>';( q! I2 b1 E  s' t# q
    }
* J% v6 }! J" q1 u; Y}
- Y: M0 t6 K0 ~$ Z2 {9 z
) x3 U' V. C8 s7 m, j第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
. l5 `- q8 m9 l3 _----------------------------------------------------------------------------. {+ Z8 k7 f' n2 I! s% x0 V
04inc.php
8 ]3 T$ o: }0 A9 P) j7 m& j! U<php
2 |/ D$ X: t8 C% M2 c2 @. r% N9 @. A8 e
namespoc_e Core;5 n$ b# P) w4 P+ o' ?1 [
include '05ou.php';
1 N: P( d' k" L* a: ]1 N! cfunctio_n showinfo(){9 w& s2 G! P! s  H' D
    echo __METHOD__,'<br/>';+ r) v, y( |+ C0 w+ V; _5 x
}
" J3 l/ b3 ]6 ?( D# _! z- C/ ?' `
new \Controller\AdminController;1 j$ ~. `7 Q4 y' d# y) n
----------------------------------------------------------------------------0 a8 j; z: M; x6 A! c4 n
05ou.php; _4 B& Y+ y! A6 A; |2 e, p2 r* h
<php
: s. \  K2 R0 ?, O, inamespoc_e Controller;; \: R! {+ J+ ~$ D6 C# k. d

) C& B9 g" q. ~; Lclas_s AdminController{
  j+ C3 D0 s1 o  H& \5 W        public functio_n __construct(){% L2 C$ L" [4 G$ l. A. q$ Z
                echo __METHOD__,'<br/>';
2 _2 D' |) _; W/ U    }
: ~6 P/ U7 y' k4 g  O1 |2 E0 ?}, {& v! V; }8 `- ^2 r4 _
----------------------------------------------------------------------------( a" L4 L; g! l" X9 j1 p$ X3 v

2 J# }: L$ R' _9 S6 C6 D4.引入空间成员:. k% v8 H, V' V  z
9 ^9 f5 y& ~+ ~% I
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
4 Z1 `* R1 S( O/ S$ X
% b) K0 D+ b  T: N, P1 ~+ r3 L----------------------------------------------------------------------------8 w8 G- U* a) E* n# Y6 ^. ?
8 E  L; m1 i7 }4 m$ _7 Z5 [4 E. H
04inc.php
5 y9 [1 v& P$ q/ G3 @  {' U<php9 ^# h. N4 f) H$ \; l. k
namespoc_e Core;
7 h: b+ {/ ]/ J  G+ \use Admin\Controller as con;% }1 c6 g: t; u' e
( r, [" @% b9 Q3 R! h
include '05ou.php';
3 u- z4 \5 o& A7 o  z: o8 S9 U  w
new con\AdminController();" G) w; G. V" v+ O& ~
----------------------------------------------------------------------------) x4 s# K7 D& V7 p
05ou.php
; K7 V& G2 Z- g: H4 E<php
1 `0 a- {1 n. o3 Knamespoc_e Admin\Controller;
6 f  b9 K0 c/ X& J' k7 O' w7 v" Y2 N: S, Y* `
clas_s AdminController{
+ a0 C& J. W4 Y    public functio_n __construct(){  R- J! q& x, ?' x& i% I
        echo __METHOD__,'<br/>';4 a7 ~! Y9 L8 C9 _- X$ O6 P
    }
) i! g) n; U8 n, R& J; z}, J& y# H6 p5 m) v
----------------------------------------------------------------------------! r( s1 ]2 u& y
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
2 r/ R7 ]/ _4 S
  m7 f/ b6 P& q' ^----------------------------------------------------------------------------
5 R1 {2 _! i$ W7 k( q% y* p# a# s; l$ L- ]2 S5 R
04inc.php
; _1 J) m0 @6 H4 O2 }) a" i( t3 E<php+ J5 M& F( v0 J$ l* R
//引入空间成员类/ ~+ r( \& ^/ D7 ]1 t" h
6 z0 q7 j! d( J) y$ T
namespoc_e Core;& y8 P8 b! _" H6 Y9 l) D% @* f
use Admin\Controller\AdminController;
* i% ]# B" @  X& b; kinclude '05ou.php';
. ^( E, x4 M( t8 \4 O% C" a0 y7 J, r( w6 w, G) H  b4 `) ?/ o4 U
new AdminController();
, B) k+ N$ |; u----------------------------------------------------------------------------
2 F# r3 n/ `5 ~4 U1 F: `7 c7 H$ t05ou.php
: I( B1 \0 J6 J9 }& N<php
% U+ t; F' m- [9 w1 nnamespoc_e Admin\Controller;, C$ F6 j7 L2 a4 }8 E8 |' P

- p: Y- U' E1 E# z) S3 \7 g. `( Iclas_s AdminController{
/ X/ ^- X; i( g9 n' a/ |) |    public functio_n __construct(){
' p. Z' ?  k. s. B        echo __METHOD__,'<br/>';
8 i) P6 X. m2 q    }: O+ u/ }: P1 I6 U) n* M
}% Z4 J! J, I+ I. n( Y/ a# V
----------------------------------------------------------------------------' U1 o* c' j' g
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
0 |1 [& h" W" L3 ]# C6 `0 v+ ]. W# t( y" t1 R) N
1 o" W$ o, S2 s( _! u
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。6 t8 y+ _2 l8 E# P# Y5 P$ `5 _1 a" @

$ {% s( {! r' _* r
4 Y( k$ q* Z; L9 _; [8 U% z5 ^$ u$ M( {( i# [( w  C
& w/ |9 _. u0 \

; ?" e5 Q3 c$ m" |' \
0 G0 L# S/ |1 L" p; |, S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-7-27 14:32 , Processed in 0.116185 second(s), 22 queries .

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