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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:0 _9 }. B" B( l8 M

5 o% c+ F5 s% c: ?- M& o' m9 z在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
) H; Y5 P1 }* |, @2 B
! g" j# }: S2 U: X% O
# X6 o5 c3 {( E
3 y5 A! N/ p/ U- j8 S我们来详细的讲解一下PHP中的命名空间:
5 j% H' W3 V5 P) v0 J6 A
/ L1 j  x" Y+ A* D7 f语法:namespac_e 空间名\空间名;
2 ?! p8 h7 l( V  N* ^+ c% j6 |8 J" x5 V7 L
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:; _; G) C/ N5 I, C8 e+ U! h1 \
4 n4 [- j; |7 U
----------------------------------------------------------------------------
9 ?' \5 T1 i# z0 e+ Q( B
; d. g+ o* O' w7 R<php3 T; L5 }7 U% d: O7 v% a. Y

6 V" \  |- Z' M* p' j8 O, Jnamespoc_e AA;
9 p# X0 Z9 b7 f& g  v3 F$ V6 ^# Afunctio_n showInfo(){7 N, Y  Y" s+ R5 L5 w/ _
    echo __METHOD__,'<br/>';
- V- d3 U6 Z* i) P0 @}& s$ I) l. U! U2 N7 C
showinfo();
, u- v0 `' Q. f' d8 O
$ b1 K( ~" \5 J$ Lnamespoc_e AA\BB;
. T' @  ?7 p) J" j" ], ^( P! p9 n" {7 W8 c$ b4 Y7 V
functio_n showInfo(){) p* O* q, `5 s6 A
    echo __METHOD__,'<br/>';! f  l: N# Y( H
}& f( `0 m1 t; V+ t+ t1 S/ n4 V) n
//showInfo();
: X* i+ k" y  O2 K2 g& b: F. `! {3 b----------------------------------------------------------------------------
) v( D. h! x% w% F7 O2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
2 D1 P' ?& n$ X& S
) A3 K& S% F, ]  G* V+ R0 ^3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。5 N* ^2 A  o0 d) w; s7 {/ ], l5 U

