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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:
5 C2 j' x2 w& E  N  E. W0 v7 R2 a* o0 ~' ^7 j- B# \
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:4 [, a4 a3 ]; x3 _2 _2 n
! h  c* H- r$ q" e& O! d
20181201105307520[3].png 8 q( c( B0 D1 h1 a* i7 Z9 z8 @
5 {% ^2 W6 {, {9 o
我们来详细的讲解一下PHP中的命名空间:
" z% y+ s" o/ O9 J8 {# {* m- _" i; g: g3 J  |; k. L# s' Z
语法:namespac_e 空间名\空间名;9 D2 g- D/ M. Z1 {: \$ R$ ?
" R5 x( k" X  e& F0 T  ?7 l1 p" ^
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- K& E5 a$ j7 A0 B+ T8 g

; K5 c& r9 ~* V; \( S# f' B7 ?----------------------------------------------------------------------------' t* g4 Q7 C. V5 v# v
+ z8 z" {! W$ ?  h( J
<php
/ {& w% `( P, D" v& M) Q2 N$ ]1 E" [; l5 o$ }+ t& G( [
namespoc_e AA;
& m& D& K9 L1 t4 }functio_n showInfo(){
6 T; g" b( d- H4 c/ X5 Y7 A) \& v    echo __METHOD__,'<br/>';
+ q' f! g( i; G' D# H}. v. r8 p2 L+ }. r3 Q& V
showinfo();
$ D2 O! i) J6 J7 Z& a+ N; ^! o" h& ]4 x5 l' V% Y$ _9 [
namespoc_e AA\BB;
' ~+ W) D: R7 S1 C: Q# U/ W, g7 D
functio_n showInfo(){
  F9 Q( c  n- j- J+ D    echo __METHOD__,'<br/>';8 F* A# e7 B+ Q0 @# z( f, L
}
& q- A+ [% i$ Z% _1 b2 N//showInfo();8 h: }2 h& [$ p. u
----------------------------------------------------------------------------. R+ @: A& s- ]( _! L* r( |
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)4 I: L* @) u6 v2 x. D3 [, X9 G  S
% ]: j& c7 u. C1 b
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。: _, ]8 a0 l" Y# _" ]& q6 o) E: S

" L/ C$ C" f$ s% c" a; @----------------------------------------------------------------------------
; ?" L: V1 Y  q) Z3 X
8 ?- u5 y# v/ y8 x$ F# N: h& i<php! R- f" g5 O4 f! L
namespoc_e AA\BB;  W/ S3 k6 e- T% ^3 H5 F
functio_n showInfo(){) F$ A. R* X9 X' X' c  b; r9 W
    echo __METHOD__,'<br/>';
( W) \2 n# {# a. ?# Q}% D8 O1 Z- ~4 u1 X7 ~
namespoc_e CC;( Y! n7 M" t* Q. `2 g
functio_n showInfo(){
& w, O! ~8 ]; X$ V    echo __METHOD__,'<br/>';# L1 A+ i8 E* x1 j. m4 V
}8 f' P: r$ Z$ p  B9 m  u" {) K' k
namespoc_e AA;
% _& D0 x! ~; m6 O6 Q9 ]3 nfunctio_n showInfo(){
% P; ]+ ~6 t& Q- z5 i    echo __METHOD__,'<br/>';$ Q. j* E: d( b
}  ~3 i; i% k1 _4 _5 h
//非限定访问:用于访问当前空间中的成员9 y! z# r' \! {& c$ F
showInfo();. q7 w, }  ~+ l2 I  q6 V
//限定访问:只能访问当前所在的空间的子空间中的成员
; s  P% N+ q# p0 ^- {9 h; I" IBB\showInfo();9 }- G, B1 W: F
//完全限定:可以访问其它所有的空间的成员
, s. P4 U! h: y9 E% V% ]0 X\CC\showInfo();; U4 c8 B& `7 R( G; c
↑根空间标识符" S; G0 O/ U9 E6 D
----------------------------------------------------------------------------
4 q& s5 r8 N) ~4 Z1 S0 e但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:* f$ {9 J1 `9 t9 V7 n. _
0 r" o! j$ u& C! n, W9 d
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间); E. s& ]/ ^% d0 q1 p% E4 M) v- v

4 [& W/ }1 c* f6 l* v( M代码示例如下:
3 X# F2 T0 v" G8 g8 T9 m6 p/ J' n5 Q8 B" ]
----------------------------------------------------------------------------
6 N* S. j0 ~, Y, O2 y# p
) }. Y4 u4 O7 w
, M* s# ]8 K5 D. P; I5 e04inc.php
  W$ x/ J" [! g<php( S4 R: f2 m5 o; F/ V
0 Y7 N" ~& C( P  b+ @0 q1 M
namespoc_e Core;, y* ]' c. k  ~" l6 T
include '05ou.php';
1 @2 S& l. E* Z( enew \AdminController();/ t9 E! T1 r; `& A
showInfo();
6 i% T7 M% n! [' n7 s5 G  i
; f3 F! A8 j/ a3 e1 E4 I0 \% Qecho P;
4 i$ U8 d) X8 n$ Q; V* p//根空间中的成员,只要类的访问必须加‘/’
2 X& Q% P9 @( J+ R' V# a, v----------------------------------------------------------------------------
! x( A2 k& K* h# r: `. a1 W2 ?: J
( Z6 d9 j' \( k0 o( y0 f05ou.php
4 w2 S7 f9 f0 K<php
- I2 {- l0 z" G. z# E6 Econst P=5;) X, R+ D! C# e2 L6 Y+ C4 n( W

8 V; Y$ G. L# c2 s7 gfunctio_n showinfo(){
) F8 S0 B7 [4 {/ Y/ Y3 h0 E& K; D    echo __METHOD__,'<br/>';
$ [# h/ w  |' [% U6 m}. l8 T! |" i5 A! e# m+ R

' m; M$ J; w, W; Q6 V6 E# wclas_s AdminController{
) o2 o) r# ?8 X& G- T2 g' ?    public functio_n __construct(){5 p% h3 S9 j3 a+ n1 |
        echo __METHOD__,'<br/>';
$ j; e6 c; B0 g    }
6 L+ m" R0 y" P8 A. r. h}
/ m6 A, K# ?9 t# M2 f7 R: M  t1 o! Z/ g, G0 O
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。! b$ T2 }: p9 k  N8 D5 O3 O9 J
----------------------------------------------------------------------------
6 c. |. Z+ a/ b0 L# X5 x6 Q: @( q04inc.php
$ x3 u6 W! J# O& J<php
) b: s, Z; D: b: i( A1 |. t0 X" Q( i+ G9 ~2 F$ n' P
namespoc_e Core;' [9 N. U' C1 e$ L5 Q" P* s7 q
include '05ou.php';
$ k* U6 j/ A& }, X$ k1 w  Mfunctio_n showinfo(){
, ?5 C; U6 F7 o8 b    echo __METHOD__,'<br/>';$ O' T# y& r2 O4 |; R
}
4 {$ @% a7 c5 T
9 d$ j" e; |3 c8 v2 k+ }! anew \Controller\AdminController;
2 e5 [' H/ T9 T8 {4 P3 ^4 W. Y----------------------------------------------------------------------------
* H1 N; s% x( t3 v  N05ou.php  z7 D9 n+ Q9 P. k9 T9 t- U, m/ v
<php
9 L; j: s8 B2 y2 }namespoc_e Controller;
5 u- E7 L5 E1 t6 \* E3 [* ^0 g% @: X: T! a# S) r
clas_s AdminController{
* h# X8 s) h! u        public functio_n __construct(){2 P6 D2 E( L4 ~3 |# E
                echo __METHOD__,'<br/>';
/ z3 L( c: @; l4 D    }
% K: A+ t" L# |$ z; E+ {}, l  l$ b! u' y( W# p) n
----------------------------------------------------------------------------4 s* q; X+ c9 A1 Z5 A

) h% z) f* q6 e1 Z+ r4.引入空间成员:2 c* I' H( k* K# ~% ?3 j
! v6 B3 S: r+ B, {& v9 Q1 @' W
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。+ p$ ?2 p; t) @( S/ l

3 M+ q+ w$ ?/ H8 _. G----------------------------------------------------------------------------& x- _* q8 P. K1 @# D* k. v& h- e2 n

1 S% w3 _! P2 G/ g: y8 k5 O1 I) B04inc.php
1 e& n7 d5 @3 ]8 W& ]+ ?<php
7 S( r/ \8 [0 ]  H& Y% W5 vnamespoc_e Core;1 A: O6 \9 q, z% D5 V; K: q: z
use Admin\Controller as con;
+ \8 `: v: C6 g- J1 w+ {! o1 a
include '05ou.php';4 g' m0 f% A4 [3 X2 N% x/ `/ j

' b$ V& k0 i1 w: |9 r* |3 onew con\AdminController();
6 ^, S; F" x; P- p( s----------------------------------------------------------------------------
2 @8 Q1 o& c3 m# Y. F8 R7 f; t* k9 B' ?05ou.php
3 J, v3 m5 T% c6 m<php
( z5 z3 U7 f0 M5 y* B# |7 ^' knamespoc_e Admin\Controller;# `4 Z8 X! F# [- @

+ q& N$ A) J) s' x4 i; rclas_s AdminController{5 |! M5 x* \0 j7 o
    public functio_n __construct(){
$ ?5 B4 M5 d( f3 |* m$ ]        echo __METHOD__,'<br/>';
7 N; x' `$ R, Z8 K4 a( a    }
0 S" k. n& |9 m4 c}
: _  Y* }, G, c; P8 R. z% [: G----------------------------------------------------------------------------
6 K. [. c! K6 c' x" Q2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。* Z  S: M; L1 O8 g5 N
0 S4 w1 z1 l9 F& y& G( K
----------------------------------------------------------------------------2 U; [* y- H6 [. L6 |! m4 f4 R! [; F% l

! o8 H) ]4 u' d7 G* w  l04inc.php
$ C/ w: h. _  j# }' w<php
/ ?# D3 g/ [$ V* f! i9 _2 W//引入空间成员类9 {1 a4 c0 g" W- Q

% |' D3 A' v6 f6 s/ o: ]5 ?) wnamespoc_e Core;
$ z5 f( j2 H( o1 s: c' muse Admin\Controller\AdminController;
. c0 c# r7 n" l7 minclude '05ou.php';
( N; R; T& q* i$ M5 S0 k+ a
- s" X) Y  A7 i. k. Q' o3 D9 ]0 gnew AdminController();
4 k8 O- }- l# s. T6 d----------------------------------------------------------------------------+ b( Q" G/ B3 d9 q* ]8 B  Z7 f
05ou.php( u) h+ C- f* t0 R3 r' }
<php
% l" j/ p4 [: I7 anamespoc_e Admin\Controller;* U  w3 K. {; b- f
5 O/ ]' [' P! y% K3 v
clas_s AdminController{
) f9 v! o9 g7 x8 z( l, p' a0 x: Z    public functio_n __construct(){& {! d6 X, z- \6 y% C) `7 e2 ^5 y
        echo __METHOD__,'<br/>';# _: J& Q$ c; E' h9 M8 v
    }  I" Y% G0 C6 F/ t2 N
}
; G6 ]% j2 e- f6 U----------------------------------------------------------------------------' M; v. Q8 G# t
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。% I- v7 `3 r- f3 S* j9 x# V

8 w  K$ e- {6 T) C/ N' R7 j4 E% _; J. k" J; h! B; {9 g
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
, W/ b3 H/ k' H9 ]5 V
* d. ?& }/ I/ s  _
. }$ p5 a6 }* Q0 W' W
' e) m; c6 V" {9 m' T4 A7 x- @
6 F, a" }/ \) T$ J! a! z4 s; }( a1 q& G" }
. C8 j$ m. E8 m3 M6 L

最新评论

GMT+8, 2024-4-14 16:18 , Processed in 0.116969 second(s), 25 queries .

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