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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

php中命名空间(namespace)的作用和使用

发布者: admin | 发布时间: 2020-7-1 23:13| 查看数: 910| 评论数: 0|帖子模式

1.命名空间的作用:
4 y4 S2 X; z* ?* G7 V4 o, w* U! S& S7 P* Y
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
3 @3 G2 `3 J, h' b5 W: r6 D
  _' p* J- Z3 l9 {+ G+ W 20181201105307520[3].png
( {( F, L( n9 e, l1 L9 E" a4 Z  z  Q& R$ j% j
我们来详细的讲解一下PHP中的命名空间:" f5 ]3 c% n: _( r6 Z- X
) S  |" U! J, G; ^* N# q. A
语法:namespac_e 空间名\空间名;
% s& ^6 p& `, m  d  X3 {8 ^; f* p
. y1 S7 P4 b$ Z$ J+ m说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- S0 I: B4 F+ ]) E' b5 p! u- R
$ v$ ]8 p$ S$ X& X. a: r
----------------------------------------------------------------------------+ h. {% T' x; R( f

$ d& d; c7 G& G; N# S# A4 W<php! j7 e' h. Y* y% x, ?; t1 `" |
& ~- o$ S# p  T4 }; X
namespoc_e AA;# Y) K5 d1 W6 i8 U& J( F
functio_n showInfo(){
  ~' O; N" k; S* c' W/ @    echo __METHOD__,'<br/>';  X4 ~6 H# e0 o% T/ k+ N$ \' K1 ^, e
}/ w! Q3 x9 z& J/ o7 N
showinfo();
2 q5 Q1 ~0 F. ~  k8 \/ C  m
: `2 ]1 i1 N$ T7 F* |$ \8 ^namespoc_e AA\BB;
/ s8 Q: w  z5 h+ P3 ^
# I! q4 e# X, m4 ^functio_n showInfo(){  [2 O$ K* q3 A4 c( C, K/ q  T# x
    echo __METHOD__,'<br/>';
& J8 `. {5 H) C2 K6 q}4 ~- N9 o' t# h' v- J$ B
//showInfo();7 C$ g$ j6 C: I
----------------------------------------------------------------------------" Q2 Z( C/ d! ~
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
+ h3 ]" w  X4 y$ a, Z9 N4 `
2 k% c3 e) [' H6 P8 l4 ]- c7 I3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
8 t/ @5 U! s9 `/ W( }; ]6 R) y2 N" @
* _& ^, i  F; d2 _3 [, j----------------------------------------------------------------------------$ C2 \/ j6 i+ j4 x% M& J. O

! E3 Q' ^- L/ n# z5 q<php
6 p: a, T) J  }+ r, y! Q9 Y; }namespoc_e AA\BB;
; X# m: I; m2 r. S5 S) g% Gfunctio_n showInfo(){$ Y/ i0 s; t$ X
    echo __METHOD__,'<br/>';3 V' _6 q4 W7 q! o
}
6 Q- \6 i0 ^' \/ Lnamespoc_e CC;/ Z: C" S5 t3 w  m& s
functio_n showInfo(){( \4 r# P8 O4 Q- W" D! |4 H
    echo __METHOD__,'<br/>';
4 R1 y. B; b- S8 \4 Z* {0 I  A}1 R4 H) r, X8 I2 X/ P6 \: V
namespoc_e AA;
; [1 N2 }' o  h& P$ Pfunctio_n showInfo(){
' y) n( m3 R5 D    echo __METHOD__,'<br/>';( }5 V( j/ v/ G2 |4 o
}
- u3 s' b) ~' D/ X* B0 U//非限定访问:用于访问当前空间中的成员
5 |* r3 V( x; k1 ?: o# P( D0 W3 RshowInfo();: w/ x5 i! E& z: x( c; Y
//限定访问:只能访问当前所在的空间的子空间中的成员! U+ `4 [1 K9 T+ N' l- b
BB\showInfo();
& x: R: O  U; G7 J0 Q6 W//完全限定:可以访问其它所有的空间的成员0 D% i3 n8 W' Y9 M% B: @
\CC\showInfo();5 ^# p; Y# P: G$ ]2 M* t" S. u
↑根空间标识符
- t% d5 G# O; g4 F/ x----------------------------------------------------------------------------
# P) y! G. L. {但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:5 V( y3 I; V, W- P* |1 y5 H( J
( ^0 A, @7 k1 s2 G
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)! e$ s' Z- v+ w, v( X) G! R! o, ]) S
/ V$ H0 ]0 f% C6 Q* m
代码示例如下:5 k6 J2 m- e! e# B5 j! y. _" O. @8 O
7 X  y6 m% ~  o: f) n7 X
----------------------------------------------------------------------------
  P0 s2 L  Q  {2 m& P2 l6 Y* r
/ ]8 B6 ^* g  D* @. d7 q
" O& R9 ?" ~* x. e04inc.php
: [/ o3 o/ l" t<php$ Y2 P+ ^8 _/ M" F1 h) W6 g# |

