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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9702|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:* p7 c: [$ Y7 |7 r7 l
' u/ v, X+ C' T* h
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
4 A: z4 m6 c! F% J7 }- K( n* G5 Z
7 Z, v  K+ F7 C$ o2 o$ [  m 20181201105307520[3].png
7 I5 ^9 L& N! u' a) S, V; J1 U$ _4 U8 c( |/ y2 X+ c/ J
我们来详细的讲解一下PHP中的命名空间:
; w3 ^0 J$ t- Z! m: j; _- _. t; y# ]& s$ L: J% H# s' @
语法:namespac_e 空间名\空间名;
4 L4 ^& N( D! f9 u0 N* \$ O# V( _6 I! [! P1 L& _
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:5 z4 {7 `% z, A( m
, f* U( b! f* \3 M5 ^1 E" a0 k
----------------------------------------------------------------------------
$ I5 o5 L% j) X# ?8 Z. h/ _. A* T1 |0 ]$ U0 s
<php
9 g1 M+ A1 j% F, @' L1 ~0 [$ ^2 S1 J8 x- O) U3 i
namespoc_e AA;3 g1 P0 u; |. P9 m
functio_n showInfo(){0 f1 a0 o- j" Y  M  D) Q- [
    echo __METHOD__,'<br/>';
+ l% i7 t1 M/ V- u* c/ s}
+ d3 d; G& P0 b9 w9 b% e/ |2 T. Sshowinfo();1 I" _& ^6 [5 N# Y

" v" w  T& Y/ j; P2 hnamespoc_e AA\BB;" R  @, `  u! I5 Y, A/ Y

: A3 ]  O; j5 Y: y1 m2 I% J5 h, Ifunctio_n showInfo(){
5 O- l  w( N+ j, _4 F0 p    echo __METHOD__,'<br/>';) s8 j9 z; k# y1 {
}5 J* d) z( J* Q5 t* F
//showInfo();1 M& P, o3 K3 E5 D$ G8 \/ \5 R7 _
----------------------------------------------------------------------------
" F9 Y' ]/ L& N6 X- I# X6 C2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
/ t$ L0 ]0 C; M8 Y* H+ W  x& K) v& W
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
$ m1 A7 M; l3 W  m' n7 G
& Y1 J9 H+ c# [- w----------------------------------------------------------------------------
0 {3 R7 U) |4 T9 o% \# u. k( a  T' S1 K6 m3 Q
<php
: s6 e. x( L' D) N6 c- ~namespoc_e AA\BB;7 ?. Q3 b# A6 c  |$ O  b% c9 p
functio_n showInfo(){
7 E9 e+ K4 e( M  f    echo __METHOD__,'<br/>';5 Y- z3 p6 e( i1 P  j) n- K
}
  J$ r. k1 j; Q8 Nnamespoc_e CC;
2 h' n# m5 {5 b! m) T4 Gfunctio_n showInfo(){' E0 M: z9 H; T" w5 ^
    echo __METHOD__,'<br/>';
3 ^2 R; j6 y8 V* I! V: P}' p8 d" x; S0 w. ~: T" b" _
namespoc_e AA;
) p- ^: O& l+ |: H. x0 }$ lfunctio_n showInfo(){
3 h9 s( E2 A* y  s/ m3 Z    echo __METHOD__,'<br/>';
/ J$ E1 f+ I: f; N$ }# {# }9 M% d/ H}
* z9 I4 t# o7 D9 G0 p# l//非限定访问:用于访问当前空间中的成员
5 @. M$ F$ z! K4 SshowInfo();
$ d7 @# }$ ~$ r2 A* n  V8 s2 q//限定访问:只能访问当前所在的空间的子空间中的成员* m0 N. X' c5 w" V0 H/ O
BB\showInfo();4 I. X0 _& I4 {: k* s5 A
//完全限定:可以访问其它所有的空间的成员; w% k( D' O2 }- d7 `4 U9 A
\CC\showInfo();9 y- ?5 W1 z& x% x8 A
↑根空间标识符& o' h7 ^" p8 c5 [7 w3 \0 Y6 E
----------------------------------------------------------------------------# k9 I% f2 e. v9 W
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:, {, z, ?2 B; |0 c, W2 {7 y
( ]1 L; S  q4 ?/ [2 h
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
/ W0 s3 d6 O0 g
# Y! z7 [) C8 p$ z' W+ z代码示例如下:+ P/ N: f% ~6 e# U
' Q8 }+ F1 P  M* W
----------------------------------------------------------------------------
& v4 e7 Y8 ^4 x
& C+ i9 n. V. B8 C! P8 h0 j  q7 i9 y! \
04inc.php
4 ~* \( o+ K' ]0 S0 d<php
  G1 f3 A  X4 @% y- f/ @8 t! q4 u5 L3 r0 x
namespoc_e Core;9 ?4 V' f" d3 n1 p
include '05ou.php';' Y( u6 x2 b( k/ b% Y) s1 D
new \AdminController();* K/ f0 g- s1 i7 u, x. m6 f
showInfo();; E  `" Y7 ^! T3 a0 w

5 X# h) [  u3 ]" s2 u  ^9 B3 Xecho P;
7 A6 l- Q1 |5 s% W6 H* {//根空间中的成员,只要类的访问必须加‘/’
1 c/ j. b1 n5 X% m0 p8 U& Q----------------------------------------------------------------------------
& u1 x# I# L- g( S4 O/ |) M
" L2 \$ f# {  u5 b  Y0 ^+ D05ou.php! s! g  i: c' x% c: g
<php" _8 ~% W  M) Q7 o! G+ H9 h* T2 C
const P=5;
: f8 F" z7 ~/ T' y; j! H9 x
) j, W+ f, k0 _3 g/ E; Tfunctio_n showinfo(){" ~5 s/ a7 B( y* ?( J+ B
    echo __METHOD__,'<br/>';" l0 H& m& `+ T8 G' i
}  q3 F& F3 j% c! h! I

  u% E! A, D! Z2 Z5 l& \( |% Wclas_s AdminController{
# K* S+ h! m4 r; {6 _    public functio_n __construct(){
- c2 f+ C5 K3 N  b8 ]        echo __METHOD__,'<br/>';
1 a% [2 }* y8 W4 o$ V5 n! P    }
/ G  N; r! F3 Q! m3 U* m! S4 K}5 k1 W' {# r3 o

/ W$ B$ N5 j* f" v' t第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
/ L' Q- ~# k: y7 f# c3 R8 Y! s* Q----------------------------------------------------------------------------+ ]- v' E& p4 P  T/ k( |# g
04inc.php; |& j! R& d! V0 p( {/ f& n, a9 V
<php
2 L1 z# v* H. L3 x" _
3 t" \2 k9 ?1 M, _6 h/ e. g0 _namespoc_e Core;5 Y3 M9 R" p' b, |1 Q1 [
include '05ou.php';
' D" V  I6 k! j' K/ dfunctio_n showinfo(){
9 |8 }1 |' L: p, Z    echo __METHOD__,'<br/>';
5 P, ^2 o8 x* z$ c}
! w( z  i2 c1 M( y0 S/ J
3 t$ u4 n. n/ R8 l1 j) g# H6 rnew \Controller\AdminController;
: s# j) A& g9 f1 G9 M* t0 G----------------------------------------------------------------------------: ^9 x+ E: c; T/ V) S3 v
05ou.php7 Q% f( n' x+ t9 w8 l" L
<php
' J( q% M  c( `- cnamespoc_e Controller;$ R- z/ e2 u; b, a' M; F- _
9 Y' O: `1 K) I! I4 }( J8 g" I
clas_s AdminController{
$ f$ Q* M* U" `, C8 Q2 h        public functio_n __construct(){  k3 K2 g3 }9 `
                echo __METHOD__,'<br/>';) G. q5 r; i5 a( w2 A+ I/ N
    }
* Z# y7 L( k& v9 k}% ~+ n6 N, U4 A0 I- }2 G" {4 g
----------------------------------------------------------------------------: a$ O& M  `/ [6 O) t, y0 E
& R0 y& k3 z- @7 b- W
4.引入空间成员:
) ]- O( j+ _, }! f! x3 I  M2 \7 L" c% O9 o3 K' e
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
0 u0 c8 L( z+ w: R- D
# Z. A% V! S3 [9 Y----------------------------------------------------------------------------
, l+ F$ F3 n; w% X# M
0 W0 g; g$ e5 A( f/ u& n% p04inc.php
2 e/ `5 `* @+ Q/ G. E+ {<php2 r7 F9 v( D3 m, L$ Y' t( i
namespoc_e Core;
! N8 ]2 \7 F  B8 h! Duse Admin\Controller as con;9 B. D8 E  u# `  {' F
- i: _) D! H* X6 }6 g7 s
include '05ou.php';
7 V( h3 B0 G% l8 z% b7 g* t, F, W0 A* b2 R( q
new con\AdminController();
' z& j1 \8 E$ q+ m% Y----------------------------------------------------------------------------- V- @( v7 G9 z8 Y$ d9 m3 {
05ou.php
7 A) Q) p7 |7 \6 p  a<php
+ ^- w& H8 u. Snamespoc_e Admin\Controller;, l' k" v7 V# l9 p

. p' \, N1 k) W+ _4 _+ _clas_s AdminController{% C8 e& e4 e/ I, `7 ~0 c) s
    public functio_n __construct(){
- o3 u( N8 M/ W4 L8 P$ X        echo __METHOD__,'<br/>';
7 w% y  J% c2 S8 w, |* ^    }: S9 Y4 b7 t$ j) U; _3 V8 N) l8 ^
}
( B# C; i5 @1 v3 K) r6 m4 t----------------------------------------------------------------------------0 g% A$ ~3 x+ J$ I+ y$ i
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
1 Y3 m# B  I1 \/ C* n, Z  w
% }! B) u& ]% u. l2 L----------------------------------------------------------------------------
" f' G6 n5 |" N! _" i) H2 x" `
  r; t( y$ r+ c( ^) F. p04inc.php
2 a) Q" R! e. \2 P* i6 W<php& T* S. w5 X6 ?8 _- x" j: k' U
//引入空间成员类
' M7 U) j; I- |0 h, k& Q  F3 m. a: O$ }6 H* O& `. Y8 H
namespoc_e Core;4 T1 }: J" f2 \  X0 _
use Admin\Controller\AdminController;
8 Z  q/ O/ f- Q6 O" Zinclude '05ou.php';# G- e7 w; x# c8 \1 h* z
$ G9 q2 v* x, g( {7 y8 K  R
new AdminController();; n% E) [% B- e; p
----------------------------------------------------------------------------
  R% m3 @6 d+ `: }05ou.php
8 }3 V0 H& R4 P; a<php
0 r/ j" J7 t+ k) S6 U; Z% |" znamespoc_e Admin\Controller;
) Y3 }( i# }6 ]+ G: i; y6 e, A% |( o1 d- X) \: f
clas_s AdminController{( h5 r3 b+ `0 U
    public functio_n __construct(){. n  E* B3 n3 d7 ~
        echo __METHOD__,'<br/>';! M  E7 a( m0 o
    }
2 ^3 A0 P; p  ^8 A}
$ x$ H# [# T% p, x- k----------------------------------------------------------------------------
$ Y4 w# A$ z- h# ^5 G8 N- \: ?. M5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
1 D7 f0 M2 x2 C
% E1 c5 I& S" I; a" Y% h7 C
  t+ ^% H: c1 S0 X( b1 ~& v8 h这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。5 q: y( v" q/ M1 s; ?

7 D/ B. N* C0 |* v8 {: V7 |# q- |8 [4 v1 y( }# Z- {
! E4 S3 G1 B, n% O6 Y

$ s/ n  a- U( m0 C6 T3 b: V3 A; n% W9 C; d8 M3 x

3 W" o) J5 i. D# n4 a
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-3-28 21:58 , Processed in 0.129476 second(s), 25 queries .

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