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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:( ?& y( h9 o( n. ^! f

0 A# l' `0 l- k) p8 o, j在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:( }, `: e. [# d; e( v

' I! ~* G* E  r4 w % t( N7 d; E1 m& v: B: g
0 q2 E5 Z! s  `+ n6 R
我们来详细的讲解一下PHP中的命名空间:
* `4 o0 `8 }  @: K) R9 c- K% |4 ^4 r% U6 m, e' V2 M
语法:namespac_e 空间名\空间名;; m# m8 J, _4 @# z2 T% ]
8 t8 b& i1 ~. ]% h
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
' a. i0 J; a: t/ ^
( _& h( E- C* @----------------------------------------------------------------------------
8 L- M# \. _( I6 z0 y/ y
, @, C: j" r1 |8 P4 c6 j<php
$ t. i% p7 }+ d0 ?  Y% m
. F% u# v/ ^/ a2 D% l6 _namespoc_e AA;) ?/ b2 n0 H: G0 w: f! c
functio_n showInfo(){5 D5 x+ p$ B9 ?" s& z2 w: B
    echo __METHOD__,'<br/>';5 R- i3 l+ n& ^( T- K$ J
}$ y2 j: c- V  R( V  Q/ W
showinfo();
4 K9 q, Q1 R7 w1 {( O6 v8 h! P+ h$ u1 ?: \* j
namespoc_e AA\BB;
( s9 {2 N1 n& w8 ^/ k% D7 E  D/ z6 Y/ p- n. a/ H$ d  d  f
functio_n showInfo(){: Y) m; s" K' n& f6 J0 q- O- ^
    echo __METHOD__,'<br/>';3 }5 L1 h$ z% v. f
}
- J+ B" I4 b' L; {1 b$ `. [& y//showInfo();/ `% Y# e3 J# _  N) i  Q( ?& f. c
----------------------------------------------------------------------------
( A8 `; v, _6 c9 n0 }. T6 i2 B2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
7 k! s% S  `! O* n( c7 A: o3 X& a4 u; h
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。5 H/ }, G$ {) P' F$ J( L! K
6 m; p8 ?4 O* v0 }' V
----------------------------------------------------------------------------& ]- X9 J! v. ~5 o. X6 v9 A

4 I# ~! C+ x6 u- _<php: ~. Z0 y8 h( o1 W' J$ M
namespoc_e AA\BB;
- O& E# l- P! R6 Tfunctio_n showInfo(){
" M3 X6 I- ^) ~3 ~2 x% B* f. A    echo __METHOD__,'<br/>';
9 R4 H4 ?' W) v! g3 g  D}
- h# b  t3 T6 e3 Fnamespoc_e CC;7 v- \! j. b" u( Q. @9 A% J( n
functio_n showInfo(){. d  O& F! C! ^7 ]( l; y- b% d4 T
    echo __METHOD__,'<br/>';+ K$ S' A& I/ h! ^
}
! a6 i2 P6 M' S6 H( {namespoc_e AA;
! V$ B5 M" ~% a$ o8 ^functio_n showInfo(){% Y- s) F: A1 o# e; h0 _. T1 r0 Q
    echo __METHOD__,'<br/>';7 g0 y  C, x! ?7 D; f$ N$ d
}
) p6 D# G0 Z, O: g* d//非限定访问:用于访问当前空间中的成员; E' V. ?$ I: M$ o- F# m
showInfo();; Q! W0 P/ L& K; ?) P7 E% Z
//限定访问:只能访问当前所在的空间的子空间中的成员
, S1 h0 K/ S& {& Z+ V" YBB\showInfo();- ~. \3 `& S. h9 ^
//完全限定:可以访问其它所有的空间的成员
# k. h/ N) X, ], R0 z\CC\showInfo();
7 K3 V) @% y; U: M0 d↑根空间标识符; e% J5 a3 I6 ]: [
----------------------------------------------------------------------------! l& p0 t/ T3 X$ \& \- ?  S
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:2 n1 A! w1 w" P! I: c) w  o
+ N! F8 E: W$ C
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)8 C$ N& o" ?' @

