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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:7 R' D+ D6 A5 g

2 D% ]8 O$ K/ R在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:1 d/ C; r; l" B" ]  N3 y
, d7 b9 M/ K& H7 Z( z

  s5 H: _  j5 f/ \: ~$ O3 |
# G/ V8 R+ f9 w+ a我们来详细的讲解一下PHP中的命名空间:
$ o3 \" B" {1 d" x
5 n7 @# K) F& ]. V* R语法:namespac_e 空间名\空间名;. ~, a* [6 h, f' \( @. l

& ?# d; K% ?8 a9 L$ ~说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:7 k7 m6 t4 {+ l- M% [
; D3 c: b4 E+ I
----------------------------------------------------------------------------, L/ [$ }$ E, t+ y  ~

7 f4 S, L; y. l9 d# L) \  Y: f<php, a& i( U) R/ H; t( P, ?* D

# U' k6 D9 r) s, ?0 w# knamespoc_e AA;
! ]7 n3 c: k& q0 s' Qfunctio_n showInfo(){
8 g- A- K2 w! m( }) x- \9 d    echo __METHOD__,'<br/>';
1 H4 u8 c" j+ D5 ?# g, g* f}
( r% x- o5 D9 pshowinfo();
, U) o8 x) R% _& g: u* b  z& L9 @5 {8 ?
namespoc_e AA\BB;/ a4 w) I8 B: ~: o
7 Q8 ~" f. ]" ~5 _( t
functio_n showInfo(){
+ @! i( M& T: E, [8 ?1 N8 u3 w    echo __METHOD__,'<br/>';
+ ^  d/ J, ?3 Y; v6 w+ y}( S8 |9 p9 Z6 t7 H3 a
//showInfo();2 u  G9 q# k+ G6 a" G) S' [
----------------------------------------------------------------------------0 u7 a5 D! ~) U  M& X" ?
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
- ]: L, F; l! Y) p6 e$ g) r
& g' Z% k: y0 c% Y# |! L; ^' A3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。$ n% h" f/ M9 d& M* C& Z

* s3 y2 ]; A/ q& m, d----------------------------------------------------------------------------, C0 _' [& [) y3 W" Z

