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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:5 ?! f, {2 D1 d5 O
* h! F: N, o7 j* i/ N/ I" ~4 `
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
; M& c* p# q/ N
) c: X0 s6 T. I! G* V7 \
9 ?& C" Y$ V: u. u  n# U9 v5 W2 l* t" Y# j& Q
我们来详细的讲解一下PHP中的命名空间:
( A8 B( j+ n* T4 P
  ^3 |4 ^# ~. {, {语法:namespac_e 空间名\空间名;6 V! {: K) O; W

. x: I8 }' v0 W说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:) j$ }/ N  b1 `1 _! U" d+ _

, h! M& ?2 o7 Z----------------------------------------------------------------------------
* x% b% E* Y' R$ A8 `+ r6 _: Y* w$ k1 X. N. c9 P6 R0 J
<php
, x! B8 m9 J. N" f) l; d& Q6 ?! T1 S" i" ]6 f
namespoc_e AA;- c5 Y( V; O* E0 F$ D
functio_n showInfo(){
% e# _# I( S- F2 t5 k0 k6 G1 B    echo __METHOD__,'<br/>';
+ a: M. S9 r! Q: R; M! M3 q# D}
, A3 x, U2 H. ^% O/ H. Dshowinfo();
! \. ^* @8 u8 I5 ]/ D( o7 X* \3 E/ q
namespoc_e AA\BB;
9 P! G. C" b- m
$ Y8 Y9 C/ i- l' Xfunctio_n showInfo(){* c2 d9 o- k$ G# T) o/ T
    echo __METHOD__,'<br/>';
, V* {% M/ S- G: W  @7 l& S}
# J( v" g6 f' W2 Z//showInfo();3 Q; I: b$ ^: M8 }9 q
----------------------------------------------------------------------------
1 ], `; h# b6 F9 v2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
8 ]9 |: \  e: |/ P- O6 z9 P6 z+ C: x' G1 @& d2 `5 E( I6 K) m0 E/ F& n
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
( L& Q6 D1 ?" I9 f3 f% y0 c
0 M" _' q5 J0 {0 k$ J5 x9 d----------------------------------------------------------------------------
. ]2 k+ y0 t) B7 l/ q6 e. P5 s6 c( {; t* V
<php
- D$ g  Q  S$ Hnamespoc_e AA\BB;9 ?4 E; G! j% _* L% f, L8 m
functio_n showInfo(){6 d; T) P  e$ O  F! q  v3 ?
    echo __METHOD__,'<br/>';
; u3 {2 D# E% `* v: T  c}
2 [) i, c  k2 O9 \) I( |namespoc_e CC;
2 A8 ?% k0 ~  b3 nfunctio_n showInfo(){0 i7 L$ S8 h2 v8 k  g% e2 w- B
    echo __METHOD__,'<br/>';
4 O% i3 }0 _  g5 D* j}
0 m6 x4 N2 i% x; cnamespoc_e AA;: p0 D# N+ X& u0 [
functio_n showInfo(){
# i4 |: E% I1 C' s; y$ a    echo __METHOD__,'<br/>';
0 y& o( A% p& J  y, K}- C0 Y# D. y8 j$ Q% w
//非限定访问:用于访问当前空间中的成员
1 t5 v8 a. o+ v0 bshowInfo();
0 x6 X4 K' l/ `2 w2 m9 }//限定访问:只能访问当前所在的空间的子空间中的成员
" p$ A9 c; X, u: k) B: j3 aBB\showInfo();
$ o) o" R% ~1 t) F//完全限定:可以访问其它所有的空间的成员
; `% v+ l$ G! ^4 f9 o2 V1 E\CC\showInfo();. {; i5 u- k/ T( O
↑根空间标识符* o& c# k  p4 h/ ^: i# o/ N* W. ]
----------------------------------------------------------------------------
7 C+ h+ M6 v7 `1 O! z0 \( o; m2 F但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
7 @- h8 I- U$ R% B# }* |
( _& n  b2 ?# P: b. ]当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)% k1 L( V: F0 E" Z7 Z. a
2 u* X* u* v4 p' p# B# n- B
代码示例如下:( B+ K, G" O0 j' f
; u1 u; ?1 k( @* ]3 i4 e$ Q) ]7 r
----------------------------------------------------------------------------
0 I9 u* P4 Q$ @* v0 g8 n- R  g
7 {! d1 A) u+ E) a; s: k. D) a& E, H( }# [% a* d5 f' _' r
04inc.php5 T6 W1 H9 J$ m; R2 k/ N: o
<php$ ]; q" r& b* E9 x6 D8 A& B1 [4 K" i

6 }+ E" E9 p( X. dnamespoc_e Core;( j7 T! q$ l( J
include '05ou.php';! s4 u  a; z/ ~! i) L7 g6 L
new \AdminController();" ]( }- K' j: B! ~
showInfo();
; h* X% [& O! T2 ~
9 t) I+ C- `1 ?: Oecho P;# D; O" ^; B! A. R0 T
//根空间中的成员,只要类的访问必须加‘/’
, o+ Y& B$ v0 P+ G- r, t----------------------------------------------------------------------------2 J6 ^( b3 v$ G0 ~5 p  k8 \8 N
& I0 |  E8 b& }, K8 y" }
05ou.php; ~, U6 H8 r- z0 [% Q8 W; v+ r
<php
4 r, R9 d* [7 Z7 M3 I5 I7 L8 f2 Cconst P=5;* Q& Y0 p0 C+ G" X7 O0 R

4 R8 u: P5 V" w0 l6 \functio_n showinfo(){% s6 ?9 r  L9 }" ^* l" p! A- t* H& I
    echo __METHOD__,'<br/>';) [3 t# n! ]/ k8 E
}
; P  Y- l- s2 R. W% l! }# a! x
+ ]5 h6 c- |; l& K  ^0 Kclas_s AdminController{
! @* N4 w# [/ f2 G9 |* D9 |6 N    public functio_n __construct(){. w' X9 q, H+ R6 X1 c
        echo __METHOD__,'<br/>';
2 c! B, F7 R4 f# g- d3 X    }5 [/ }- M4 w0 s, S6 Q# f$ Z
}0 P) |( L/ b, g! Q2 z4 M

+ j; F; U! R9 Y) c第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
* c. }# N: W, ^$ i3 k2 Z( j5 T----------------------------------------------------------------------------; S+ F+ [6 Q% l( ~( |
04inc.php) B- Y. h% h% L$ Q
<php& [$ |+ {' O. k0 ]! f7 p

7 o' ]3 X' H" \& F8 _$ w/ nnamespoc_e Core;) i2 ^9 v) |  F( s) \" Q  j3 F
include '05ou.php';
. o$ L* c% d, j5 K7 `: e% ?" I+ ufunctio_n showinfo(){$ d2 L& @" v3 o+ x: ?3 F2 ~7 I. [
    echo __METHOD__,'<br/>';
% {; _( T% d( h) Y4 Y& Y# P}' g4 [" G- o  `

/ N4 [) J( \. i) [* G& J! `new \Controller\AdminController;
: q# ]* U% q+ j  u7 ]: Q----------------------------------------------------------------------------
/ `7 i( I6 @( K/ P. w8 [8 w05ou.php
% W) n! B% R1 E7 P" J6 u<php
, m2 `" \, B. E/ {& v5 }namespoc_e Controller;9 X. O) _. Z" n" }  [! V

6 n+ k$ ^6 {1 s4 J0 c5 r' |$ {clas_s AdminController{: d/ k9 F: G) T/ R
        public functio_n __construct(){) U# k: D) ~8 ^5 }9 ~% E
                echo __METHOD__,'<br/>';' I" q- P# _8 V* K
    }% c; d5 h0 u, _6 S& F1 I
}4 o$ K5 ~/ ~. U0 k+ V( b
----------------------------------------------------------------------------9 v/ K% D$ m3 C/ |$ b+ [
7 _( z  y$ P3 a( _' K
4.引入空间成员:
/ C7 T. z* Y4 J& L4 y6 D+ Z, v
% y( A* [# H3 {( c1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
, M2 x1 c( V  k* [; ]4 Q. I8 Q4 W; R. [% B, y  H! @
----------------------------------------------------------------------------
9 o" |/ [& b, _2 ~2 t" o5 J6 d; s; g, j" M( Q3 d4 y
04inc.php- {. o# C5 a, }0 g0 f# f
<php5 U. s  Q& s0 k
namespoc_e Core;
, ~& [: e6 z6 e- Yuse Admin\Controller as con;
; o1 H# c; J/ x( I0 v' w2 L
% ]: B* B9 B3 H  U8 B$ C$ f  Xinclude '05ou.php';) z) n" d4 l/ _' u3 _6 i3 P$ m+ o4 |

! r+ ~1 q* j3 {. s0 q( P! |! Jnew con\AdminController();% c; g, P5 c; P/ s
----------------------------------------------------------------------------! V4 [" r2 o" X/ C7 D
05ou.php
" `: z1 W$ Q5 u% _: P3 g<php4 o4 h) Y# B4 b$ f6 Q# p
namespoc_e Admin\Controller;) _4 N  n. [$ x; B

# Y. k, n# @% k/ `, B( tclas_s AdminController{
* u. D4 G: y5 P    public functio_n __construct(){
, f% P! M9 p! t' q+ O* M$ A2 r3 y        echo __METHOD__,'<br/>';
7 x6 y4 Z# t* ]/ E" T. f4 m    }6 ]& n1 _' R6 @% W  V- S
}0 U4 t, E! b3 d  {1 ]
----------------------------------------------------------------------------
2 e  f4 C! W& M. R; q! u2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。" T/ f1 E7 a1 |$ h" ^% m+ O

: U5 H; A$ U7 B$ d$ e----------------------------------------------------------------------------
6 \" }  x/ I4 C3 K0 W
9 Y+ K7 ~6 X/ ]9 n04inc.php1 h: h: E9 l$ O; d# ^
<php9 Q) j4 ?. ]& v% o( `$ r: D# p% U
//引入空间成员类! ^( B4 g' l# B8 W4 c6 B- r+ B
3 g! s/ D; T% G; J
namespoc_e Core;# y( f+ X* b4 X! w1 M- \1 @9 r
use Admin\Controller\AdminController;' [" {+ n; K7 U# T0 n. |: u
include '05ou.php';! |% `/ ^9 Y; k% s. R  r6 M

5 y9 E4 w; ~( s% Ynew AdminController();
! f8 y  x* C) c: s! ~----------------------------------------------------------------------------( P/ c' K4 |. j0 b# n. }1 s. y( h
05ou.php$ |# u6 Y! c& Q$ D0 z2 }
<php
, ~9 L/ E+ v. J; I* p1 @namespoc_e Admin\Controller;+ s0 j  s# f) U7 B  L! C' E
9 F# p( o+ Z) ]/ i) \: S
clas_s AdminController{
. C/ s9 u3 j) h+ Q    public functio_n __construct(){. X2 r+ ~. w6 {$ }
        echo __METHOD__,'<br/>';
9 S7 _  A, p7 o9 E" H! G4 ?    }0 \; H8 R5 p8 X0 O4 o7 ?
}
, r; _, \* _0 K: t$ E: I$ B----------------------------------------------------------------------------
5 P# J7 S; O/ e5 x3 ^* ], F& f" ~5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。8 F+ m1 X( E4 A' M0 h; u8 k
6 k% [. l& Q! L" @  ]# S" k

2 `5 R) t9 K4 p8 u这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。$ D4 c# J9 n! V/ ~7 ^
  T- A* H$ Q# b3 c' m- h
3 D2 |# T* H7 n4 d, C
% b: Y$ v2 u* N% i1 u3 m8 ?

2 M3 u, {) e( q4 J2 f- k, n- J6 ?) \

# g. ~) K2 x5 p* ?4 g5 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 17:16 , Processed in 0.131059 second(s), 22 queries .

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