% U2 t7 c, r  a' G5 [; Z* ?# t----------------------------------------------------------------------------/ R' ]7 U, H( f
0 Z6 S( M5 t* X+ y$ l5 g: Y4 P& E
<php
1 G3 T5 c. @- G/ S  Vnamespoc_e AA\BB;
+ P; ~3 w5 J# q+ ^* r+ Xfunctio_n showInfo(){( L& H' [: @' k/ R# v
    echo __METHOD__,'<br/>';
/ q+ e% X/ |! k- m2 R}
0 E2 n" _7 x# E, q9 Rnamespoc_e CC;
, i* g6 q2 j2 {/ N" sfunctio_n showInfo(){; k% T$ H: X  @+ b
    echo __METHOD__,'<br/>';4 n0 H: x& i' c3 t9 {1 @
}
" ^4 K7 S/ Y$ g& a+ i0 w, Anamespoc_e AA;6 `5 c# ]; i( Z' \5 A
functio_n showInfo(){# _7 y) ?* L% u0 S. i) l
    echo __METHOD__,'<br/>';; }7 H$ X$ s) A' K
}
* x- t, D( |* c' p: I# M8 a//非限定访问:用于访问当前空间中的成员/ _7 Y5 `) t0 E3 J8 r7 I! @1 l0 g
showInfo();
1 O& q9 J$ B) S7 L, g" I//限定访问:只能访问当前所在的空间的子空间中的成员# F! N, f$ ~4 U7 \$ `7 _/ f1 t" t
BB\showInfo();
4 C( ]( ?& W8 j# I& V//完全限定:可以访问其它所有的空间的成员
: n0 C) p( P0 @% m4 a1 X6 `% E) u\CC\showInfo();& U, ~( w5 z1 B$ t
↑根空间标识符: C& C8 t4 C7 M
----------------------------------------------------------------------------
0 A% g# i2 I. [7 m' O+ C但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:) ?5 k% Z+ x3 a$ }. ~* K2 ~

6 X) r$ e, A- ]8 H6 E, X# f当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
/ o; u3 @! b- A7 B& w7 J/ n6 N2 b6 O/ T1 N/ a7 b8 h
代码示例如下:
0 u; |' ]/ P4 k5 D0 z* _
9 @9 n6 n4 i3 T- T3 Y9 r8 @7 H: z----------------------------------------------------------------------------
3 z! H  E# n, ]; b) U, o
" U7 k' h& e# v7 v; P) b2 F. @3 I/ w2 o' }+ M% _" z; n) E7 _
04inc.php
0 Q* P  q* q& S. O2 l<php5 g/ ~' u7 m! R7 k. d( P( E

. h+ |; g; g# ~- t! B! O4 n! inamespoc_e Core;5 u3 |# l  z7 q5 ]# P% x9 ^1 s
include '05ou.php';
5 @4 Y" U' J* jnew \AdminController();
' K" Y, C# i  T5 r2 ]6 m; R  oshowInfo();
& W5 u6 [- s2 z/ v5 I
) G! j/ k' N+ |9 @2 F4 k. S5 c. oecho P;- ~# r& F8 G! j
//根空间中的成员,只要类的访问必须加‘/’: g" q0 j- Z# E. m
----------------------------------------------------------------------------; V* U( q! k" M

7 U( i% }7 V) E9 M4 g( h6 R, d05ou.php" J9 a7 R# w: Y1 [7 w
<php
$ d8 U1 ?+ W: jconst P=5;# P# B6 p) U. Z: ^

" |. l: f0 J4 S% b; P* yfunctio_n showinfo(){1 N" {* [; S' ?* M7 T. J
    echo __METHOD__,'<br/>';/ U6 ]* }' m6 D1 w; f8 C: E
}7 ?) ?4 u+ t" ?( H. V
$ d. Y8 F- y, m: ]+ T# u% g
clas_s AdminController{
- f7 m5 o# `. b    public functio_n __construct(){" W7 [- e* G. l2 \
        echo __METHOD__,'<br/>';
4 b" r# s5 N) ]    }
! c1 r) B" c! v# w) f( [! k}7 E+ w: r0 x4 W* Q

2 F4 y$ q8 p& o第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
) y2 `3 I: V- V% T2 q9 l* }----------------------------------------------------------------------------
/ [1 [( F7 r5 |04inc.php: @2 T! l6 J0 ~
<php
, ~% |" n& t7 Q# o, v( N
+ A* b1 [1 A6 t, c  Q) Xnamespoc_e Core;- m  U6 {5 ?+ W( |% }
include '05ou.php';1 B1 I' k% Y* H( i
functio_n showinfo(){" b# Q$ X$ L8 k( n! |0 b; S
    echo __METHOD__,'<br/>';
2 F  t: K& M! l2 L}: _" x+ g( l; [6 L6 ~; k7 `+ H
$ S/ r4 c. C' }, E: ^0 s
new \Controller\AdminController;8 Z. t2 @2 i& W( |
----------------------------------------------------------------------------
* U3 Q2 Z" W* K1 r- y05ou.php- T% p6 s+ E  t
<php9 f7 d/ u, }1 f* W$ X5 j
namespoc_e Controller;. c! P& G, t. `; h9 Q
$ S5 W* a# c) o
clas_s AdminController{
2 j* i  i$ b# X        public functio_n __construct(){
* w7 j; i! _! I8 `9 j                echo __METHOD__,'<br/>';) l! K  L/ E+ _; A2 n% M$ [2 r' Q
    }
5 g6 i+ ]) r% V0 A0 C}$ v6 h5 a% V  J: W+ c3 m
----------------------------------------------------------------------------
4 X# Q$ P/ p& L* a2 r0 ^+ C! z: O" e% _9 v, R
4.引入空间成员:! v: a9 P+ o7 J  h  U# U7 g

