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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:2 M" N, o- O$ O$ l9 Q3 a/ N

8 A$ N; X4 W5 T: K9 S* Z在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:! d6 `9 d" ]/ h
" H- }$ E, d8 z) K
% b/ |- n' Y) W
$ \! w9 q8 u8 Q: l
我们来详细的讲解一下PHP中的命名空间:4 @! {6 p$ t* c" v6 b3 X' g
2 }1 y$ L+ X; g6 f% a# Q
语法:namespac_e 空间名\空间名;
* r: r: ?9 R1 O  B. [5 K5 {! N# ]6 R
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
# K, T+ Q0 g% w( _8 `7 X, ?$ c. }$ o8 W' X& X1 e! t
----------------------------------------------------------------------------
" f9 D- ^  X  S! T) D; {
5 \# W7 k& x! ~7 k<php
5 H+ ~* m0 c. w- M4 @
  g- H; P' k0 w/ w5 Inamespoc_e AA;
4 c: ]" B+ m8 C: z* Ufunctio_n showInfo(){
' a% ?4 N% u' |3 d  f% H2 x6 E' {    echo __METHOD__,'<br/>';
& `8 M% b9 ^6 Z5 o. Q3 ?2 l2 y, ?}% I% B4 f' v6 X- `
showinfo();
4 M) w% l* U4 u+ g4 i: p8 C5 q8 a" c* P3 A( Z& k8 R0 Q
namespoc_e AA\BB;
! J3 A8 D' V8 [' y' B4 \; i
& j, |  [0 ^: Q) m& t( afunctio_n showInfo(){
, K( ^1 d! ^4 Z8 l, v3 L$ o    echo __METHOD__,'<br/>';4 E6 |2 u+ `3 f. O- E+ E9 F# Q
}& }# v: d  G, m9 o5 M& G/ ]1 T
//showInfo();
6 G4 z3 ]) c& o9 }----------------------------------------------------------------------------1 b- Q9 l" j6 C$ m' {# d) g) Y& A
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)& V- I% l% n( O2 L- `

4 t) T/ p5 T, v3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
0 m7 r3 ?. K% S. k/ H5 h+ g0 L9 n: `; V; }1 V3 q2 E# `
----------------------------------------------------------------------------  D% [# u) e" |# H) U

: i7 |4 F8 W! N9 u<php
$ ]$ ~6 Q+ z1 Onamespoc_e AA\BB;4 s0 o- K% ?" N+ z! u) H- X
functio_n showInfo(){3 m0 Q+ I0 @* k4 U& L0 N1 x* K
    echo __METHOD__,'<br/>';) r% I! T1 L7 s9 E% u
}" Q& G/ S: a/ ^$ ]" ^
namespoc_e CC;
* d7 g4 W' p0 n/ s/ z* [- d; sfunctio_n showInfo(){. |0 M' p- h, [9 C6 K4 e) y: _
    echo __METHOD__,'<br/>';
4 g) ~7 f# \0 i* N}
. r' T1 I! q9 M' ]1 y5 fnamespoc_e AA;
. K& p! Q+ s" L5 Vfunctio_n showInfo(){
. p# N9 J% Y( M3 F( R3 ~    echo __METHOD__,'<br/>';* o. T. M/ O: _# w* H8 j: W
}6 ~' h' x. {7 Q+ w) z4 Q
//非限定访问:用于访问当前空间中的成员
, l& ~5 B4 V$ RshowInfo();( X6 i, H! @! [3 Y9 X  @+ q
//限定访问:只能访问当前所在的空间的子空间中的成员2 O1 x0 K5 ?# I* W
BB\showInfo();. ]/ r$ k6 b( }+ ^! C- \% O
//完全限定:可以访问其它所有的空间的成员
3 E4 i0 ~% C; Y" d\CC\showInfo();/ h4 a/ x; W1 f* J! n' P( n
↑根空间标识符$ T$ G3 e9 |0 U* ^3 h& h/ w& n
----------------------------------------------------------------------------
1 Y. C/ B- T* o7 e但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
" i* ]: C8 ~4 \$ `5 T3 e7 E8 n3 }
# ~6 U7 e6 u" y# b  n. Y4 m当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)9 C# T! l; A9 H: m: d; j+ f

1 }1 c: H% M7 M* U5 l# y- J) g3 y代码示例如下:% Y4 j& [9 V+ j/ t, K! x
1 N! y+ Y$ d" q
----------------------------------------------------------------------------
6 [, j& p; n2 ^- Q1 |4 e+ }* N2 Q/ l/ j$ g" `
) s# f& J$ d5 g, e6 T% P6 v
04inc.php2 Q, X- {; c7 A8 `1 h# x
<php
1 L# x* ?3 v2 B: ^! a( y/ }) c. {2 a
namespoc_e Core;  \- _& o9 w4 L3 q% E5 f7 p
include '05ou.php';% I6 G% @2 y% N2 c& n
new \AdminController();
8 s( Q0 M+ e: e* M5 ~6 bshowInfo();4 F5 w$ ^( y3 T: h

3 c; v* q4 x. g. r0 t0 ?7 Vecho P;
6 h& a7 b: d! R7 y5 C) }! C//根空间中的成员,只要类的访问必须加‘/’
, E/ w- a# l% }5 D, w6 I- P----------------------------------------------------------------------------/ w! M$ Y( R. Q$ k# x, V

- d9 i- k$ ?! B7 J- |  Y05ou.php
+ s' d# y6 h6 f! m1 U4 M<php. Y3 x' _& H% D
const P=5;" u3 {6 l. H- o6 g" e+ S8 b

" a1 ?- ~5 G( w9 u6 Lfunctio_n showinfo(){
' K  O9 W! g  y    echo __METHOD__,'<br/>';& j' ~/ J3 s8 F& i1 L
}
6 m6 _+ {2 |! f- C0 b5 W
7 {* q! ~6 s- ]" iclas_s AdminController{1 @7 D. f  h7 [% X! }* k% F
    public functio_n __construct(){1 L+ I  ?/ l+ E6 x! b  @; y
        echo __METHOD__,'<br/>';& J8 \) m4 j/ I3 ?
    }
$ y7 [) Z7 \. C* R- j- n}
# d' Y- v4 C3 _# W
  O9 @- F+ o7 K+ Z/ j$ D' [第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
. f7 D% I% M' g. l+ `8 Z, [) {----------------------------------------------------------------------------# A# p5 K1 u9 C1 o" L% H0 a
04inc.php% H& |. o* M1 m7 S
<php
1 M7 ^+ ]- J/ d0 K- x4 f, W2 T$ u3 {5 g
namespoc_e Core;
5 a. Q- i1 W- u, R. linclude '05ou.php';, Z  C& f4 v- W1 ?1 V2 l8 Z4 p
functio_n showinfo(){
/ `; d6 n( T9 F    echo __METHOD__,'<br/>';+ n1 d$ `# a9 \
}* t" u% D" O5 ^

2 D7 M: _3 B! j) s' c5 _" Hnew \Controller\AdminController;
* K6 Y/ c% N- j2 }- h- B7 e' Z----------------------------------------------------------------------------
6 F! w$ Q2 B: M3 a2 G* L05ou.php
0 a2 X6 U9 Z  j; S/ H<php
  ^8 y$ |7 h1 h' s. Z4 Enamespoc_e Controller;