( X( ^, T3 g* {" X$ q代码示例如下:
; {- h4 R- B+ d! d9 ?8 f! l" V0 {
----------------------------------------------------------------------------; _# \1 Q/ |+ P- W% N2 }' |
1 ^3 s7 \& I: J! L
* b. n; L1 V" f6 b6 x& ~
04inc.php
; S' K0 ~& Y4 s! q  w7 p<php
: O. E& O/ G5 ^
2 t) ~; P  Z1 {( ?8 l  }namespoc_e Core;
' d1 A( O6 ?  Q* M8 ~5 E. _include '05ou.php';  o- k) U: E) M% O* w
new \AdminController();
5 l' h! F4 N3 m# ^2 DshowInfo();
' ]; m4 J( z" f) x' Z( J/ I9 A2 ~# S1 x
echo P;
4 g3 s! ]% B" t6 F1 A! ^* P6 }4 P6 U//根空间中的成员,只要类的访问必须加‘/’
$ _4 W7 j5 y) A----------------------------------------------------------------------------9 p% o# {6 M- F5 h
3 ~' C* _9 V+ ]
05ou.php! D( E% O6 x3 K9 h
<php
' I  ~6 r' c: }2 H: G8 @' jconst P=5;
6 |( ?3 z5 a  d6 d6 B  y0 z
/ j3 a0 Z! _+ N  o5 b1 r6 ^functio_n showinfo(){
0 U9 R4 F% ~4 t9 f, V, Q2 Q0 \    echo __METHOD__,'<br/>';" G) w, V6 j8 z6 D/ s, s# |
}
  y" d6 l; R: ~, T3 V1 v3 {
; x. r. @8 y( X5 S9 l* U3 xclas_s AdminController{- e- l/ {2 b% G+ P5 a
    public functio_n __construct(){5 f( L6 M! u8 k- x
        echo __METHOD__,'<br/>';
" C0 n$ e* }' O  ]2 B/ {- Q- ~    }! |0 {9 k- F, \! t
}8 h+ u3 Q; t8 b$ B& Y6 Z; V; I

8 g- i$ c. Z( ^0 V. M% o第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。) d% \8 L9 y/ ]1 S- B5 s' k
----------------------------------------------------------------------------
6 H  C" G9 ^: l& j8 V$ Z3 [! Z5 g04inc.php) `: A( R$ K6 E6 B! T6 h
<php/ G) B7 g' w4 l; m

0 F" k, P/ m9 {) k- Nnamespoc_e Core;3 l0 q' t: y0 r( ^5 F
include '05ou.php';
1 d$ d) j  H2 I1 V* H" N: o  ~6 wfunctio_n showinfo(){
, u8 D1 o+ m3 x! |" T    echo __METHOD__,'<br/>';
9 k, n2 D% ]) m* s5 i6 H}3 j) u) a% I; w! i/ |1 |
$ P) F/ L4 [8 ~3 v, Z- N- g
new \Controller\AdminController;1 N% d" r5 K+ H. [
----------------------------------------------------------------------------6 J8 D6 ], L6 U5 T8 c2 J4 A! \, ^
05ou.php
# _5 r% `$ p+ h/ s<php& q4 N/ q+ B7 }9 N6 `" G5 C
namespoc_e Controller;4 W2 s) q7 C0 j3 }6 Q; }) }- X8 \

/ j0 v- B; s7 k, g6 lclas_s AdminController{* Y) `: V) r& w3 j
        public functio_n __construct(){
6 u; q6 ?: Y. E* n: _                echo __METHOD__,'<br/>';: j$ x  N" P. D5 `- Z8 }9 {
    }
