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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
* S- X7 n) L3 [- T/ }# z" X9 u; p- Z3 S$ H7 H/ R$ b0 _2 a( Y" I
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:( U% t4 c4 ?" F1 @7 Y# C
+ i/ h$ M7 x6 R: a+ a+ l$ w! f

3 J: `9 [" p. W. F4 V. m9 t! E# h) Q. I1 p6 \
我们来详细的讲解一下PHP中的命名空间:0 J; L" i) f. l5 N7 m) ~, B- Y5 I

# k/ ~2 N& F* `( H语法:namespac_e 空间名\空间名;
  n6 B0 a9 ~  s/ e- o! \7 Q; j0 D1 o& ]8 q; [. s
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
" L7 C; _  B/ ^( h7 J* r1 r
8 L/ a7 i, P; r2 \. A( Z$ A+ D4 |----------------------------------------------------------------------------
3 ?6 M2 L( h+ c0 S! s. ^4 L# G, F0 I3 L$ w! u1 X
<php6 p$ s" n. t4 c- i4 K

& ^# L+ j; x* y, O0 hnamespoc_e AA;/ p% }, C/ v# R! X. g9 X4 Q
functio_n showInfo(){8 K( ]- I4 f  H
    echo __METHOD__,'<br/>';
1 \2 u' @! N" m% r2 @9 Y}7 K9 p) Y" f4 x% s! v4 Q
showinfo();
" ], C; x, M' Y2 ?! V' j* O9 d5 Y
$ `: E! y# `% k, b5 Z; [0 Inamespoc_e AA\BB;% J+ \( @) l; J9 y8 e

$ B! p$ ^) k% ~7 P5 R" y. X# hfunctio_n showInfo(){
2 K" o* ^/ g- Z3 V* c2 w" F; ~    echo __METHOD__,'<br/>';
/ a$ A& _( g) t; m/ B4 U}
. `! N: z# x! H# ]2 L. I//showInfo();
4 o# W, D& g+ F: B4 a. ^3 }----------------------------------------------------------------------------8 J/ C2 M7 n4 w: r- m
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)  P8 Y5 S! m' j' [2 c/ v5 }  v' y* X

# d) ~5 ?8 U& `; i0 [# @7 N3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
7 i) T5 D" e7 a  e( E' l5 \
. _& n9 g+ K/ L7 l----------------------------------------------------------------------------) E$ b, X* }6 U

: ^0 `% d  @2 A; f/ y<php3 R$ E+ c( s8 Y3 a
namespoc_e AA\BB;
7 i. [$ M( H+ D9 T! S: y+ k7 m- _functio_n showInfo(){
3 W" a' P& ^8 F$ T5 R. o0 w# K    echo __METHOD__,'<br/>';
- ?9 i0 H/ f9 O; e; y: O}# d, s/ x! G- L8 p. }* }& m
namespoc_e CC;4 T7 ?- d  W. T& L, c: e
functio_n showInfo(){3 u0 ~0 M6 f: Q) r4 h& C. e0 p
    echo __METHOD__,'<br/>';
0 c- g3 z. c# f% r5 A" ]6 L}
! O* C6 M, t3 L8 Jnamespoc_e AA;
1 ^( r) [( |5 Mfunctio_n showInfo(){$ f0 u! @1 Q+ {; g0 o$ I. _
    echo __METHOD__,'<br/>';7 m0 A* t! v( z4 M2 J8 O
}
- K+ f" L8 X/ y//非限定访问:用于访问当前空间中的成员
3 g2 W( |# l* G  {showInfo();5 n; C& R7 h- K1 \. E
//限定访问:只能访问当前所在的空间的子空间中的成员/ {2 c6 o" D! y# K# p
BB\showInfo();; b$ Z9 {7 x9 C
//完全限定:可以访问其它所有的空间的成员/ b$ U' ^, Q  \6 Z9 h8 {
\CC\showInfo();
$ \% |2 r4 ]6 j( C2 V: E! I↑根空间标识符
+ ~/ O0 D% Q4 U; a& T# T- W----------------------------------------------------------------------------
, Q, h; Q* l, w1 C) J但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:6 M9 I1 Z! K% e

+ v% K! i' m6 H, J当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
  K1 R/ P$ f& h3 N& a4 u! Y
5 O0 _5 g9 f8 |6 a# j! R! I代码示例如下:" T7 S' r  Q1 m4 q# V. T
+ t' |: l: [" Q, N
----------------------------------------------------------------------------0 S+ T4 w& D$ |
9 N5 \3 L% {! [# ]) |- J7 X: Q

7 |  h; h4 }# y; d* j04inc.php
, ~4 }; i0 V  K. u5 Z% s2 \+ {<php/ S3 R" \5 o- |1 {1 V7 s/ S
' O# L: y; Y2 b, ]
namespoc_e Core;
* W0 q( @4 e: jinclude '05ou.php';
& N- Q) F9 u* L* f% G( l, `new \AdminController();  ?+ O% r  ]. J
showInfo();
- m, m% @8 p6 w
: J5 Q0 F; u. @* v# T9 v) q4 W6 @echo P;
0 V# w" s; }% L/ O9 m/ E8 g# F//根空间中的成员,只要类的访问必须加‘/’
5 V  @, J. _3 V  h2 N----------------------------------------------------------------------------' l3 p& e/ z' ^6 U4 I

5 B4 Q2 S5 W$ u05ou.php
' E: r  [$ |0 H4 N! X! ^<php
$ W) ~9 M1 B9 E0 H" hconst P=5;
8 h0 S) M2 r: U7 p; \; ~8 q; I* a, F. y5 b! h
functio_n showinfo(){% ]. M) r2 p6 E# N  D
    echo __METHOD__,'<br/>';
