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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1926|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:
3 Y% k. g5 ?8 L9 c3 q4 H. o0 Q7 P2 T2 o  `$ h' R
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:+ i6 `9 r+ L  t/ r& C. p) z6 \3 A
- q& o& \( K/ c) p4 l
20181201105307520[3].png 1 {3 X1 {0 R# h! \% S
  ^: |" m  `7 Q) X
我们来详细的讲解一下PHP中的命名空间:
2 A6 ]( n! d2 Y6 ?% L8 I+ W; N# `: N& E. R' I* I; _8 g
语法:namespac_e 空间名\空间名;# {: n' s4 h# ?) {
% A) H- l$ Y4 M1 F
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:! w. Q+ a$ t2 h3 Z  A+ S7 Y% g. E
: \* u- l: _) f# m
----------------------------------------------------------------------------* D# R% l$ [2 q. B

, d  }. G8 M9 k$ [1 S% z<php6 t! t$ h3 ?, Y! i* v2 R

: A& r9 M2 ?" g4 @3 ~% z8 Znamespoc_e AA;4 `+ `* z! D. I- R+ _- c9 p
functio_n showInfo(){8 i% ?1 Y6 z; f3 T
    echo __METHOD__,'<br/>';
0 M" a6 C, l8 b" N0 R+ n# {, R}3 I; U( P! j" J% P
showinfo();- Q9 G% e0 r2 x$ M) W

) n% e0 [3 I' y. [4 m& n* Nnamespoc_e AA\BB;8 P& k7 V4 x. F" w
( \: y7 i% Y. l6 n$ @
functio_n showInfo(){
8 A$ o# y9 q! t  r    echo __METHOD__,'<br/>';. G1 i% Q1 ~9 X! r8 a
}
( p( V0 W, t/ X! T. I* X$ Q//showInfo();4 E) N1 ?8 H* B: |/ Q  M
----------------------------------------------------------------------------  ?; @6 n; @( t' U& V  z
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
2 w* y1 N6 Q9 W- J" L" ]' G6 p
" ?# y$ G" B% C8 V0 Y3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。9 L7 f, N) X8 y- m+ T0 a- L; P

! e; u6 O) X6 P$ ^  ^----------------------------------------------------------------------------4 w# E9 y1 @( C) O" ^
# Y2 z* }1 {" \: P4 E4 Y
<php) H% }4 X( J4 @7 b3 [9 J4 H
namespoc_e AA\BB;
8 y! n. @& w" B8 ~3 T2 ~functio_n showInfo(){5 F9 y# {& u0 |& {6 E( V# f
    echo __METHOD__,'<br/>';8 _/ u0 M/ |" [1 ~5 l, F
}
! c# F3 x) B9 U0 Ynamespoc_e CC;
. D% G/ U2 S( M% b$ C3 nfunctio_n showInfo(){) V0 C' \1 M& [+ d3 y- p
    echo __METHOD__,'<br/>';0 e0 N6 {3 I# P# z
}0 `. p7 V( L7 ^; S+ O  N
namespoc_e AA;
" g. p; u% n! r8 o, H9 q- q# Hfunctio_n showInfo(){+ \* }( N6 y* L7 ^/ Q
    echo __METHOD__,'<br/>';  z0 y3 R0 x+ G/ e9 u
}
# K; [# t) z. ?. D//非限定访问:用于访问当前空间中的成员+ B. M7 @8 a! d$ e
showInfo();
, C! j- C* Y6 L1 V! @, b//限定访问:只能访问当前所在的空间的子空间中的成员
$ ]0 r4 S$ B6 W2 iBB\showInfo();) J4 S5 |# ?- l) ^3 I- k
//完全限定:可以访问其它所有的空间的成员. N, Q# C7 X# n& O3 T! \: L0 o
\CC\showInfo();
2 {6 Z; g( ]9 B↑根空间标识符
  u8 n8 E; ]7 x" }- T----------------------------------------------------------------------------
- t- H( H9 c- y' h# @, s! h但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
2 ]- u1 S+ j/ g0 L1 e. ?) p
5 p- h0 Q5 Y/ {  s当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)4 p* f9 \$ W0 k
. t  k  `9 u( B9 e7 k: s
代码示例如下:& _3 J; O$ h, Q1 Z- j2 [# a

) c. p( W! C4 G3 W/ P$ y6 K+ o; v; t----------------------------------------------------------------------------5 T% u9 D) V% `4 f5 R4 L
+ o8 r4 p5 p6 n  w
" t4 M0 {# m4 a( ~( q3 ]
04inc.php7 ~) ?) F: H, c: C& F2 A3 Y+ J
<php
; j, K  _8 r/ `+ E, P5 p8 k
9 D+ h' R- e. X+ m4 D; Snamespoc_e Core;
; A0 ~1 G) n2 ?( R/ k4 minclude '05ou.php';
4 k6 p# K  L6 y$ D4 Y# v7 Tnew \AdminController();- O# ?) [+ M; @7 Y1 \0 @
showInfo();
  T8 k. ]3 Q0 Y) c3 m/ F: u! ?+ _/ O9 U" k
echo P;, V) t% Y. [# a) L
//根空间中的成员,只要类的访问必须加‘/’
# }9 _4 k; R# e* k' K8 n----------------------------------------------------------------------------
& q" Q  x$ b& ]& P( B! ]* C- ~. {  ~2 p! E
05ou.php
0 O9 f( B/ B! t9 l; P# @) ]<php$ G) Y* j# D5 y% |3 ]8 y' X
const P=5;+ K0 {: J/ b  ^9 J6 I8 f* e
& E6 @7 j# I* n
functio_n showinfo(){
* J3 q! R: ~( [- O! s! r# K$ ]    echo __METHOD__,'<br/>';. Q; v. v. H1 j4 d1 q, |) |
}) A) R+ o- @) [" p: l

/ Q8 E9 P0 a4 aclas_s AdminController{
  k! T" P& Z" h0 J( x( R* p    public functio_n __construct(){- w! B5 T# Z8 c+ C. t
        echo __METHOD__,'<br/>';
, `- e1 F& Q+ w    }
1 D# `- S3 w/ |6 C- P( u}
' i0 P/ i" M( F5 y6 T7 q9 o2 ^3 x" V$ d$ X2 |$ u, ^% |' K7 i1 r+ y
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
% ^6 _% j& I6 \! S7 @! \/ Y- h----------------------------------------------------------------------------
" j: x- t4 e/ b. G7 D( z8 q$ j04inc.php
& T2 ~! ~1 a( U) g2 J. G; m<php
, J; F9 Z' a8 j$ _" p8 }. V
" k& [# o" u7 y1 e8 G5 k/ e( unamespoc_e Core;
: ^! `3 r6 Z$ q' @! }$ P0 b' ^: Finclude '05ou.php';% [9 ]: e9 d* D- z$ H* [
functio_n showinfo(){* G. c  {; x  u, `: {+ d
    echo __METHOD__,'<br/>';
2 T. l) X0 W& L/ e% k) b6 h' y/ S9 Q}
# N- \% U% f+ {0 t1 e- M* w
1 D5 l0 O7 p8 c% K% `+ E% c5 Dnew \Controller\AdminController;
* H( Q  O  C6 A/ O1 s1 n5 d2 Y----------------------------------------------------------------------------
. D: L+ L* A/ Y* w  i: w05ou.php
' q* A! M: w* @% H; Z+ S2 V<php; [! C$ z! [- V' [4 N) b
namespoc_e Controller;2 G) O9 W) N. k$ p
1 G1 T) Z& Y- D: U
clas_s AdminController{
4 g, P! O( }; {# Y" ~% v. k        public functio_n __construct(){
- g; I! C3 d3 z, i- E                echo __METHOD__,'<br/>';
7 S/ X$ q: n  ^6 j    }; v# k7 i$ j* G/ h" M+ F
}8 Q  W4 X: d  K3 q) T
----------------------------------------------------------------------------
( ]  D# u  e  _& C/ @7 h2 M" p- R
* r4 T6 |( @) `4.引入空间成员:
: v5 w7 V6 M9 O* D
$ i  C% F5 B( t- @" I1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
+ v1 j! {/ r- A2 ^8 |
* N4 Q  y# \( k- }----------------------------------------------------------------------------% n; g* U# u0 A* U) Y$ @' {
" @& d/ |0 r1 f3 K9 }
04inc.php
& z" a) d7 {8 [" a5 Z<php$ \7 m* d% c& M- `
namespoc_e Core;
; P5 w9 q% B# j& k# |6 n$ Ause Admin\Controller as con;1 ^0 ~  A% O: j: X
, n% m* l3 Q' v9 K0 N
include '05ou.php';0 G+ m! M; y. _: B1 Z
- y$ C; L; ~& T
new con\AdminController();
5 C+ d6 J  a4 ^4 C  K  u: ^' f----------------------------------------------------------------------------' R5 S+ D7 R$ k' Q. _' x) O4 H/ m
05ou.php
, Y; ~' A# V/ {! A<php
/ k, P* x$ h5 D, a! [; e! x: wnamespoc_e Admin\Controller;
& j! m2 [( I) q% p2 |
* [6 [3 B6 G; bclas_s AdminController{6 {1 w0 I# L% G. O
    public functio_n __construct(){; P) r, X5 z' r  ?8 h
        echo __METHOD__,'<br/>';7 q% g! H7 B  w0 z. \9 X$ I
    }
$ l) O+ r: b7 g2 m* r# O) X7 Q; F}3 E! C. R7 n$ E, o8 A2 J
----------------------------------------------------------------------------
1 b9 J& t9 v! x2 T8 Q5 _0 P2 ^2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。1 L8 ?& |4 O1 ~) Z

" h# H" q( t  I  m: F----------------------------------------------------------------------------
/ ~4 Q$ ^2 B/ b, Y- l. K0 K) R
- V' O: b* M5 T$ n* P04inc.php5 z, Y7 a6 }# c) ]. K  ?' l1 {
<php
1 ]. k) U* b# e//引入空间成员类3 C  p) I0 T/ P; T" W
) F7 M$ w; K$ z1 i4 b5 j9 ?
namespoc_e Core;
2 k. D; O0 F% O! {: Z0 }use Admin\Controller\AdminController;
$ K9 e% S5 `5 v( h3 vinclude '05ou.php';: q; I8 _5 s5 }3 i6 t

6 @! o* J5 i. k5 y3 E, A( rnew AdminController();
2 g( o( e" o, t$ {& [----------------------------------------------------------------------------
' r! k4 N/ J! T0 S05ou.php
' y( e  {! d9 @$ g8 w8 d+ j; l3 I5 L+ N<php$ Z$ Q9 Z& l! \* P, J. e
namespoc_e Admin\Controller;
6 }( \  Q' ^5 X7 L
  r. [6 l0 W8 d/ J6 g! _+ oclas_s AdminController{2 w" n( i) R- @4 U
    public functio_n __construct(){
0 g1 o1 _: D0 {2 l; O. L        echo __METHOD__,'<br/>';$ R. |- P6 b! e, B; W; l
    }; q$ ?2 c* W, I2 R0 r/ U+ n, }
}
3 M) [" i6 k9 \, [8 ^% l( C----------------------------------------------------------------------------
2 B9 z; [8 `: _' s0 v4 k' Q5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。" m% E$ R& w/ @: Z

7 e$ a4 @1 E( g$ f8 J0 ]" Z1 ]( i4 W( Z
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。/ \0 [, i' n& v0 ~6 U* x

$ |& @$ A$ [# S) i) Y* b% w& k) `6 b1 G6 |; r
  v: _. P  R$ h+ r) k7 V1 @

" @# N/ [1 m& Z9 [" B0 A' [: t% C$ K( H0 M& g7 |* ]

4 Y* z  d( }: C% j0 @( h
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2021-9-17 14:16 , Processed in 0.123257 second(s), 23 queries .

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