; b; ]) j0 r( y. p1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
1 M7 e( l1 X) @6 f" @' \
4 R, h0 P0 t% z' Q7 N9 ^0 L----------------------------------------------------------------------------
1 y3 S/ q* G" x1 V/ t7 P# U% Q, U
# D& B/ t, \' A4 y04inc.php
4 N+ F  o, H0 ]+ b! k# ^<php" h$ j! u: f; p4 C' {, C3 ?
namespoc_e Core;) B  E/ s& m1 f% s
use Admin\Controller as con;6 W( i1 Z8 k3 I9 ?5 G0 V

7 }. e, a. C0 ^( z5 ^include '05ou.php';
5 I" A4 h. m, \8 D0 |5 d% g5 A# ?- h8 Q: S- i
new con\AdminController();" E8 r' p" E" z4 x, P6 q
----------------------------------------------------------------------------6 j5 _2 V4 x3 A: u$ \
05ou.php7 y& Q2 N; \( y
<php9 M; a& Z8 R9 A3 q' a% n
namespoc_e Admin\Controller;2 o0 C& f; _! E4 m" y
- n& }7 Q5 M7 p6 S- o4 w9 F
clas_s AdminController{+ d- C/ {% e/ {' x
    public functio_n __construct(){9 S2 E. f2 Y0 h) O
        echo __METHOD__,'<br/>';6 N0 W' i3 q' u# a1 s' v# Z
    }- e1 o0 T7 J2 M8 H' F/ l/ P  Y* }- c
}3 F' q0 e6 R8 _" k, ]. \! I- u' @
----------------------------------------------------------------------------1 _0 v4 A: [5 T+ C4 P9 t; H$ s
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。& j( @& J% d' _% E0 c' Z
8 v5 a8 z( N$ o% a
----------------------------------------------------------------------------
) }& F; H& E5 y6 Z9 O6 ?4 f% G3 y( c7 \; W7 Q
04inc.php& n3 r6 o# z$ D2 F0 v
<php
+ R& n& l$ i' o/ t$ Z# F//引入空间成员类( l# S" `- y( `( q4 j) d0 t- ~# O
* _. c- R; ?- @4 G( k7 H5 [  ?
namespoc_e Core;  J1 @9 n$ j8 a# A5 d
use Admin\Controller\AdminController;+ j. l( C! y: ^& f: b2 F3 P
include '05ou.php';3 B" n! q% R) i: {. B! X6 z
6 @' l; l& v+ `4 l2 J) n
new AdminController();- v6 F5 {6 t  d4 ?' ]: o# G
----------------------------------------------------------------------------  g' ?" x7 S8 B8 L# w
05ou.php2 C8 A& k. b. |+ B  g; k! D, y
<php( @8 L, J& G: s- F5 O
namespoc_e Admin\Controller;
( ]7 I! q, f/ [7 N
7 \. w7 u8 Y3 C& n( g% Hclas_s AdminController{
8 I( E* w' n) c- W* g    public functio_n __construct(){! N5 B* B( j8 P
        echo __METHOD__,'<br/>';
  X# h: Q* _6 f7 Y) o: Z    }
5 i* k" r- T( m4 m4 B}
8 Z& f9 i* H  P7 l5 R----------------------------------------------------------------------------
! O% E# x7 ~4 X3 U9 I9 `5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: u, W- d5 o) d: b! H
* C3 {' `. K* k/ ?! g* b2 G' H/ h  u+ E# Z8 ?4 \; r
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
3 k. A4 d1 m! u& B* X3 ^5 M$ n% L% [/ k- ~; K! V

+ V6 J! X: b# g  Q& [, N9 j$ \' n' E+ k$ Y0 m* m6 X* l7 ~- S' S

! R% I) A" E" c3 Z0 @1 `4 j0 }3 L5 h- W. f$ z5 U

$ O$ b5 @4 P0 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-29 05:02 , Processed in 0.115689 second(s), 23 queries .

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