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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:
: m* y% Y+ k! E. \8 g( W
! q7 t4 e# y& X2 z* V在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:8 q2 G4 O% J( Y" A0 }0 k5 n
0 c) e3 s% m2 N- k3 g

  `. d$ r( q: G9 u: G+ A/ P' }  H7 F: v
我们来详细的讲解一下PHP中的命名空间:- p& M# H  d* F' |0 k1 o9 B

% W; j, i  o9 H, ^语法:namespac_e 空间名\空间名;2 P$ D) J  B1 V

1 P6 H+ V4 {/ h/ b( l说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:* M' Z7 P! u6 p5 N, z" V+ s' ?

7 o8 p- {4 ]- T( h* k----------------------------------------------------------------------------
& t/ h7 q. g, p$ Y: X) A9 K
' T0 M# C$ _' }( @<php& J, Y0 B& V, x" s
) V8 o0 A8 Q8 c
namespoc_e AA;
* M2 Y( O% @' r. G3 [, B' {5 p2 lfunctio_n showInfo(){
0 ^. k$ o( x/ ]    echo __METHOD__,'<br/>';
( C' j" T& l8 ~; @1 d3 h# f) i}
5 c6 Z& C% `5 |. N; Lshowinfo();
5 g. C' T) H1 }+ c8 e) R2 c8 @: u# x0 [3 {5 ]" [* T
namespoc_e AA\BB;' y; z7 m& m' V5 R% i8 v' \, @
) s  j) R+ w! s. g. n
functio_n showInfo(){& E: G7 K9 K- U( P0 Y8 T
    echo __METHOD__,'<br/>';
2 _( n/ @$ h. h* x}
6 t. J/ G& U$ Y7 i1 l. f& H- e//showInfo();
) H8 ^  z$ _) K----------------------------------------------------------------------------
3 G6 a( i6 y: Y5 j4 V" y+ G2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)1 P% N# i: h, y5 L8 a( i/ O$ J# R

- g/ o$ p# z+ a4 s: ?' X3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
; w. Z. U  v, W* y
' B, V9 H9 I1 c6 T( d6 h3 w----------------------------------------------------------------------------: T3 Y+ @  D3 j
$ F6 j( t% @. @; D, _
<php* E& U8 w7 g# `* u- L% W
namespoc_e AA\BB;
% {" @/ \+ |. [. ^4 ufunctio_n showInfo(){
) s& [! d4 L$ Z4 [3 J* w4 J# d. m    echo __METHOD__,'<br/>';# N  K* h( ~7 i( V5 ~  r( s
}5 D: T5 W1 W0 j
namespoc_e CC;9 y; e5 o3 B7 [. _2 N# ?9 P6 r! Z
functio_n showInfo(){$ g7 r0 H. c8 F" B& c
    echo __METHOD__,'<br/>';2 M, R+ t( }+ ?5 |$ f% E1 q; ?
}- e4 o5 t5 e( o. n
namespoc_e AA;
! m1 O0 y8 e  h4 q! m/ C/ X* N1 {functio_n showInfo(){2 z$ e5 N5 M& G) ^; n1 y  L
    echo __METHOD__,'<br/>';
: q' |# R4 v6 x$ L) Q8 J}
& |" Z* J, ^0 O5 W+ S# s  m//非限定访问:用于访问当前空间中的成员' [" M% x- _7 c/ k1 u
showInfo();2 h; o7 |2 x+ g' m8 Y% S& J6 H
//限定访问:只能访问当前所在的空间的子空间中的成员. k8 Y! \. q* V
BB\showInfo();2 W5 x+ f& g' d. H' u& M) o
//完全限定:可以访问其它所有的空间的成员% s, m& p' Y% L" Q3 f: L6 S  T) C2 @
\CC\showInfo();
: J" |. P2 ~% m* s4 p↑根空间标识符1 a4 F. ]& ?- o* b4 s' l' F
----------------------------------------------------------------------------0 x8 l3 a" b& {! e  K1 P
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
0 l( x/ C/ w2 q% P1 V9 r
8 N; c9 q' O% ?6 Q当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
! j9 I3 u2 L$ S: J' `0 @& G1 @4 M) F; M2 u; \/ V1 P
代码示例如下:
0 j. a. b- s) {: C. ?4 v  r& ]5 H9 S$ S, `9 f1 V3 t5 n
----------------------------------------------------------------------------
8 S& F& E" E" F- a) e8 Y
: |, h% ]- O( ^/ d1 s
$ r. H+ r, b+ S- o+ m3 q04inc.php' [7 A5 c% K3 e$ k& }1 [
<php* y$ I3 e6 \+ g* @% ]! G5 k* v% h
6 \! l6 {# v3 e& ~- l
namespoc_e Core;
! b! u7 Y: M8 G* Minclude '05ou.php';& S' r' i# W, v9 X' N. V
new \AdminController();, A& m8 O' x$ A+ n+ c  V1 K
showInfo();
; {( D1 b. z2 K' q6 p# V4 ]
. s$ B* }/ S* x9 V' l& }echo P;5 E! R! I$ U$ w/ P" W! c1 t
//根空间中的成员,只要类的访问必须加‘/’- i% ^# g$ J6 C
----------------------------------------------------------------------------
: p0 x. I' Q* l0 h2 e: l- X1 o3 s' ]% f, Q" h% K. C, T
05ou.php
$ ^. m7 s- r( E+ D! B<php
5 Y) [; ]* p: Z  b& w, @7 _const P=5;
% B5 J0 {% O  i5 R& ~% d
- [0 [+ p) ]9 p9 D, U  sfunctio_n showinfo(){
" ?7 ~5 A7 i: i- ]- w    echo __METHOD__,'<br/>';/ S5 M7 ^; X% F& G6 F
}
1 c; ^# K8 A, b  |; t7 E: D
- y! y4 i2 W7 `  v/ iclas_s AdminController{6 G/ L2 }' }& v2 S8 N! `
    public functio_n __construct(){
& ?9 s0 d2 G2 U0 ?/ }8 q2 g; m  P+ e        echo __METHOD__,'<br/>';
+ r$ {* `8 K. k8 x' z    }3 t; d' V9 a+ o  Y1 |
}
6 h0 K; W& |3 ?8 w# O$ g. Q! u6 w% R; ~3 m+ G
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。4 r; P, @" E9 ?2 Z9 i4 c8 S! ^; i) x
----------------------------------------------------------------------------
& m: u5 G: h! |9 C04inc.php  [$ n; B; Y4 |, R! X2 G; t+ K
<php. h0 Y3 E; J: \% m( [0 _
' N  G. D6 D* v3 S* }  n/ A" r
namespoc_e Core;* T2 }# u# S0 R
include '05ou.php';/ ~3 U+ H: |0 Q
functio_n showinfo(){) w2 d# q' M; z# R
    echo __METHOD__,'<br/>';
6 ]6 ^# C* V! t' F/ t/ W2 b7 b}
" _, X: D" q# @) O4 H( k2 o
' {1 d) g. X0 f+ Rnew \Controller\AdminController;
* c3 N3 N" D% e' j6 V2 s8 d----------------------------------------------------------------------------6 R4 F: B! Z: s2 \0 t; S; g& O
05ou.php) j# s1 X  C1 Q2 l" {
<php
. ~: |$ F' |. R: R; Y7 N% }5 onamespoc_e Controller;) \* Z$ X; O9 H) `
8 L* h( T7 C2 K
clas_s AdminController{' {  N$ L5 n# j% g5 L# y. g& s4 ]
        public functio_n __construct(){' J  Q# z9 i# e
                echo __METHOD__,'<br/>';6 ~1 P" ?: g. b5 g* K& `
    }
- |4 \& `5 U6 q}6 J7 S* C# ^3 \% Y, r* \
----------------------------------------------------------------------------- Q0 O! I( J: X" p2 V

& e# s/ C: m2 M! o5 K- }4.引入空间成员:' k1 W( @! C3 g% ]( [) x

! l: B- u, e' g+ l1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。4 n# d5 q6 b' B: P+ V( {
6 I3 Q3 ~* B; T8 q. z3 k; i
----------------------------------------------------------------------------
. b! {* X" _5 f6 P* g; Q/ a" U8 v1 o7 H4 L
04inc.php7 s5 O% u/ T+ I
<php+ T6 }" \9 B% S7 d% q+ \
namespoc_e Core;# S6 A  ^! Z& o& ?: w6 E( q- C
use Admin\Controller as con;& a) A6 S2 T. P- d0 |8 W
' i4 Z5 F) @% |3 L
include '05ou.php';6 V0 k+ F4 U% v7 d

- S. D" p" e7 B4 g9 s0 ~4 unew con\AdminController();
8 h+ }/ P5 l; ^" Q/ v6 a" n----------------------------------------------------------------------------
4 S  @! u) y. K, X05ou.php- j4 p# U+ I4 t0 q& Q3 q
<php
' y" K3 W. L0 p( J' b9 h% j7 lnamespoc_e Admin\Controller;# K' K1 e7 q4 L% G8 T/ g& F/ l3 @

/ ?+ W' W$ C: G8 Q- G) l" G* Fclas_s AdminController{, T- V1 k' V6 `, v: ?7 y( n- I
    public functio_n __construct(){
6 V$ k- y2 h- a, d) K        echo __METHOD__,'<br/>';
6 s0 e+ g$ e" m( D( U* I    }( [' ^# ]1 M1 |3 v( ?1 N7 N
}
/ ~$ i: G1 R# m1 F- i3 n----------------------------------------------------------------------------: W% V2 q- _. q! X: X
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
2 `. O" W* F. w! }3 {/ r' S( e4 Y$ I, V5 h
----------------------------------------------------------------------------9 d2 p) T, a7 T0 F2 f

$ C6 X: w+ P; k& D7 E04inc.php9 z, D$ x0 }1 q* q6 H, o
<php3 Z+ P; P/ Y& [
//引入空间成员类
/ Z) P$ e5 A( k5 Q0 ]" P7 `; k! S* E' b6 h
namespoc_e Core;
/ q; m3 n% t6 ~& ?( y. U) Zuse Admin\Controller\AdminController;
! i( a" n4 C, U# P" E" ?' q! Y' n! Cinclude '05ou.php';! q: ~7 b' ^' @, A/ _2 Z
1 s% J) r" R3 M9 E. U8 B% K) x
new AdminController();/ R: j7 ]8 p7 p& i4 r$ e
----------------------------------------------------------------------------
! z$ _3 v1 C" y/ }1 [4 }+ l2 r05ou.php
8 s7 t; k+ M, P3 D<php
/ h( @# W9 ~/ Qnamespoc_e Admin\Controller;& u2 Q1 o9 N* v1 n; F1 t1 H- M2 r

8 Q: Y4 i) Q; B2 B* |6 qclas_s AdminController{: M3 A" g4 h) Q+ H+ v5 W
    public functio_n __construct(){
  R7 W1 f# D, d4 O# w! x7 u        echo __METHOD__,'<br/>';; W& g1 _4 \: q
    }* i& a( [, [% h  g3 K# {
}
3 E! X5 W# X0 x7 U& \. ?----------------------------------------------------------------------------1 X; X9 Z( S& I7 @* t3 ]
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。( e8 k0 E$ u! ^/ [

% I; ^) J$ |9 b5 V: V1 i* g4 f
+ J2 U  a! }; R4 f. f0 \! t6 p# N这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。7 R- I2 _- [6 x% ~5 F0 e
5 `& E/ i6 Y# k7 t1 h5 m& o

8 }: V/ z& e6 u" U3 [9 K% O& u* g( Z% }$ }& O" V
3 F/ \$ h" X5 p

$ j' q4 ]# c/ M+ K9 h& E8 S7 R! T% X$ m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 22:08 , Processed in 0.130806 second(s), 23 queries .

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