- Q& o' `9 G8 Pnamespoc_e Core;
& h; y: Z4 a$ A. @  F/ V$ Z6 e' sinclude '05ou.php';1 u5 X; a# m% f1 E) R- Y
new \AdminController();
8 r2 u5 k" |  q+ E! H# a  ~: GshowInfo();
3 I' [+ q4 c: F3 Z- o
6 _- H" {! N* u' Pecho P;
0 l/ k; R& `  T  j% }//根空间中的成员,只要类的访问必须加‘/’
9 L$ }& ^/ i' B" h, ~----------------------------------------------------------------------------
8 J% R8 K) m3 c  O3 N+ {5 i# G1 @7 Y9 O
05ou.php$ @9 j/ Z- g) r) |9 o/ i
<php; f: T% z0 e  l  |, |; Y+ C
const P=5;/ I! ?& k% L* ~) c$ Y4 S
2 E+ ]( L5 k2 \
functio_n showinfo(){
  @: }6 M& |" f$ ^7 [    echo __METHOD__,'<br/>';# I" s3 \% k* f9 Q3 k
}$ V3 H0 x+ Z1 F+ ^8 b' K

' k' d) g8 z. j! T/ ]clas_s AdminController{
1 O8 y( v' \) ^$ B/ F2 H    public functio_n __construct(){
- b" D# C! G" G# D' C) E        echo __METHOD__,'<br/>';/ p. J. [- D/ X. [% ]
    }; S  z$ l1 o1 O# j- r- r
}
$ H! f  T$ R# d( a8 \% o$ U0 H6 H! j  @: M- l& ?# u5 r" A
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
$ t1 d3 l# l3 C/ S----------------------------------------------------------------------------# K* q) P5 H( W. T
04inc.php: I: Q- N8 W% H( P' r' d
<php* [7 _0 a; u! @
: f/ N% x/ u' S: m6 F2 J
namespoc_e Core;, n0 z8 u4 i" k" a
include '05ou.php';
7 N" L- O1 r' Pfunctio_n showinfo(){6 E8 k4 ^) N. C4 u
    echo __METHOD__,'<br/>';
' u8 m3 n/ C8 C2 ]2 r}
5 ?6 F& x- U% x, ]- y$ h; \0 X
( u( l# M. J( H6 p& ?! unew \Controller\AdminController;! [* K+ A+ L' Z
----------------------------------------------------------------------------) ~' ]. X' K" A$ Q: b' x9 S3 R
05ou.php( b0 z7 K4 ]  }5 `1 b- n2 y
<php' n$ l1 e- ]8 H+ e* A) Q* g6 C
namespoc_e Controller;# T( Y2 }7 H  @

