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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:$ i' g7 A; A* ~9 ^; k
; {$ y* g: J9 I6 p
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
, D1 D+ y/ p8 T+ v" b1 Q- x4 R  T% ~2 k" k8 W" ^

5 b/ |) l2 ~7 g8 y
% j7 v+ M. O# H我们来详细的讲解一下PHP中的命名空间:
3 j" e- p( @! y- D
( r: ?' H* T  w, A9 v: m语法:namespac_e 空间名\空间名;" y5 H$ e* i, G. E6 T& o- Z+ y. g8 h
0 C; _( K& \( k) H0 x/ e
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:% K4 c) q; E8 C  q. l6 }9 q
5 ?1 y, E- [+ O2 _+ Y  s
----------------------------------------------------------------------------
/ [0 R2 `' M+ t7 B# y
" s1 K/ k. }# S9 r% X<php4 Y' _) Q9 @2 [- C5 s: d

6 J$ i) A$ N6 B" o. O; Ynamespoc_e AA;
& G  v! t- f# \4 ofunctio_n showInfo(){& h3 Y' d' k2 V5 o
    echo __METHOD__,'<br/>';* X5 z6 Z9 L7 U
}; E) s- b+ g1 m5 p3 Y8 l' q
showinfo();' w! ?) G* b! ?* d1 I: R: m0 A4 Y9 d$ g
5 {' y+ v3 J! q4 ?
namespoc_e AA\BB;' O) i% w2 ~% w, A( |% Y: l
, s8 {3 y& K; n1 ?: O; F: c% F, G. u/ E
functio_n showInfo(){4 q7 s4 J. b" Q8 W) ?$ X
    echo __METHOD__,'<br/>';
% _) J) n0 k+ G. Z2 b: E}. E' x  X) u& R% g
//showInfo();
  r4 J0 U5 ~2 W----------------------------------------------------------------------------
4 b9 n1 r+ x1 r8 d# \2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)5 U# B/ O) v3 o

* U8 b" `3 i6 ?8 m3 o3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
" Q+ d  |2 m. C* u1 ?2 a% X
+ C) ?6 O, o' K! @4 q----------------------------------------------------------------------------9 Y" [% N, R- b: M; P2 V' B) p
1 Q, P- r# R) e' H% P
<php
+ @# _$ i0 r, Mnamespoc_e AA\BB;" J) w. h* I0 _7 [
functio_n showInfo(){2 P* b1 _2 U8 H4 o: Z$ @
    echo __METHOD__,'<br/>';
% \  S  o" g8 u# H5 Z7 i9 {}
' E/ @  N5 ?6 V' Vnamespoc_e CC;7 q; s8 k' l; j# w
functio_n showInfo(){
7 k* \. B3 u2 c8 R! p" U' B. d    echo __METHOD__,'<br/>';
4 t' w! k' J5 _* [3 U9 i! Y+ ~}7 ^0 k. b: x# N+ v
namespoc_e AA;
7 Q. |, `" C5 G. Afunctio_n showInfo(){
: a; K! m+ @5 {; F2 C. R2 D    echo __METHOD__,'<br/>';
, w3 H( f0 k: Z6 o: v6 Q! W2 v}
2 v! D. W7 r/ E; f. N$ S6 S1 }//非限定访问:用于访问当前空间中的成员- y; O3 J4 ~5 G( [$ E2 {
showInfo();
  I9 e/ I( O; l5 q" p5 ?+ \. ^//限定访问:只能访问当前所在的空间的子空间中的成员
9 e. j+ c( d0 D7 g' t/ S% FBB\showInfo();
' [/ Y: l- O* d: [, w. L//完全限定:可以访问其它所有的空间的成员
& {6 Q+ x' k8 M& ]' w3 F\CC\showInfo();+ \- C* E7 |" c
↑根空间标识符
1 H- o  L2 o# s: b3 m1 l4 h; Y----------------------------------------------------------------------------. T4 v$ ~  w; A8 m
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:6 g+ O) W7 J9 f. {" ]* H
% y; z7 v. h' f+ x7 u/ I
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)* A* o1 \# S- Q1 A$ {: u

& B9 f5 ?* [9 t0 B. b. i代码示例如下:
% I" u' t' O& a; w  O, m. `, ]" w+ ]& [0 F; m; V
----------------------------------------------------------------------------
7 \& G) S. i/ M; k. t2 V, b: L: M* R! f4 l. e+ S2 {" @) M  N. A
6 T5 T0 @/ g8 D1 F, h- ^* g( F
04inc.php  J# a, m7 z& @8 J% f- s
<php
: ^8 x, C$ o: I
8 o3 @5 h  H. B8 `  b- anamespoc_e Core;
* Z  v. M9 S& v, m* c! Iinclude '05ou.php';# {6 [9 d7 g6 m
new \AdminController();, K# d+ P" J" C
showInfo();& D( z# X' ]/ n7 f  V
. t3 X3 b. a- r
echo P;( U. X- X: r/ E9 j$ `
//根空间中的成员,只要类的访问必须加‘/’
# Z: ^/ t" }4 R, E; u7 D& L3 v4 }, l----------------------------------------------------------------------------9 o6 v. C( W$ @1 ~+ K( V) m

; z6 v' ~; p  k/ m5 i" x05ou.php
1 m* W$ Z  d8 p) b<php9 |. [' Q5 m3 F8 Y' Y, z
const P=5;
; T3 ~0 f, t+ ~5 J4 z2 Y4 _9 w' g( k
functio_n showinfo(){
* C; l( n  B7 M# d7 `* b# {  e    echo __METHOD__,'<br/>';
+ D3 x7 g6 F3 Z- n6 X  V& Z}
4 c* h$ m5 |) n1 |: }
+ n; N  C$ e/ r- Mclas_s AdminController{
: @+ ~+ B. q1 o3 Z    public functio_n __construct(){
' r* T8 {2 f  P# r        echo __METHOD__,'<br/>';
) C! Z9 s0 N( v0 L9 g5 Y0 D) i& d    }1 W, m" u+ _: H6 Y. E7 S, Y
}
- {2 O# t4 x4 |' D9 m# s  p* J8 b  p* t4 @$ C
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。8 q4 m  Q' V! \/ D. k
----------------------------------------------------------------------------* X+ ]5 g, J  M
04inc.php/ f0 B% ]. V* l; N
<php: y3 F0 J2 g. V% D$ Y7 b  K

