cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
2 f) h2 o1 W( ^3 `$ \& C
, d6 A, h5 g8 w H( u6 \! X$ _
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
/ O' t% j8 ^' F( u
$ B5 t( B4 X. F1 S. _
20181201105307520[3].png
(32.57 KB, 下载次数: 8627)
下载附件
保存到相册
2020-7-1 23:22 上传
+ E g$ T8 H0 b4 f+ V- ^. M3 k
/ p7 T8 i( P- }1 p8 P+ Q
我们来详细的讲解一下PHP中的命名空间:
/ f9 n- a- V; e
' `" Z X( A0 T% H A& _1 G# |
语法:namespac_e 空间名\空间名;
2 {: c& v5 W* L6 {
" \8 ]$ T: ^. r: _
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
- @# A. ~5 U# I' T" g% Y
: q! ]6 e+ D2 t* R* M5 l+ t: f
----------------------------------------------------------------------------
( w' w% N: ]: |5 t# H
# ~# C! B! K$ J( [9 t8 _
<php
; }1 c% I p! Q, A
5 Q& {9 e4 N2 j& q
namespoc_e AA;
$ d _1 _5 c7 l$ L0 l8 U
functio_n showInfo(){
5 Y- [5 ]4 I+ g
echo __METHOD__,'<br/>';
9 ?; w1 W( l8 N; @, T" K1 E
}
: y* F. X |, V: U) Q
showinfo();
! E ~' J$ ~ s
6 c7 i4 | v% T5 Y2 y' q4 k
namespoc_e AA\BB;
6 w: x4 w, y" `& t k/ Q8 ]; P
6 T! W3 m* d O% f1 C& Y, {
functio_n showInfo(){
5 t/ ?7 U V! } N6 P: ^' ^
echo __METHOD__,'<br/>';
' _- L1 s, A; d8 K! \0 q! }8 [6 R
}
9 C: }3 V5 u! V& P
//showInfo();
, e R3 o W0 [2 c
----------------------------------------------------------------------------
/ R0 t# _5 ` s; d: o
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
8 i$ i; v, X9 y, b
' O$ a ~* k7 C4 }
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
( k$ c3 }$ M6 W: G
6 S3 o* C% J9 d9 i8 V9 g
----------------------------------------------------------------------------
! n/ y5 E3 L. o: z/ ?3 F
, k9 a! ?; {7 ?% F. ]: L+ _
<php
7 Z, a& d( x& l! D6 R+ B
namespoc_e AA\BB;
7 ~; [. H8 T2 [$ |) ^5 p
functio_n showInfo(){
/ z* u. i" s) i8 d. r* ^
echo __METHOD__,'<br/>';
& }; J# [& P5 Y/ f5 J' \
}
8 H( ]# l" b& t* r4 T$ m
namespoc_e CC;
1 x) P2 @8 p: f: ]
functio_n showInfo(){
6 N+ Z1 q$ z3 b6 U3 {
echo __METHOD__,'<br/>';
1 A$ O2 h1 |" _7 d3 z! J
}
& [$ [- }3 o ?0 a
namespoc_e AA;
! r0 n: J* S! N5 f: L
functio_n showInfo(){
& P. f ?' M8 t" e
echo __METHOD__,'<br/>';
% c9 q5 V- V, i
}
( v! g* m! {7 b6 c/ X: ?5 B" r
//非限定访问:用于访问当前空间中的成员
( `% Y$ _$ H/ ^8 q) B) c
showInfo();
4 d8 ^+ d6 o) c' }
//限定访问:只能访问当前所在的空间的子空间中的成员
5 M+ ~) R A4 Y. S8 H4 i
BB\showInfo();
# |9 l& h! e6 N3 _) i4 g" E, C: c0 I& ]
//完全限定:可以访问其它所有的空间的成员
4 u2 m; o& @6 t# A- F0 ]
\CC\showInfo();
$ x- y: D) t2 A9 Q. v' K
↑根空间标识符
5 Z1 e) j( \" C8 G
----------------------------------------------------------------------------
3 p/ p. a' y4 ~2 M; L6 z8 ]
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
L5 D; b5 w: J& e& T. [
s- y! K, w) U1 ?1 T" q- W
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
+ s1 T- J, a( b5 E
* x7 p7 r) [1 V4 r
代码示例如下:
0 I3 x5 g. W" u$ K
( ?5 B, p7 \3 \- f
----------------------------------------------------------------------------
! |1 O. K, |+ O+ d
/ {; c+ o7 a$ Z' O5 o4 S# H- Z3 s
. V# c+ Y- g+ S
04inc.php
4 T5 H- a t! p2 D* V7 R0 p
<php
2 a# {- ^( z5 ^# [0 u/ T
9 w# k7 \/ r) r2 j) E: K1 D7 n
namespoc_e Core;
* d J' M) R) e5 K$ f- G; B: r
include '05ou.php';
# W4 p) [0 n# O
new \AdminController();
5 e' M" X$ Q* k) T! V( h& n
showInfo();
N8 v* n- B0 u1 I! o5 M
8 d- \1 q% P2 u
echo P;
* O- g5 @6 B) n' z7 L
//根空间中的成员,只要类的访问必须加‘/’
9 B" e8 [2 _; k; D" `$ Q
----------------------------------------------------------------------------
. h8 X8 P# W2 c( ^8 T) |
2 h8 ~6 U6 m, v2 ?+ k
05ou.php
' ^, ?7 f) L+ F9 X: @+ M
<php
r( s3 S! c/ y; w
const P=5;
( h5 s, n H" I3 \ S7 G
& R! x- A6 G6 K- ]. Q, O" w
functio_n showinfo(){
# R' r0 l4 l- w$ z/ p& w- K
echo __METHOD__,'<br/>';
1 {- l! B$ S) v" U
}
$ l5 D+ F, @" z! @$ v, C
% y. X U2 G6 n5 H7 c
clas_s AdminController{
0 u( C: c+ \. w9 H
public functio_n __construct(){
' d" [4 j8 r4 [3 B+ x8 z w( q% J
echo __METHOD__,'<br/>';
- D$ ?: n, c9 E4 B9 g
}
5 ^3 }! F% e7 F& k0 U
}
: K& }% Z/ n2 r9 W( q& X
9 j( y& l4 v2 [- x h
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
: H: x8 B* e' I7 ~) Q8 W
----------------------------------------------------------------------------
7 L9 ~/ w& h6 _( r/ d5 v
04inc.php
" N8 m! S# ]% N1 V6 u/ L. H
<php
8 J7 i5 p- o5 N; S3 `0 ~3 c
# g# V% ~* _+ B4 i+ u0 D
namespoc_e Core;
, X' p3 ?9 F9 q+ W0 T
include '05ou.php';
; ?0 S! z4 x0 k/ n! r4 U8 o
functio_n showinfo(){
1 u/ i4 v" \: _: V
echo __METHOD__,'<br/>';
8 i$ O/ P0 M$ c4 I% e- A' S9 O" H
}
% h; L: W- `# `& h5 f
) p& W5 ], F: V) y; p9 z
new \Controller\AdminController;
7 J4 }: j7 M. ^6 X
----------------------------------------------------------------------------
! u. {4 P; N2 E! c, Z
05ou.php
- L5 N: Z+ r+ G( a) \7 U' H
<php
" d" u" c! c- [8 K9 m% D( J4 q
namespoc_e Controller;
. H4 K0 V8 r5 L5 {" [% H
2 p R' v# v& e w$ R7 V
clas_s AdminController{
+ J f4 G' v4 H H
public functio_n __construct(){
r# }7 m$ T" `( }
echo __METHOD__,'<br/>';
1 \* k; t2 Z- P
}
& t% L# m- i s, G+ x9 x4 r
}
( H. Q' y* v' u* `& u/ I8 ^5 ]
----------------------------------------------------------------------------
" C, h; K. d+ J" _2 h3 |# |' r- R
5 d( e$ d1 }( C0 J$ h5 g
4.引入空间成员:
! d& e! x: t& c. C( c) l
# ]* f' S: U/ |% m/ P3 V: g5 L! v
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
% W% ~) d# Y& \4 m- q9 h
$ i" M! z R/ l8 G
----------------------------------------------------------------------------
- m W$ j6 C7 W/ i
! Q$ g. L! t- Z7 f7 B! E0 D+ p! [
04inc.php
+ A( ?/ X- H" F' }+ _4 C
<php
* |' f% L' p" q
namespoc_e Core;
# H$ v% `9 E5 v/ r; N
use Admin\Controller as con;
6 j7 H0 m9 h& G8 p% e' v* h" f
1 Y% G4 P$ Q- E& p! z
include '05ou.php';
7 F ?( j% }: a! s H, N
: A* @, h8 I- m, K3 p8 _. v! r
new con\AdminController();
4 A7 `9 a. |$ n+ N3 R
----------------------------------------------------------------------------
% K. t3 W$ u* U+ M
05ou.php
$ w- A1 W9 U4 P! b) y# U
<php
6 }0 g$ }- h! r8 W8 x, F
namespoc_e Admin\Controller;
1 w& x `' u/ Y' Q: O0 }
( ^0 V/ k2 x8 \7 h& U3 T% u9 c
clas_s AdminController{
4 U1 u( ~1 i% \0 F, M
public functio_n __construct(){
1 N/ @, z% ]8 x
echo __METHOD__,'<br/>';
: k( N! H7 I3 l5 } R
}
+ v) A. j0 m" ]6 k8 x! \
}
. t& j9 {5 g5 f, {
----------------------------------------------------------------------------
5 x9 `2 p/ O9 R( T
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 D; k. E% o' o4 \
i- F% W$ Z y9 T7 C" I2 S
----------------------------------------------------------------------------
. j8 o! R% V8 ]8 u8 y3 q
) \& m3 X, i8 x
04inc.php
: |2 m; S& k ^& N
<php
# ?' f0 p( B r, k- _% Q- K; J
//引入空间成员类
6 D$ H% L1 O. F/ u2 i3 \6 @
' u" H# p3 o: Z0 z. {8 ^% j( f- ^
namespoc_e Core;
% N" W3 h4 e5 E5 U
use Admin\Controller\AdminController;
2 ]- R5 M- z& |6 s' Y" J
include '05ou.php';
: q# S, q9 x0 n3 X
0 l9 K* _. m9 ~+ M4 u' u% j$ S5 x
new AdminController();
( R j M4 T! `5 |. s4 j2 p0 r3 e
----------------------------------------------------------------------------
+ B o& h6 U m2 X$ p( Y
05ou.php
0 }/ i7 q) M: l4 Y/ H
<php
& ^8 j, R1 B/ I) X; w9 D4 Y
namespoc_e Admin\Controller;
% @; A( S% \3 x4 L4 ^$ M* B
$ A! ^0 }# X3 f9 ^' o" [% e
clas_s AdminController{
( i4 `7 D% g( d- W
public functio_n __construct(){
* M) i' D( n0 p+ L% ]( i: y3 o
echo __METHOD__,'<br/>';
* R0 z5 G# g% C1 H8 o) J
}
) ~' M' p$ h& h" m4 V$ k$ x7 ^! z
}
0 o" J$ m& G; ^" z: r/ s
----------------------------------------------------------------------------
* Q& u+ t8 T! w" p2 J
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
9 P' a/ p$ P3 e& J
/ u4 a* G4 d _ ]" P
0 z7 {! `) I4 ?
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% s/ \3 ~( c+ P! c' b
7 X( B2 q0 J+ U0 J$ Y
9 z3 \, @9 k8 S) S' `
" i5 ^9 }& O4 E* _3 M7 U5 b
( G: N. m i- B. q7 {- P3 w$ {; b
. U6 E5 `- n; u/ N. }9 Y( g. D7 N
9 j' Y/ [4 t0 F
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2