3 d, t: z6 {! X}6 d3 j1 s7 S2 i

' o5 p: h4 ^/ l% K, ~9 V4 q9 e% Xclas_s AdminController{
& t0 h1 C" x& [  P+ S; p8 E    public functio_n __construct(){1 D- j# u7 ?& K" a( C% c* _
        echo __METHOD__,'<br/>';8 `& ~2 Z  F9 n* t1 {( E
    }* b1 H" W1 ?; u) h  \! t) g6 _3 t
}
" e! x! X) G/ M- A3 P. u& G# Y; x! R8 W' m. v- z: y+ d+ O' w
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。& D( {) F  G5 [$ d
----------------------------------------------------------------------------
6 _0 n% h- W1 I" C$ _5 A% j04inc.php( m& }0 w3 `/ O' A* o" y
<php1 ]7 {# ?. w6 K2 s

3 z: n4 q* A* D% n; s* rnamespoc_e Core;5 @2 b* p7 e; q  L0 |% ?$ r
include '05ou.php';# ~' m' J5 I( t1 {
functio_n showinfo(){9 x* k- X# n$ M9 ]% _
    echo __METHOD__,'<br/>';
* _4 i/ u' ^9 T+ R- E+ q3 M}7 b$ \  X0 {, G: r

" k+ ^/ c# S2 j  b/ h( pnew \Controller\AdminController;( V4 n. B* C$ G  W5 d
----------------------------------------------------------------------------9 _* Q' F# {, U2 K
05ou.php
9 u( D  _6 D1 ~+ a6 S% \<php
0 q' _" i$ [- c- h6 r8 K4 fnamespoc_e Controller;
* S5 a# A3 f% j* G- T' f% V! \* a
5 C( B/ G, [. e. U8 x* eclas_s AdminController{
5 C$ j9 l9 Z. ~. Q, g( ?! e: g        public functio_n __construct(){( b" q* {  O; B& M, F
                echo __METHOD__,'<br/>';+ n6 L& v) q6 C5 _! H
    }
' B* u6 c" L( z' T  F/ H! V7 m  T}
$ K$ n: g/ T7 r) L7 |" E, d----------------------------------------------------------------------------
! g9 l8 u5 J2 L+ N2 ]% k$ X/ u5 Q" J6 r. P" W# W5 r
4.引入空间成员:
6 s5 o6 R6 M) l) D$ I  m
* g1 ]0 q; T! C& R( \  U1 i1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
7 P& F* b8 ?. l4 ?4 w3 m6 c( }0 k8 J' {& d# H1 o* G- i
----------------------------------------------------------------------------
$ e$ F( ]0 ?5 y
2 F6 R0 [$ {/ Y6 L# J+ ]04inc.php
& c( d6 O5 H- \<php: b8 g+ o. Q& P9 R
namespoc_e Core;
7 b2 N# _& V: j! D3 L! d/ h% Iuse Admin\Controller as con;
/ @* j# I0 h5 E& C, B' H( D6 Z
& [( i5 C. ]0 @' g1 K( {8 winclude '05ou.php';2 s( f+ \$ v! L# ~1 Q" H+ D( Y
  i$ j  H9 W; \+ u
new con\AdminController();
; n. J* F$ Q! f7 `% Z+ Q----------------------------------------------------------------------------! c7 i0 `+ W1 H  g" D3 i6 ^+ Z6 h
05ou.php
, R5 f; _* e0 F0 V5 U3 U+ X<php
, @- d3 q- R- w* t7 \' b4 Q2 Xnamespoc_e Admin\Controller;* n4 R  ~5 v$ d1 R4 J) x

2 m' U. a8 y6 b) ~. N) }clas_s AdminController{
, |. _  M5 y, f! L4 ~  \    public functio_n __construct(){. R! n* l6 i# l
        echo __METHOD__,'<br/>';0 v2 t5 c( N; S" C! B2 K
    }
+ g$ S' k6 w5 p; g- {" O( K! x}
' E( `& Z7 j. L: y4 y# |* n----------------------------------------------------------------------------2 E8 M3 g) i$ h
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
% P2 [- ~8 s/ \3 `  _% v
( R7 K- A( M' h3 y8 u6 }. t( y----------------------------------------------------------------------------
& }% {' I! s  [* h, e( B* X$ `  }! Y2 E$ f5 G( A
04inc.php
: ], t* b6 P- y) P/ y<php- k) s! ]4 Q  {# X: C
//引入空间成员类9 W) z! x% [- O7 t
& z. H' k: d4 e' Z. O+ @9 J/ j2 R9 X
namespoc_e Core;" v) N6 Y. H; ]2 u* O% g% q- Y
use Admin\Controller\AdminController;
% y7 [7 l* ~3 k3 }3 x! c% o0 @* ]include '05ou.php';
" L1 X' C% Y& {' z! z! D3 O1 |( m
7 s6 D. S( N! Z- N  c* [1 D* \6 W' {new AdminController();
3 f6 P; \# R' ^$ }----------------------------------------------------------------------------
/ f# r7 I% e% G  v05ou.php
+ {; @0 x% k# R- L; \% l<php
5 j0 `% ^. @' x  @' rnamespoc_e Admin\Controller;; O) X! X7 k3 k

% H* p/ W1 u5 X* L, |clas_s AdminController{
9 q' ~, M; N, G/ e8 w    public functio_n __construct(){( t0 e( \& a0 T" U
        echo __METHOD__,'<br/>';- d* M- o2 l- l4 w8 e/ w
    }8 L, V$ N# ?  a3 s" b$ C( @
}
/ r% |9 K6 [7 a' {3 C4 h# f4 T8 F----------------------------------------------------------------------------8 }2 A# A, U1 n2 p
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。$ Z: \8 l# W+ ?' U/ \

8 C# g/ S, R, T, C; L  u8 |0 s* Z: v" u2 P1 S# |* r
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
6 m9 L5 R6 T0 R" k) O( S( N1 V- D* _; M; G' b
  d% G& Q/ ]* N5 o
0 S% h0 C( d, h6 _/ x: ]) ^' f
  }$ _, p) K, h5 M

4 j+ I; r' |! u, E: f' f$ }7 ?0 r0 e3 X# g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-6 08:09 , Processed in 0.125237 second(s), 22 queries .

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