- ]5 i, ]! h/ i! @0 fclas_s AdminController{
( E2 V/ e0 v* y. K3 t* F$ a% v        public functio_n __construct(){$ {' R- F% I+ |
                echo __METHOD__,'<br/>';' r  T) b0 v0 m9 O! D
    }/ f6 f' \# T7 ~* e( G
}
# N2 f  a- C6 b$ T: k! L----------------------------------------------------------------------------
' p! [) N/ _- W+ p
! F# [0 |4 V3 l$ r4.引入空间成员:
2 I( h4 i, E" o2 t! l  [; F; f" w
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。* @' o  b0 @% v0 f) A( ]
/ z: G7 i0 [1 n; j, w6 d
----------------------------------------------------------------------------! ~# s# N8 I$ H, M% W7 p5 J7 C) o
$ [7 Q% J- Y9 P; @
04inc.php
- g1 J7 @# w! v<php4 {8 [) ^+ [3 q5 t) q7 k' u
namespoc_e Core;) D3 t- g# `" y  r! e
use Admin\Controller as con;
8 Z2 M/ k9 `' e+ W3 N+ A) D$ T  n6 E, F: [( _7 n3 u
include '05ou.php';- ], @3 o' V  F$ }" A" M
2 ^% |7 c3 P# Z
new con\AdminController();
# |7 l8 T! j/ w( b----------------------------------------------------------------------------1 ?. u2 t% O) G1 C
05ou.php
" V/ d$ t2 x. W<php
( y( n- [! c7 p; c6 ]! w. x4 v! `  y7 snamespoc_e Admin\Controller;
" B+ A2 Y/ q$ o' T( J  ?/ x
- A0 u' q3 U0 P9 h" x' |' xclas_s AdminController{9 o- @/ |1 d! H: w
    public functio_n __construct(){
6 H! E0 b4 Z# e3 r2 z        echo __METHOD__,'<br/>';. a6 [) W( W' l
    }
/ c+ {( Q6 ^" g8 b}* ~' j2 j, i6 ~( d  }
----------------------------------------------------------------------------8 B- }- L1 u+ N8 L$ U8 \- B( d
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
: d* p* c7 C5 u! L0 s7 l
5 ]9 _3 x& s, I----------------------------------------------------------------------------8 {: T; B4 L+ T+ C& L- g6 Y
: a: d& O6 P6 p6 l' w# \7 V, b5 E
04inc.php: e2 j+ U( d, m8 @1 B8 S# k7 ^
<php+ k0 e* P+ d- K; W8 K* X0 k$ Q: [
//引入空间成员类
; ]: j; {& O+ C4 c! A) P3 k# F0 l% v; H6 F. B9 ^
namespoc_e Core;
- @- N" i; S! D& ~use Admin\Controller\AdminController;
' n8 }& q5 n9 winclude '05ou.php';9 F# Y) c2 m% S. z+ C- E! \& S
$ p4 W3 \; }$ b5 Y' M' A
new AdminController();/ g; s0 w, @$ j4 G% ~6 a) }9 w2 F6 S
----------------------------------------------------------------------------
. ^( Z2 ?( P: J5 w3 d3 Q05ou.php$ o; R5 B; N/ P
<php$ }7 S9 a( m3 l( w6 T- M
namespoc_e Admin\Controller;
# H& z% {5 z' `4 h0 g8 N  K+ O/ w+ C
clas_s AdminController{
1 G  b" ]1 W% }2 u9 j    public functio_n __construct(){% b: `6 d' A9 x/ H( n& A( L; g9 G! c
        echo __METHOD__,'<br/>';
! Y( s6 C. q6 b& `  e    }- l6 Q2 I8 K; e  g1 M# ~/ j
}2 I5 s8 A- c6 G6 `. m9 D- b/ [
----------------------------------------------------------------------------6 u4 A( N6 P, V* `% c
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
" K7 D" h/ \4 A. h* v! l% e: j8 O6 k6 ^* C
# n2 @6 r* i" [8 ?4 ~  R+ ?: S
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
& G) |$ q/ X2 b/ h0 ~1 a( l3 U5 k) s$ t7 T

# q3 r6 t+ T5 {8 P/ W6 _1 m$ J, e$ ^: |7 g; D2 z' u
0 n+ s2 E. s! C" Y6 q) D
8 m6 N+ A& g' Y
! G5 h5 q, |1 t1 b9 L% D, ^; I$ v

最新评论

GMT+8, 2021-5-6 13:47 , Processed in 0.180158 second(s), 25 queries .

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