9 Y4 t2 z4 x" O" \% \7 S9 U7 u<php8 c/ Y2 \% I$ G$ r+ j
namespoc_e AA\BB;
+ c9 I4 `/ u- l& K; \5 _! o1 ^& _! afunctio_n showInfo(){9 h* f2 g0 A4 a
    echo __METHOD__,'<br/>';, A/ I, N! Q1 l$ r
}% [, ?% l* l) S; H' V
namespoc_e CC;6 M+ ], `/ f  t& W# Y, s+ _" Q
functio_n showInfo(){
3 Z/ l" @! g& x8 [: N% i0 z    echo __METHOD__,'<br/>';
6 U6 Z' d  n5 t& J}
$ ^2 L  P( E  r2 U& k( wnamespoc_e AA;( I! m* a1 u$ S* \+ d
functio_n showInfo(){7 _0 c1 d% V) |* F. E( }' P% p
    echo __METHOD__,'<br/>';
; P4 }$ I9 I0 }8 t) B+ W  \}0 k, m' v) Q" v! n8 K
//非限定访问:用于访问当前空间中的成员/ J5 P9 g. {! d, @& j4 ]# J
showInfo();
& ^- @( H2 R1 ^6 k//限定访问:只能访问当前所在的空间的子空间中的成员
; f4 b( c7 w5 C( s) \BB\showInfo();2 Q  K8 @6 }1 q8 K6 i
//完全限定:可以访问其它所有的空间的成员
& \6 U5 I/ Y# u& P+ r9 P$ ?\CC\showInfo();
7 i; r% c. e. D/ k" u↑根空间标识符
; A5 J: X8 {: p. v9 T0 ^& K----------------------------------------------------------------------------( s& @; B$ K/ J" l
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:" g+ m3 |" z6 V4 S2 h/ X; P
; u4 U0 [1 }3 y
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)( I1 p8 W1 T% ]" L
2 u" Q% g" v$ q; v. J+ }
代码示例如下:+ r" h& T: X+ ^
1 ]0 {% ~& ^8 a; M$ B9 [
----------------------------------------------------------------------------6 X, l% ]& k4 G
0 B1 W7 O# ^5 p: t! D
5 ]* y' s% A: R( Y2 `! n! U
04inc.php
6 a- b7 Q5 T2 z3 D& \9 m+ @5 \. S<php( v/ V1 ]4 \6 P  p2 Y7 x7 [

1 X8 W: G7 D# s- X. |) [7 Dnamespoc_e Core;
! K4 I. M% ]; n$ x" O' B; Cinclude '05ou.php';7 o+ U  X7 y) V8 K  z  T- z
new \AdminController();
# @! j& i0 q. L+ c: `: o: yshowInfo();
( V+ T6 M( N! P3 k& `- h$ a( B. i1 Q$ z2 N2 l/ L* B( u7 W" w) a
echo P;2 H& v0 Q/ U) k7 J! Z2 ?+ `
//根空间中的成员,只要类的访问必须加‘/’
' O7 a$ \; t" m  }& S3 F----------------------------------------------------------------------------
" m5 L9 D  P" u0 \3 |6 T/ ~) n2 `* f# N" r" `
05ou.php
6 O/ g: F) }9 ?4 |9 A! |( B8 S<php8 {' a5 O& l% ?* v# B8 N& i/ _! r
const P=5;
( i( S0 S5 y' k! R: R
- d5 |# c' l& @) Zfunctio_n showinfo(){3 X" k) y4 {) m2 a2 M$ Y2 [, x
    echo __METHOD__,'<br/>';9 W4 K* o3 [0 D9 v
}
( Y: J6 {, q# {$ ^  ?- ^+ E: R) z' m; d- D1 ~% I% g
clas_s AdminController{$ a4 S' O2 K0 P! O, U9 E
    public functio_n __construct(){
; q$ Z/ o/ u% D; P1 j, m        echo __METHOD__,'<br/>';9 \  [( ?6 y& [$ H* _
    }
6 w/ S( P- U; X4 P1 I}
4 ?* L& q4 f! n4 x, M/ i5 c* Q$ v2 W5 S
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。4 e, D1 t; @5 N3 m
----------------------------------------------------------------------------
4 E# m; E1 j7 j- j5 X# d04inc.php/ N6 }5 k# F9 G* y/ E. b
<php
- n* a8 r. P5 C1 |  C
( @/ }" A3 Z, M1 Snamespoc_e Core;
# X0 v7 j2 }& W; n/ K/ e3 K4 xinclude '05ou.php';
+ m' d5 }# A  W) Q. Ufunctio_n showinfo(){7 d  L+ u5 ~$ a( k" [
    echo __METHOD__,'<br/>';
* U5 w; C4 Y2 {5 N6 t3 ]}
7 [) n. Z4 P% B+ k
9 t! c0 r( R& @4 s$ Wnew \Controller\AdminController;
0 K3 I4 w6 c% r----------------------------------------------------------------------------/ u, }) F2 I4 g% x, f
05ou.php
7 v; i: U: R1 J<php
* |, }6 a$ B! _2 \- Wnamespoc_e Controller;
4 m4 q" b4 K& P) h6 `. {! ~7 M8 c& U6 v( ]0 }: H7 i1 T# v# I
clas_s AdminController{0 m5 }" L3 h, r0 z6 R0 K( w4 k
        public functio_n __construct(){
$ z8 R8 e5 x; ~' A                echo __METHOD__,'<br/>';
8 \9 ?5 ^, M/ b8 L, F: M1 X0 F    }& C$ m. g0 G' ~6 ~& h2 Y
}% t8 ^$ L5 n; y8 o% g
----------------------------------------------------------------------------; L" e" @6 ^- a5 `* I3 g

* I) U7 r0 b( S" G4.引入空间成员:
+ c! i$ j: l9 K$ A* k0 K. C/ L' c. S7 S% j) ]/ B$ O: L7 P
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
! T, ~% T: O4 t" _6 `$ [4 F2 Y. u+ P) c  M9 O0 \
----------------------------------------------------------------------------
. r, I" S8 J5 X. Z- x4 x  g. ~6 B' R" y7 N
04inc.php  u3 A; Y( \" c* h) h
<php
9 X: t' j4 ?9 Nnamespoc_e Core;
0 h% q/ j: n  ]6 ^+ a  g  B0 Guse Admin\Controller as con;" T9 t7 B" ~2 B( F0 z

/ g' ]9 Z5 x5 P" S6 Q/ M( Minclude '05ou.php';; F7 {- c5 @" c4 @% w

7 v3 _+ Y2 A3 k9 w* E* x" g! Tnew con\AdminController();
+ E2 f' X7 Z9 B/ s----------------------------------------------------------------------------2 a! L* P) D" D3 @9 u( R! S
05ou.php
' m5 D$ z! y$ ]: l' q<php
9 ?* f* p9 m: M) P) k8 K4 `& knamespoc_e Admin\Controller;
, _% R# r# t9 B; ^
% M, Y( M" v% J8 F1 fclas_s AdminController{% G9 b8 F# ^8 N/ j
    public functio_n __construct(){6 T* ?% D- R4 |- d% r) e4 f* h
        echo __METHOD__,'<br/>';4 \# U; n+ _+ n7 \4 Y
    }
8 l0 I6 @* V3 u7 q}
: y# W# K6 k6 q1 z3 [----------------------------------------------------------------------------/ n$ |- z% B& u+ G- z. I" {- Z; M
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。8 D4 E: ~$ c  b3 O$ c  a6 G
& m9 T) d; ^# v; I" W$ h
----------------------------------------------------------------------------
' D) @4 }8 G" y* y+ Z2 s5 ~" n7 P0 M. \4 ^, z& h" J
04inc.php
7 T% ]+ U; O7 ?<php3 E; g6 o. M9 l5 V
//引入空间成员类
2 e! H8 w% G5 w
8 z8 L) d% l/ S$ g8 }+ c; R9 ^namespoc_e Core;$ t0 ]/ Y* H5 @; @/ ^% `+ e
use Admin\Controller\AdminController;
% e" k$ \" m9 Qinclude '05ou.php';! v3 n) T6 A5 b6 d) m6 d( h
  |: R* x+ @) |' N4 O
new AdminController();
+ [% Z1 v, |4 z) _# _: ?* t- n----------------------------------------------------------------------------
! |: x6 b- t* R" I4 i05ou.php" P: u, K+ D8 y9 d% h
<php
( z0 s9 y) D1 q* s# cnamespoc_e Admin\Controller;
; G/ U; Q" W0 n) k' |5 L
3 B1 q" e4 H5 s1 Nclas_s AdminController{
# l' O0 J3 Y+ T& m    public functio_n __construct(){$ g4 t0 K9 y5 Z' n
        echo __METHOD__,'<br/>';
+ r( I- G3 o7 @2 \    }, ^# ^  I" U- y" ^" s( p6 ]+ F6 z
}
5 c( i# |2 a6 J2 A+ I" F) W$ y" M3 A----------------------------------------------------------------------------
, x! E: _# ], u% g5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
) R  D% j' Y" `( T2 d' g! o( X1 z5 v) P" g: P9 ]9 l+ q- N5 _" N8 ~# @

$ l3 `9 O& U4 r这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
, U( E' s* h& l  l0 A0 r! S5 `! r2 ?4 V. h% T0 U+ i8 W  z+ g

; E4 }8 p( t" Y; T; y" I2 G! \5 d$ b) O

& h$ k: Q* ]2 ~! ^5 {& a; {8 Q8 ]( b, s
) R; Q, C5 u! L* g% Y1 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-27 21:29 , Processed in 0.132483 second(s), 25 queries .

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