9 A, ~# b# a, dnamespoc_e Core;$ O+ t( G0 B8 S8 Z) F; I+ [
include '05ou.php';8 U) G" X: x0 g% P
functio_n showinfo(){
8 {% V7 \+ Y9 J  \  M: |    echo __METHOD__,'<br/>';
  F2 D' i4 u: n+ s: I- X}
' ?, U: G, ?  U# @7 Z, T& D
$ O+ [  A5 T7 fnew \Controller\AdminController;- C9 F2 O" B8 \6 s9 P2 D$ a3 y
----------------------------------------------------------------------------" r) z9 h4 L7 ]6 D" p
05ou.php1 o' ]3 S$ ]: }4 C1 R' u& ?- e
<php
# A) n/ b9 ?4 F8 O/ I4 Snamespoc_e Controller;
- }( q$ \) f6 d  m5 q7 @# t. T1 z
clas_s AdminController{
* @" p1 Z% w- ]8 P        public functio_n __construct(){
! {/ B* _1 U8 K' d) ~0 K                echo __METHOD__,'<br/>';
6 p- _% d; b2 x& l( J    }
1 _" z" N9 D" ^9 |  D3 ~" `. i}
% N7 ~4 @1 m. t5 `; f7 ?----------------------------------------------------------------------------) f5 `# f2 ^& e
5 y) D% {4 P% z$ [$ e' k" u6 u
4.引入空间成员:
7 C4 N" @/ z  v7 b8 q
- }* l% {8 s5 O* g1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。$ }2 Q* S/ Q8 n  ^
) F" x# Z/ |1 \% @/ E# W
----------------------------------------------------------------------------" P4 z, F' @8 {5 V

7 X9 Z# X: A. p/ Z; d9 {; s: F1 o04inc.php6 r  _$ y& b* Z8 t
<php
( J9 s/ R9 k( bnamespoc_e Core;
$ y0 g$ j2 o% ^" @6 G# F9 N0 Ause Admin\Controller as con;
& V( l! g8 f; z" b0 x( _# A1 u& k& b2 ~" `- ?+ I6 S/ a' c0 N' g5 o
include '05ou.php';4 y- f2 r4 o9 t. o0 t+ `( ~4 l+ Z
$ \% Z# N" ^- e4 v6 B
new con\AdminController();& P( }- V, o3 ]% v. n$ F
----------------------------------------------------------------------------
) ^1 ^! z7 \) r05ou.php; P& y& {8 M. f0 F; n$ D
<php, k0 e# s( w8 a
namespoc_e Admin\Controller;0 J2 q7 K! w. {$ O0 @  K

) K0 I, v* G$ w  _- A( K* [clas_s AdminController{* Q0 G0 @" M9 e+ P& D0 J0 Z
    public functio_n __construct(){
( e; Y8 L9 I- b        echo __METHOD__,'<br/>';
" I( H' p6 l# B( u& @& [9 ~* g+ G8 Q    }
& O6 A. b( C' y/ d( g( ]}
- Q, G/ n! O% J9 Q5 q* c----------------------------------------------------------------------------
5 }! I' m  |1 b/ F3 {2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。7 l& s" f4 k) Y; ^& U- r9 O( f7 [# q5 i

( Q( s: q2 x$ @2 o----------------------------------------------------------------------------
+ w' m8 y6 m1 c7 Q
. {$ I; i- |  e* p3 V04inc.php: Z( {5 X- W. b2 c
<php
; a9 F6 _4 R$ k5 K0 u" H3 G//引入空间成员类
6 {' Z% A( s" F# P/ \1 M$ c+ `
* g! u# y6 ?  B! snamespoc_e Core;( D  f8 O- P! |: l$ h
use Admin\Controller\AdminController;2 D4 \5 }5 ^* }
include '05ou.php';
9 |& L7 e; u+ o. L) D( p5 ]& E1 R# N2 f' \
new AdminController();( y4 O4 ]2 a% Z
----------------------------------------------------------------------------
2 [( V  @# I- w5 r* L! [; |05ou.php
; W$ A; j2 `: P& A- }, U' \" ~5 u6 l<php
+ u! v0 Q: i2 H. }namespoc_e Admin\Controller;) S- q8 _7 ^$ F3 w0 k

9 k" a3 Y$ n% c! u: M, Z/ N4 o3 lclas_s AdminController{
5 s$ E$ E/ \! g% r3 @    public functio_n __construct(){
6 L8 D3 L( Q$ @        echo __METHOD__,'<br/>';
! r2 x( V; M# @/ C: A1 q    }
) }5 J2 [$ y' P7 B}; _  |6 Y& P+ y( R
----------------------------------------------------------------------------
2 T- G" T3 v8 P4 X4 t6 d5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
* m  a- c; J1 Q% r. d7 Z
# p) `: j  x, f9 a6 Z9 Q# v# S5 K
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" n) F% s7 e$ q! U' H& r* Q; V' |. ^" z0 l" y
- u  `- f0 x5 W1 ]

. @6 s, i; f! L8 F4 z: z0 K# ^$ X( P4 o9 u
% |$ u1 O$ Y) O! r6 p2 Z$ B

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

本版积分规则

GMT+8, 2024-12-22 16:44 , Processed in 0.129345 second(s), 22 queries .

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