cncml手绘网

标题: php中命名空间(namespace)的作用和使用 [打印本页]

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:
! R9 Y6 l( P# c
3 R1 g/ M4 }! i& _. y. a: s' v1 T7 L9 O在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:: C% w# b3 A+ M: t. I

. ~; ~1 H: ]; ]! Q
, O' x% G3 `& _- l
$ U! z: J3 E; r' j我们来详细的讲解一下PHP中的命名空间:
- ]0 S! T! O6 X  ^0 M+ x! M) z% ?# s3 U
6 _: Z. Z+ T4 r+ }8 y, O  S语法:namespac_e 空间名\空间名;, L( E0 X8 U& B0 X6 c" ?
8 \0 K' f1 O" l% F
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
, a. D6 L7 f* r, s* D  k* ?9 v- R/ t- v
----------------------------------------------------------------------------
) Y" E/ ]; U1 A! j$ B& y6 i( Y/ ]: n+ D$ y( `& h
<php* w9 |" N- G8 {# t7 P5 X6 G

3 W; E; p7 H! V! @4 k- Q- h/ m6 Cnamespoc_e AA;
& b" Q! E2 |0 m3 n; ^: J# jfunctio_n showInfo(){5 r% D9 A, M( t% M; _, a; }
    echo __METHOD__,'<br/>';4 R* ?4 C+ q) ^( @  Q. b: O
}
: S, p8 o2 t/ \8 |' K5 H# O  B& yshowinfo();
$ l% B  h; n4 Z- C  x% r( i; Q7 E+ ?8 |! _; a( q9 b
namespoc_e AA\BB;" Q' b0 ~, \( z1 k8 a

# t6 m* h3 s: C4 w1 e( _functio_n showInfo(){
, J! N0 I; M6 U! N( [. [    echo __METHOD__,'<br/>';( ^8 I2 {, l3 A6 E  u  w
}  x8 o4 j& e( a# F6 E7 l8 c$ \7 A
//showInfo();
+ X5 S2 M+ J* q4 Q----------------------------------------------------------------------------( q- Y# l/ v7 ^
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const), K8 s- n( `9 I

2 t8 A- B8 T  W) H7 @) t3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。5 b! f/ [- ?% o# e- L, ?
3 @- v) ?3 U& m) t2 t
----------------------------------------------------------------------------% l/ I; }  ~1 {# ?8 y
8 h5 U7 S% h8 c+ k. v. q$ k
<php9 d2 S. t/ M9 M( F
namespoc_e AA\BB;8 k+ o7 E3 O( J7 {# o( {/ [
functio_n showInfo(){
2 G* Y) F9 Q; r& r! i9 `    echo __METHOD__,'<br/>';
- ~! F5 A# k4 k0 ]9 x9 t" _}
) |" |( |: y: R& t4 ynamespoc_e CC;7 ]: }; i/ \  F- y1 J% ]
functio_n showInfo(){
& J( k9 C% w& J7 I1 j; f    echo __METHOD__,'<br/>';
2 P% Q5 K$ g) S8 R}+ ^% U5 ]8 ?' A% O
namespoc_e AA;8 N" T) D' J! q7 y$ F5 i+ \; r4 @
functio_n showInfo(){
5 C5 `6 O, \+ z! H$ f    echo __METHOD__,'<br/>';3 U  C8 J! [6 m- r  ?; J% y
}3 [* e  K7 K) C* Y% f$ e! i
//非限定访问:用于访问当前空间中的成员
1 A* ~- m" T) UshowInfo();
8 X8 l) n5 X+ |+ @) q0 K& J. o//限定访问:只能访问当前所在的空间的子空间中的成员
& L1 I2 a, i1 }: t3 x3 }BB\showInfo();
: C. T, X% }" d/ N2 o//完全限定:可以访问其它所有的空间的成员
! T' B8 H5 P9 Z4 d) W$ P! J\CC\showInfo();
+ d5 q; z) p- O5 ~( K↑根空间标识符9 z8 w) L3 ?/ w$ z1 C/ P9 d" \
----------------------------------------------------------------------------* H6 V( f, s8 J, [" N6 L
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
5 S2 `1 t$ l; [6 Z0 D5 e4 h( V
# d! U% m/ N6 }% s" r. v当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)9 C& {+ A2 e" W9 `8 a' k1 @
2 A+ y! \3 _+ N( X
代码示例如下:- O* `+ e6 h1 q$ I/ x" b- {
, z. H' B9 |: V' L
----------------------------------------------------------------------------6 q/ z8 Y# V6 [

2 R$ S  l; a1 p. s5 c8 H2 `- H
9 |! R4 d+ [5 N$ @04inc.php
2 u7 ?% J6 [+ f8 I<php# h7 G% c$ T+ v% A& S5 Z9 L

$ ?3 Q  c1 Y3 I9 [namespoc_e Core;) [$ ?, l# b8 R; s" M
include '05ou.php';
% A. `2 G1 B2 w* ]0 pnew \AdminController();
5 ~& Q; L# Q! X) E  |& sshowInfo();( B) ?3 T" C8 S, G
, C" W. K+ t- G, ^* `
echo P;
. m6 _- K9 u7 [7 c//根空间中的成员,只要类的访问必须加‘/’: h- {/ O+ b7 G" D! B8 [3 s
----------------------------------------------------------------------------) f9 s4 K4 Z) u; V$ f+ F

+ L- k: k2 t, z" w: y+ z! U05ou.php7 |) v: A" q, Y
<php% {* V9 q0 i6 z; F0 d9 h
const P=5;
3 H4 I' x  d# Z* Z+ P9 P  R% g0 [) m; ?' Z& J" j
functio_n showinfo(){
3 B' f' i; P2 f! g    echo __METHOD__,'<br/>';6 S! g) l# x: F6 _2 O; T' H
}
9 F- P* f) J0 v
. \: Z3 ]0 ^' P* aclas_s AdminController{9 f2 A$ ?1 \1 T' ]1 d9 p' E6 X
    public functio_n __construct(){/ b& @1 N2 P* Z
        echo __METHOD__,'<br/>';0 p9 Q- I# j, N( a8 d, D8 b: t1 ]
    }
% ^8 i# V6 v. V" N, u* m; m}+ r7 o: d& o& T$ M4 L8 M$ \# W

6 f8 F7 X" f' C6 w5 g' b$ k1 J第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。9 T( ?! R) l: i) P; s" Z% b
----------------------------------------------------------------------------
; y6 H, m" O, P- ^9 r04inc.php
+ y5 G# u. f* g0 s<php
' E( @1 B7 I6 F  U3 V6 k
5 R7 w3 c, O( l3 Anamespoc_e Core;/ O  |$ A" W. o; E4 H, `" A/ B
include '05ou.php';3 X+ f1 o, R, h
functio_n showinfo(){
3 E7 e7 I( _4 @* a0 {    echo __METHOD__,'<br/>';4 m; ?1 Q4 C( s: F, S
}
( Q% y5 X. g( X3 ~! s3 u# F0 g4 W3 \3 \: B1 L
new \Controller\AdminController;
( h9 f/ B5 g' ]- [- X3 Y----------------------------------------------------------------------------
. ?# u* E% I, Q3 ]05ou.php
- `# @4 z$ ^7 V<php
- A( F% G7 i; p6 h3 W% a  T' J( knamespoc_e Controller;
% M  b& C9 i3 t+ [& V: l
% }4 i2 n9 A, @0 b0 E1 R, h( \clas_s AdminController{0 `0 E3 C* t. p
        public functio_n __construct(){9 E" l; v! _) ]+ j
                echo __METHOD__,'<br/>';
/ F1 x9 t% `5 |' C& t5 ~    }$ u% ?: v# a6 T- k
}: H/ d9 K# X; n" W4 j, C5 q5 @0 \
----------------------------------------------------------------------------
& \# N* t* R$ i; J; F+ S: _! x- P( k: K8 y& G0 ~; `
4.引入空间成员:* o% ?# u! X' `6 P( E* J: J" y
; A0 }! I: ]+ @2 V! b  \# G
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。) q' f. ]) v7 d, K  _
3 ]) w: a9 k1 f
----------------------------------------------------------------------------4 K, Z  ~. Q; H7 l* v

! k) h0 F, L: I4 ~( l2 i04inc.php2 O; s) R! k6 P$ Q- z9 b
<php
/ t, q  T; Z" wnamespoc_e Core;
/ A* j2 ^! P. ?3 c& |use Admin\Controller as con;7 R% R& `$ M/ I) [( h* H

7 ~$ I- s: C, \, G% Finclude '05ou.php';
" Y4 e0 w) p, v: Q/ B. h: R; ~( t$ N. x/ T
new con\AdminController();
( R* J+ r" P( w! O  Q----------------------------------------------------------------------------- A8 G9 i2 W$ f5 B
05ou.php
- k% Y4 ^4 G- P' [3 c<php! v/ g0 I7 s2 @* ^! k
namespoc_e Admin\Controller;
2 Z6 z& b9 c; q8 C3 g) q
2 T7 l% I7 n: t# \6 Cclas_s AdminController{
6 ~; f! S2 {. I& h1 D    public functio_n __construct(){
0 A& J8 c1 Q6 G% A  S4 ]        echo __METHOD__,'<br/>';- m  }9 l* D/ q. k% |6 m0 j
    }! b: Z1 ~$ i: T  q5 z
}! V& \" W; L1 j" S6 q7 T
----------------------------------------------------------------------------9 t& h7 [. ?" q; ?3 B2 u: F7 I
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。1 O# _& A% ?" ]8 u# `9 I; k8 U
% o# f: X6 _, E! ]. z) z
----------------------------------------------------------------------------) y6 N/ [0 K" m5 g
; g) p( t; p, I, C5 v9 ~
04inc.php
) x! }+ d3 }4 i8 R' v# @/ G<php' p) s+ M. [' A8 \/ H8 k/ t; U( W
//引入空间成员类+ i- G- E- ~/ {  g5 n2 P( }
& q1 t( ~$ k: Z4 E, f# {. f: \8 Z, T# q
namespoc_e Core;* {0 J9 f, l+ t6 }1 E! ]
use Admin\Controller\AdminController;3 b! W8 o/ b& L+ j) J+ B3 r, ?
include '05ou.php';
. p0 W9 {0 Z6 H& q- R' f( K' L. Q; U( C+ ?
new AdminController();: \. n9 e: d% x
----------------------------------------------------------------------------$ M( d3 O# }4 @0 u9 o
05ou.php
& V* r" O9 F1 l9 U' A<php% f4 D8 ?7 @& f8 ?$ H
namespoc_e Admin\Controller;
7 N9 c0 r$ F! \% F' C  Y  N, z; r+ \! o  V3 y# C( X7 X
clas_s AdminController{
7 D; b  t7 x3 |: k& G    public functio_n __construct(){4 |& n3 Z' N2 S2 K; p
        echo __METHOD__,'<br/>';8 h3 J0 |( z8 K! d5 ?4 |/ r
    }
0 f: b7 d. i# {1 r+ [, `}
2 ]* u) E+ z9 A, d6 h5 @$ V" b$ Y----------------------------------------------------------------------------0 _: \0 p: A6 X/ _5 @
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
% |" s4 l; z4 S- |/ e, ^2 q) Z# \- f- M" q" a
# v9 u( d- L7 C, {; L  a
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
* q6 a5 C. Z  q! z8 L% t9 h- m+ ~
. X- Y( d" a6 O2 D* p; M9 z( Z2 y9 z: T' o# Q& b$ W
& x2 R, S: m) |0 j& Q
* P! j  R3 s7 v

. b! {; e/ Z8 D8 g7 k3 p0 u
- e$ c6 N4 Z, A' N5 N3 m* b2 q




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2