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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
+ Q- g' ~, G' V$ d9 O; j' d3 w' k- u; {
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
% {0 F* U+ I' N( k+ }) F: r* e, u, e2 _/ s- B
20181201105307520[3].png 1 F, X. v4 J- }) U/ t

8 l" w' C/ w3 q我们来详细的讲解一下PHP中的命名空间:7 M# i- {% S' o0 \5 g5 D/ a: j

4 {$ @; g& V' o% f8 @1 r语法:namespac_e 空间名\空间名;
) y+ f: d  n! y6 _% x2 G
1 B8 x  p! s5 }2 x说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
2 h2 a6 a4 Q8 O8 L0 t  T  _
" h, ], x3 d* w7 F----------------------------------------------------------------------------
/ Q, B3 B! O/ w9 C. ?
2 O1 _+ |2 V6 ]. a<php' ~# Z% o( Q, L( T

$ H+ J9 d6 I! l- B4 ~; mnamespoc_e AA;
) c. d8 J  j- F: A4 k# s# D- |* s% `8 Pfunctio_n showInfo(){# s4 V9 @. k( p) U7 z. J- X
    echo __METHOD__,'<br/>';; d( C5 K2 q2 R. x, a* b
}
8 z, g) \& _9 X# ?showinfo();4 Z; G7 V( X( I3 b. y( W
0 S" |7 L, W  K. ~
namespoc_e AA\BB;
* W5 j! D' l/ s8 W/ [" _- J5 N9 D" A  }2 l4 y0 A, s
functio_n showInfo(){
# Q' c  w& d) R5 R    echo __METHOD__,'<br/>';" L3 w, L* x' d. U& |/ O4 h
}
; a. p7 j3 m+ v6 N; Z, B//showInfo();1 y, q, A  R. Z# Z- M
----------------------------------------------------------------------------. }, S) G$ V& x
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
" R1 w  X9 X' L* s/ c
) r/ c: ]8 o* f# ~* e- s3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。# q* t- {$ s- d" i6 F( ?9 I9 L( U
3 Y3 x% y$ \3 j
----------------------------------------------------------------------------$ O0 g' }7 \! @  }- T
( G' y3 A6 s/ F  F. J
<php. v* r. E6 ~/ ^- t% z# p
namespoc_e AA\BB;) m7 {, X, ?) e0 @4 m
functio_n showInfo(){
7 S" ?7 v7 |. x% g& W! c0 f4 K    echo __METHOD__,'<br/>';' e- M0 y$ m) J. }& P
}, e% S$ ]  i/ J& [
namespoc_e CC;
% `& ^2 a& ]1 R: s3 vfunctio_n showInfo(){
4 O  s; L9 T' m+ x9 I7 D, n9 N7 i    echo __METHOD__,'<br/>';/ P# _3 K% t/ z2 E5 v
}
3 l5 F$ a6 X. O' Pnamespoc_e AA;
% r+ N  \+ A+ rfunctio_n showInfo(){
. Q# j  D1 i# S2 E: ~+ s0 h8 q    echo __METHOD__,'<br/>';+ o8 i4 A. n5 V) x# d4 r* P
}+ H, p6 f% N' y5 u# h
//非限定访问:用于访问当前空间中的成员
) Y1 x4 q0 `" f! f( z4 sshowInfo();0 `  t0 P( p" x
//限定访问:只能访问当前所在的空间的子空间中的成员/ X8 I* Z; ~% w( ]
BB\showInfo();+ \3 P. p+ s( `
//完全限定:可以访问其它所有的空间的成员' S% X! F1 V1 E3 H
\CC\showInfo();, \- i7 [: ]  _5 z* p1 D
↑根空间标识符
1 x7 o# l6 j1 `* O----------------------------------------------------------------------------2 }/ \. W- l5 R# N
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:4 _( l. Z/ x- Y: z$ E

! k: x( I/ I  f/ Y当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)1 Z% {0 q% B- ]0 P5 x6 R

  Z( _2 n) V* G代码示例如下:- Y8 m5 X7 o  K  b
" E# J& g' B; `* G& \
----------------------------------------------------------------------------
9 |2 W$ z) \# v  H" |( g
/ J1 v" A* O& q2 n5 a1 u# m% Q, J8 O3 j. ?- d
04inc.php  B' d/ y: A- _( Q% e
<php
4 U# X# M7 a5 p& i6 _+ I! d
9 I. `8 t2 N! A) r% r6 M/ n, R5 jnamespoc_e Core;
2 \1 I2 m, d3 C' Cinclude '05ou.php';
" r" A5 u' A9 d; }# Onew \AdminController();
4 |: j& O: G9 h. G! GshowInfo();
; S& O0 p" S6 X. T" S* W# x
  ?2 ^4 _- b8 ~' y6 {6 v, qecho P;5 ]' Y6 W' ~! q5 q6 A
//根空间中的成员,只要类的访问必须加‘/’- P5 ~" K( k$ o. X1 v
----------------------------------------------------------------------------
) \9 t. d0 \/ O2 t% l% |, t' E2 f- u. `2 U) C. }
05ou.php
) E- k$ e7 C. u& O- g<php
' c" f) q+ J; T# j5 k- wconst P=5;2 }% ~- j* \* E) {