2 ^3 r/ n; S0 o( K8 w# e8 ^" |' d8 H" o) Z* O
clas_s AdminController{
2 p: \+ e) N; A8 ^7 n* [        public functio_n __construct(){
9 P7 X" c9 I! n/ H" f. a0 J( q9 I                echo __METHOD__,'<br/>';7 g: \( Z' S0 r) A
    }5 {& S: F- [; v- T. W
}) x2 Y# D5 p' k- Y7 \
----------------------------------------------------------------------------5 E. z8 g6 @) Q& }
/ {' Z; m& x' _6 F
4.引入空间成员:" r- |) U  c* ~  r) f! \, r
% }: H4 {5 O! T1 `
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。2 E# ~4 q3 s8 k

! ~( Y, s& G" M) @1 d5 D; F" s----------------------------------------------------------------------------
( o5 i# o4 m0 |8 I' F- ^
8 M* y* w/ ?4 V5 l0 Q8 J. k' Z04inc.php% H$ Y' o7 W; j$ v' l1 o8 O# k
<php) u% A$ T8 g4 C' ~
namespoc_e Core;3 l0 W9 @, R6 b! v
use Admin\Controller as con;
, B* Y; |- E$ I/ ?. V+ T2 _8 o: D
! J9 M  x) r. w0 `$ Y& r5 x9 linclude '05ou.php';
' Z# W; K9 C! F
$ f6 Y! {9 V' hnew con\AdminController();  {( u, X( F* B4 D" W
----------------------------------------------------------------------------
9 `, G. Y9 l$ r" N05ou.php. M1 ^0 l1 R0 B2 ~+ m2 M1 g
<php
1 c+ _5 _# C( H( S0 J8 A6 ?namespoc_e Admin\Controller;. k8 U% v: Z6 s: {- y
- d8 C- Q7 z  ]+ R- K+ P
clas_s AdminController{; i% {  a0 S& r. H) Y& r
    public functio_n __construct(){
4 v6 i  B& X5 z# y7 A        echo __METHOD__,'<br/>';" Q& T' F2 A& _3 {4 ?
    }; R" c& _: V1 i
}1 Z: A, J* a* \! n. U" ~+ J
----------------------------------------------------------------------------
! K" J9 ]/ G5 D1 ?2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
2 u' `5 z. D5 U- A/ ?- t% H" c5 i6 a8 |- f: I% k  a' y
----------------------------------------------------------------------------+ f3 ?/ p* P2 I; k/ P+ Q( n
: K( j+ a6 T$ J2 v. I8 R3 P
04inc.php
( h$ T; z% u% P( U<php
. j" x$ R7 d, ?" Z//引入空间成员类
, U. w! ^" M/ V! C9 e1 [8 z0 r3 ~$ x' z  c# J, D; F$ s
namespoc_e Core;3 x4 r3 T; q& t& w/ S' q
use Admin\Controller\AdminController;
% ~9 ^) A6 P- N+ ?; e% R8 Uinclude '05ou.php';
! A3 F' i0 R( c8 l/ |: h% U. w: k; _# r+ K0 r7 y1 t5 r
new AdminController();( }0 V6 b8 E9 |% T
----------------------------------------------------------------------------
7 `, M" G0 L' R; V$ U05ou.php
' o4 }' T* \0 e2 V. K5 u, y; U* N0 Y<php
0 X+ A2 x# j3 W* Xnamespoc_e Admin\Controller;6 J# D3 x, N0 M: h
/ L3 F/ I( D, g+ H  x% \" Q3 e
clas_s AdminController{
  R9 x2 l( y! W8 U7 P    public functio_n __construct(){
' ~! ?9 T0 r7 \, @# V        echo __METHOD__,'<br/>';2 I$ @' p  s/ E# ~$ B9 O
    }
/ b+ V" {: Q1 k* E3 p}5 j1 A  z) r* d5 I5 ]6 C4 t; N
----------------------------------------------------------------------------
$ E. }* l6 u6 a7 i  b5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。) Q6 Q0 G5 i4 E6 P9 e' D6 l8 G) a

- t* q: q7 b/ {; ^* k, W. O* Z3 @- W0 h/ B
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
2 ?& i) I! H( O; o4 T1 T# R8 J% Y5 Y7 h3 X" b( y/ ^
  ~& n3 E) `" b& {' j0 }
; S; W. x3 C$ {. K. A

- {3 l3 m1 Y' ?( {& M5 [" \
0 U3 i3 n+ D, q" T4 Y, @4 |( l( v( j3 d6 h2 h/ L% ^) t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 11:29 , Processed in 0.060282 second(s), 22 queries .

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