cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
$ j1 D1 N# c& ]
! B. o* h& d, u! Z) ], G1 s
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
& Q/ _' H/ d& w' P& M6 n
, ?: Z( X, i$ J0 [: l
20181201105307520[3].png
(32.57 KB, 下载次数: 8085)
下载附件
保存到相册
2020-7-1 23:22 上传
( h7 P) S% j$ \! A# v
* j4 f2 [) E+ C! e# s: A, [
我们来详细的讲解一下PHP中的命名空间:
( H- p, B3 a% U9 T3 e" a# O
; Z' Q. V, Q. J0 l
语法:namespac_e 空间名\空间名;
6 ?+ r& `" v2 A4 \6 X
; O* C# w) V4 {* o9 K
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
6 w# \2 \* l: u/ z) S. ?' E; P, ?
/ v1 |8 V" I3 B/ Q* Y8 k
----------------------------------------------------------------------------
9 ]- d2 C! \5 A8 q6 T
; A" k/ z6 h( G
<php
+ J' y7 z) ^ w& f+ k2 P
! J {7 K8 b. I7 B+ r- B8 \
namespoc_e AA;
( q' p) k( I" u0 ~9 ^
functio_n showInfo(){
: Z' }. U+ m: G2 I8 l' Z; m
echo __METHOD__,'<br/>';
. Y0 j0 u! U6 T. t$ T
}
* i h- }/ q3 @1 `
showinfo();
. _$ _3 ]' C4 J5 }7 L- s- J; O5 V0 l
7 |2 w( R: b5 O0 m' U7 S& e
namespoc_e AA\BB;
6 c) U, t* S, Q: d3 [9 {
2 A* E5 a8 X6 L1 d2 ~' |* `
functio_n showInfo(){
1 k! \7 g9 E0 Q1 J c! z2 D
echo __METHOD__,'<br/>';
! X+ h3 o3 C; W4 U& W
}
1 X+ ]1 a& ?* B1 R) L1 h
//showInfo();
: A" S8 Z* N; x$ T' l9 z' I3 L& A+ b% F
----------------------------------------------------------------------------
3 n5 T# L1 _! I" e ~
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
2 l, e5 F( r+ T
7 B9 V- q3 P5 O7 q+ s/ z
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
5 L, |4 z# z! B9 P5 P+ w; P; Z
: K' J: V6 ^( w+ C4 w: |
----------------------------------------------------------------------------
( W1 _$ L: Y- t0 K' }& p6 t
8 k* I: B. |; j, n8 b& c4 w
<php
0 O, T% T* J& Z: r0 e5 P! T
namespoc_e AA\BB;
8 B* }6 u- R, _/ k
functio_n showInfo(){
( ^* s# m' m+ A. z9 A: D
echo __METHOD__,'<br/>';
% W" t, x" ~* m0 J! h
}
+ S. ~- ]2 |& Z- f' e9 `
namespoc_e CC;
- M' \; @' Z! d C v
functio_n showInfo(){
" v! R. f# D" e, q
echo __METHOD__,'<br/>';
8 Y! s+ [/ t" v" h1 ?
}
& Z6 Z. C# C6 z1 y
namespoc_e AA;
+ n' f( C4 ~8 \. w. _- v) c5 a' j
functio_n showInfo(){
5 H5 w" j( w- p# I# T2 c
echo __METHOD__,'<br/>';
; w E' h+ D, \, s
}
5 D( V8 E1 O" T/ c5 i
//非限定访问:用于访问当前空间中的成员
3 n8 z1 I2 Z: @1 E
showInfo();
. N/ `7 W6 x- K2 v( G4 Q) i
//限定访问:只能访问当前所在的空间的子空间中的成员
. G) u% ~! g7 Y
BB\showInfo();
9 @+ q% e1 o+ X2 j& m- t f: F
//完全限定:可以访问其它所有的空间的成员
) L' f& O3 `8 h5 h
\CC\showInfo();
2 j) v! b& u' A& Z4 Q! V
↑根空间标识符
2 H, I' o F( J; r; m
----------------------------------------------------------------------------
3 k; Y; D- \' H. G
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
6 E' B8 I# G/ G' V. _$ e: n
/ x; k- B, A# B8 b" \9 Z& G) T
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
- _) G! C, c6 p$ ^" c% j; S
) v/ D8 j( f& i* J/ Z1 v
代码示例如下:
& k' y2 q. ~* W X, ?7 Q: ]
8 ?6 j* C ^3 R+ ^& B
----------------------------------------------------------------------------
4 v i( x6 N$ s% m6 y
3 ^ ?9 `; R' Z! d. `8 K
) G5 }9 o* k7 U& G
04inc.php
& w/ ]& g1 I/ ?, @8 ?
<php
5 }( Z+ i8 R+ b l& W
4 c0 K8 r$ e: D. t
namespoc_e Core;
8 k- f# N) C* q9 c- w. ~5 y" P
include '05ou.php';
) K- I( Q- G- q) w# O0 z% ^
new \AdminController();
& z" h7 a' J% g" D! Q$ V
showInfo();
! C3 g" _, V5 ^0 S( y5 z- H
$ g0 u. V+ L( Q* M0 P
echo P;
! N- w$ `! \9 T8 k
//根空间中的成员,只要类的访问必须加‘/’
1 ?7 E8 r; z/ O; b0 j
----------------------------------------------------------------------------
0 t8 }' g1 M% \* N
4 h! v! p* F" G v; d4 M
05ou.php
% `& [# A8 X5 y: i$ d. u* }2 j0 p
<php
# Y8 A/ j" P* E( o- o z2 h
const P=5;
' \* j% k g s6 d9 U, h1 K
1 j8 _( N, I2 j0 m% i8 P$ p
functio_n showinfo(){
! @* H2 M* L! ?5 X' ^
echo __METHOD__,'<br/>';
- j+ p7 w. r; U
}
0 s7 X8 v/ x1 H" Z0 Z( Z
6 s) |- d- Z* Z# D0 G
clas_s AdminController{
- z9 i+ r) A2 }6 P) M# `0 \
public functio_n __construct(){
& S0 j2 u& k! i& M" Q1 {+ {+ }6 f
echo __METHOD__,'<br/>';
# K6 Q8 H. E1 L# t2 u2 a$ e4 o5 _
}
% B: U9 D+ ]# a8 `3 E; H
}
& K! l& p6 \3 B9 f5 u6 v$ A4 ^
3 }6 m, |+ w, ?5 C9 X+ _
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
' K: A% n$ z6 N4 W3 i3 V
----------------------------------------------------------------------------
6 B8 A4 c8 T% {( e$ Z
04inc.php
. ?: q5 S! k, L
<php
* V+ C0 K9 \5 M/ j# j# j
0 B+ {9 y& i0 @( f8 P* y
namespoc_e Core;
1 v# {% V' P9 Z* o. ]
include '05ou.php';
1 H8 T j4 n- @" j2 g# L$ S2 [% j2 [
functio_n showinfo(){
7 x/ w& J" h. _2 S5 ` y
echo __METHOD__,'<br/>';
* ?! i8 O$ w- T( y
}
/ D4 z) ~5 S: ~
N( |+ U/ d/ _
new \Controller\AdminController;
% _0 c! W* J5 \1 w8 o
----------------------------------------------------------------------------
! S0 P2 y9 P1 \2 p
05ou.php
; Q8 e1 a0 I U
<php
T. l4 q! l5 N1 r
namespoc_e Controller;
. M9 s# @- y7 l& k9 A
! A& f) y9 H1 A8 \5 M. E+ n+ o
clas_s AdminController{
& t. @! T1 \- a% S$ j( a6 N
public functio_n __construct(){
' O+ W1 m- J5 I. b) m
echo __METHOD__,'<br/>';
2 p( ]" h+ j9 u2 h
}
& B7 b1 |+ q6 y% u% c/ }5 r
}
- I* ^6 E. ^; b! k, c8 J
----------------------------------------------------------------------------
6 k. ?# {9 R, @! N# L0 ?: C j0 D; |
: N( E3 A0 `& ?( R e8 m
4.引入空间成员:
, O( C# M$ l4 c s# b- P7 m% C
' P0 a& O! }: ~7 t% P
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
8 ?! \. \4 `) A, Q, L& Y
4 O1 Z/ \! } `- X. {9 p
----------------------------------------------------------------------------
% F; W, ] y- ~
8 y, Q J* E5 D+ Q6 o# j
04inc.php
# b9 `+ ]6 \; R: N
<php
! C" |) m6 ~( V; T; V
namespoc_e Core;
/ n) y& j% R Y+ l
use Admin\Controller as con;
# ~6 J% X+ m1 Z
. i+ ]! m7 \1 g9 | u
include '05ou.php';
) y3 W5 G/ V/ T: V) |; ^$ Y% l
- c4 ^4 K0 w6 M& b& a0 S
new con\AdminController();
4 v6 b, m7 q3 a# i- m6 M
----------------------------------------------------------------------------
2 w C# `) w( n% r" v! m( [% D/ V
05ou.php
+ |, \0 V7 u% k; x! o
<php
/ ~) v; t: L! C3 N
namespoc_e Admin\Controller;
2 F- @$ \ u; X( p. P6 F9 s& L' \
7 J: e6 t$ y7 S6 o" I; ^6 ]" Z
clas_s AdminController{
; L5 t. d& }' K; _
public functio_n __construct(){
( ?/ k% ~+ o0 h8 W- Q/ B# n2 T
echo __METHOD__,'<br/>';
0 M2 E- V7 o( C8 q& L- t$ X7 k
}
$ t% B" @$ @, U# p0 s1 F$ j
}
# y4 A6 z2 I9 F9 Y q
----------------------------------------------------------------------------
, \2 i3 j- R- ]
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
: _- A8 f. ~ [# ~9 N9 @; B$ s3 A
! U" O( R- z) F7 v/ r
----------------------------------------------------------------------------
9 A3 i( `8 g% A' ?6 \7 @
6 G' \& q6 A! S! M, U
04inc.php
- G5 L6 [$ ~# o
<php
' b( c* m* z& `5 W$ k
//引入空间成员类
7 s6 t2 [1 W- C/ l* k
3 |3 m' {7 E- k& n% s2 f6 I
namespoc_e Core;
0 _4 H. t$ Q5 \! R& ?* X, ^) A
use Admin\Controller\AdminController;
, |- t; y/ N% u" F* K/ r6 I
include '05ou.php';
) w+ |! Y0 F- c3 r# z$ a z
0 v( Z! a: M8 c m7 M3 X N
new AdminController();
$ s& t+ U# o+ q: ?/ |
----------------------------------------------------------------------------
& |* R2 w# d7 ^8 x
05ou.php
6 Z9 z7 L# v% j' w' e
<php
5 P6 n; @2 i9 h
namespoc_e Admin\Controller;
% N8 d" @4 V( p
' c. r) b8 Y; W5 a5 ]) z7 D
clas_s AdminController{
) p* U c5 _+ t' |# G
public functio_n __construct(){
) B: A q0 ?! l2 P( F
echo __METHOD__,'<br/>';
) N6 f; C4 M3 t' P( B
}
) k4 N. |1 T; x3 _# q
}
- y1 T( Q8 L) U F" ^0 r
----------------------------------------------------------------------------
; f7 N) i# w2 t# ^, d# O
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
# T c# Z+ x) D) r. i
$ L+ E/ S/ M8 d" |( k% ~
: B k; h1 C, \. m) l# a* l3 p' u
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
4 w: v( }/ x- \& l' B5 S V
& W; t" V* ]- G/ D9 G% q4 F
: a6 p$ ^( o5 {
; ^. |9 k& D$ \ J! U D+ G# C
# L. E: G9 V$ v! v5 e% c6 s
. X0 x1 n7 l# X# n1 g
. h, E; k/ s2 ?3 A: `1 U" u
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2