3 [: N2 N4 ~' }, P9 |: ufunctio_n showinfo(){, C+ O& G  e  k+ x* h
    echo __METHOD__,'<br/>';$ `! m$ y, t6 D- s- O7 T  u
}3 k3 b0 B( m. y) p3 u0 m) x

) n9 w8 d7 s# V- K& s4 uclas_s AdminController{3 N$ |- q" k( ?) N! n: S* m
    public functio_n __construct(){
2 F2 u& j# c$ c( G' [1 ~* n        echo __METHOD__,'<br/>';
/ R2 w, n9 J& I    }
+ r. L  D5 q: y% C, F' `}, {, C7 Q: Z: A6 O! @. k, k

- d! }& k" o: |第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。; J  |. v+ N: G$ w! q7 @
----------------------------------------------------------------------------
3 A+ r* b/ m4 I, f' h04inc.php! {2 T" R; }" o1 Z6 p, K
<php
" ^$ y9 w- G7 p4 B& o# d4 {7 E% z+ `
1 X$ x2 I$ \+ O! Vnamespoc_e Core;# a" T4 N+ A2 @* o. t; c
include '05ou.php';% G  G9 u! r, Q9 h, K% C
functio_n showinfo(){
/ _4 _* V7 z. i- D    echo __METHOD__,'<br/>';. P/ J& ?+ b( `; V. ^
}, z8 p) f6 {+ w. h+ ~
; q, D( b7 g: p9 s8 p
new \Controller\AdminController;
: _' y5 A2 {* y----------------------------------------------------------------------------- {; E0 x3 x6 C8 A+ O' L8 a
05ou.php/ r1 b+ t, h1 }) d/ y: a
<php+ V; M  C6 u5 o$ A
namespoc_e Controller;8 t: A7 O/ B* w) Q5 }5 Z( g

' M6 k$ d$ h) }! v& z5 T' jclas_s AdminController{
1 J5 {: A( b4 k7 r" T* d        public functio_n __construct(){
% w3 j* A1 ^, f                echo __METHOD__,'<br/>';2 o, G: Y$ j6 I
    }0 E! I1 m8 {4 x6 T
}
% P6 I  m9 @* U( z6 ?----------------------------------------------------------------------------/ Q2 Z0 m+ L$ `! ^. M: M

9 F1 ?# T0 \2 P0 a) f8 h4.引入空间成员:
! X7 w% w1 a3 x6 k/ m, l6 \
9 r( G9 `5 f0 R5 z  @) {1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。3 _! B- ]0 }; q4 W
! E, T* W+ w  }# Q! [
----------------------------------------------------------------------------
# [- _8 Z* k8 l0 T: f
! h! Y1 W; j- u4 ~% a+ \04inc.php  C7 ^7 h6 |& ~, f0 E) ]
<php
7 }  I( z2 T% x- fnamespoc_e Core;" C/ S- J7 ~2 y& X  _- p# k
use Admin\Controller as con;
+ t' V  B8 K- f6 y, c! y- h& z8 p! ?/ O
include '05ou.php';1 j+ ~6 [# V: R2 G0 @. O' w4 e
. l/ \0 r2 h7 Q4 E7 R. P) I" H
new con\AdminController();. @$ S3 K! `* w  m5 j7 j- D' S( h
----------------------------------------------------------------------------
' F6 U7 S. v, u9 i' ~05ou.php
" R; j, \( {3 r5 [7 s4 A' ]<php: @9 K% ^: n3 `% z
namespoc_e Admin\Controller;: g. b8 L" W& e9 x

# J8 {! P8 R5 J( Xclas_s AdminController{0 l  `3 D8 G% g; O% A
    public functio_n __construct(){7 U) O9 }& P7 k8 _4 C8 a4 l* Z1 Q
        echo __METHOD__,'<br/>';
/ g, ]; p3 Y. D! \7 m6 u, N8 K  w    }
" X) y3 ^0 u, k2 V9 a! i}
: J+ i& S9 x2 P% v5 Y2 R* |----------------------------------------------------------------------------
" g8 Q' Z# y" f9 e% ^  n* V8 D2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。2 b- J; z: Z$ }0 j) M
( ~) @0 B# @; d
----------------------------------------------------------------------------
6 u; n3 \9 D) y& w% U. i# s
5 l! }# d; _) G9 I04inc.php9 w* ~( K' \6 s/ ]6 ~8 J
<php
! z. r7 @/ {' ?9 W6 e! I//引入空间成员类
6 b% u: Z9 k* @. B
5 H$ o; f/ l& }6 r6 @! A* H  s# _namespoc_e Core;5 t1 l- w& {3 |* Z- H# q* z9 c2 r
use Admin\Controller\AdminController;
% f( U# ?! H, \2 G2 o. [& kinclude '05ou.php';& @* h  e) ]- c- I
8 E. O3 ~  G4 K/ d/ R
new AdminController();
, \3 X) t: G. A2 t( ]9 e----------------------------------------------------------------------------, M0 K6 P! `8 F; Y0 X, T
05ou.php( W/ Z  @1 A  v1 A( L5 i
<php2 j; _4 T1 W/ P4 |% m
namespoc_e Admin\Controller;% ?! e, K4 d* d) `( B+ A+ n
" s1 _' g$ M, Y! {7 W: h' K
clas_s AdminController{/ ?3 U, d  ~9 T/ N
    public functio_n __construct(){
8 Y$ H5 j2 W5 N  `( Y        echo __METHOD__,'<br/>';
  S. r: o( M+ K+ L    }
  K# Q0 V; E8 v}
1 e# U7 l8 `! E7 M) E0 i$ f----------------------------------------------------------------------------
3 a) w/ a9 ^6 F3 S/ f$ M5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。" O0 s+ g$ q7 M# f. N# A- I
% T7 D( G+ k2 o

- p* w5 [8 ~' y+ \2 y/ K. i这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
8 |; U- n& U6 @7 S, z( v6 X* E& U) o& t
+ t0 h( o9 t3 j4 Z( X

! F3 ?* \2 q2 B0 @4 K- Y3 \+ U6 e

/ g* A- b1 a$ z( k% n2 z. B0 ^2 y: _% [& E- F1 P  s* u, V! H

最新评论

GMT+8, 2025-1-13 05:19 , Processed in 0.114028 second(s), 23 queries .

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