" j  D$ i( v/ y}
) E& t2 ]1 e" g7 E----------------------------------------------------------------------------
. i7 z6 B; ?2 h4 P- H! }* k) v2 C9 A. U' f( R+ X
4.引入空间成员:
/ R1 U; Z  q" H2 g, e1 E' S, s
8 u& \  j6 x" d8 \1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
& q1 `  s& s. y, e4 e$ k6 B% O5 \$ \
. c5 O% S5 c) v" ^  v- ?$ L----------------------------------------------------------------------------
# _% _2 _$ f- f
6 Q$ {: M# |. }04inc.php! S; [" ]. C6 C+ s$ P
<php' r) X( v% L- p6 k
namespoc_e Core;
8 m/ W0 ]' L* L& s# |, T6 puse Admin\Controller as con;1 c  n  e) l- U( l  T

' S- m* B- q& ~include '05ou.php';9 k* G) d- T3 Q+ a9 K% t
  O3 a! ?( W/ d- t$ p/ h
new con\AdminController();; [$ x/ \: v8 \8 U$ Z. r
----------------------------------------------------------------------------
) a0 \7 ?; _9 C7 N9 A# D) r: \05ou.php
' V3 K4 @4 Q& Q  X9 z<php4 S; P3 G) x' _" _" v
namespoc_e Admin\Controller;& U) I4 K' _) v: C, l0 f  X8 U
( U) H: J& @0 T' \# O$ t. K& ]  y
clas_s AdminController{
5 P7 E+ h6 U/ b9 S: l    public functio_n __construct(){
% G! i4 r2 d% l% q! X/ E: w8 ~$ p        echo __METHOD__,'<br/>';
1 h  q1 L0 x' e" y( \+ t    }
7 ?& R2 U6 ?7 ]}. l! l! n/ \7 ]0 ]" X& u
----------------------------------------------------------------------------1 T- }, u' r# Q0 ~! H* U  C! y9 Z) y: Z
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
) c4 L2 j8 d  m9 T
9 w. L" H3 f& h, T  `4 a----------------------------------------------------------------------------
+ j2 H: y  d! A6 a
, D- {4 ~+ V0 [  u04inc.php- K" H. {& P+ L# S, x$ X/ ~/ A- i
<php
3 e0 O+ I6 J  ~8 p* l//引入空间成员类
/ s/ [& E2 G" d0 i" v- o. a: @" ?* S
namespoc_e Core;) u8 M3 ^6 f, i0 T
use Admin\Controller\AdminController;$ H. N- I8 \) l* r# {
include '05ou.php';0 i% z4 L5 j# W$ m$ y% A) S
2 U3 H/ x- Z& J: x+ v
new AdminController();8 b/ j1 O3 t7 W7 H2 ^; u8 f
----------------------------------------------------------------------------
$ J9 C3 @! j2 ?( z, x' g05ou.php
' R8 T4 s9 W. ]% A: v3 N5 V<php
' Q2 P( }6 Q& C- i5 _4 a- A5 Y8 pnamespoc_e Admin\Controller;- N' E1 C: E) o% s& P# ~+ W
* ?) c2 q7 o- @6 S
clas_s AdminController{6 Y, O# e& D8 b8 H0 [3 s# g
    public functio_n __construct(){: N$ T2 [$ T3 g
        echo __METHOD__,'<br/>';$ d% M) a: Q$ _, w
    }
6 ~- X9 V: K3 j* ?+ Y, `}
& L) O/ {5 Q/ d6 }----------------------------------------------------------------------------, \7 f. H- P! w. u1 S* l( c' v
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
5 n9 Z5 G: y9 l# L! ~+ A
! {3 S2 e2 g  A# `" Q9 |0 m# a9 _* I3 I- D! h
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。+ |7 H  W1 O+ M$ J# G

$ O( `( l5 L- x; k1 u6 X
( W% @% X7 B/ Z9 C  v: y5 m* f. ~1 |; S1 E1 V  G. A8 O
# J: r' R8 E$ _4 H# b
7 o) P/ j* H% E6 j% n# r' i
3 i$ N, P5 n! L0 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 12:11 , Processed in 0.111566 second(s), 22 queries .

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