cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
0 B* Z$ e5 _/ }( o7 I: s
# ~7 b" H# S7 J Z8 V) z- U j) \
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
! _: @6 @) N+ d/ P" e
3 E% r+ f$ g1 R& u1 H* X
20181201105307520[3].png
(32.57 KB, 下载次数: 8088)
下载附件
保存到相册
2020-7-1 23:22 上传
' w3 g% C4 @; E9 ]
' E) _! W* k, p" r9 ]+ Y# N' v
我们来详细的讲解一下PHP中的命名空间:
& A6 L. y# L( ?
# P% I9 h5 Z) J' E! B& ~
语法:namespac_e 空间名\空间名;
9 q8 {* R! D! i% N
7 ~: J8 L e: E4 t) v
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
, \; z$ S0 {, t3 H
) d6 h0 c6 `. O
----------------------------------------------------------------------------
- v; A. K$ ?' S& a
# W9 \4 x; W/ _ x( n; c" v
<php
2 B9 q. |) M. Y6 {& o* M
! x% n6 h5 [2 R, I
namespoc_e AA;
/ {+ ~; U9 x# S2 h( g B6 {) V% |
functio_n showInfo(){
; z) g x4 m4 ? L- {
echo __METHOD__,'<br/>';
F' E, H1 L2 l/ P$ N4 i' S7 q" w
}
P% g! M1 t7 Z8 _
showinfo();
+ M$ u. Y" }, ~, K0 i
: _( @6 v/ ]# G$ R- H
namespoc_e AA\BB;
2 S$ l/ P% A& s+ |4 U
4 y0 _( D5 w. S1 R& ]! d4 o
functio_n showInfo(){
# Q* t! i! ]8 J' O9 C
echo __METHOD__,'<br/>';
2 O! |# H7 H3 S7 p; C; j
}
% x1 C1 |+ u- D0 O! f' A b
//showInfo();
H9 L3 I g- w2 T8 ?
----------------------------------------------------------------------------
# ?. [. S# ]" S5 H3 S1 G& d
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
3 j3 Q+ B5 ~# G) }0 n
6 {. i: _0 `* A' `
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
+ W- F% U8 l* t& z p$ |- a: d
4 |$ |- h+ m7 J0 N5 ^+ `! w+ Q
----------------------------------------------------------------------------
3 a0 B/ h' O: P
) _4 i N( n9 H7 ?5 m1 @1 Z4 L) l
<php
# n( `' g, w J9 a$ S6 A5 ~1 C* o
namespoc_e AA\BB;
/ O6 I) `) f3 L0 s# V# Y
functio_n showInfo(){
F4 q2 h; ~ v) e& ?7 \
echo __METHOD__,'<br/>';
: [' _: Q3 ]6 W: j. U
}
9 H! z7 T( k7 g0 ~' @
namespoc_e CC;
& b# K' w D3 k! T& f
functio_n showInfo(){
1 L6 t8 \" j: b) n
echo __METHOD__,'<br/>';
) z2 b4 u# }9 f- H% C, G6 o2 p
}
7 S% d+ w% I8 r7 m, t2 f
namespoc_e AA;
, J; Q7 n, e% i. a* \) j$ _
functio_n showInfo(){
: u) x5 E7 u$ [$ Y& u+ t3 z
echo __METHOD__,'<br/>';
7 M2 M1 u7 \* c. R1 V( e& V
}
5 q5 Y6 G- }+ T5 Z- s/ M
//非限定访问:用于访问当前空间中的成员
& g% @8 T/ o4 C0 S- f. l8 e
showInfo();
/ ]1 h5 @0 @" ?" X3 X$ A
//限定访问:只能访问当前所在的空间的子空间中的成员
1 M; e5 v5 B9 I7 Z/ \
BB\showInfo();
/ G% h, ~' G+ O9 e3 T
//完全限定:可以访问其它所有的空间的成员
2 ^& l x) E. N d# I" W
\CC\showInfo();
. _8 a2 ~* S5 [3 q
↑根空间标识符
" ]3 z2 A4 K1 `( h! m6 b7 _
----------------------------------------------------------------------------
6 E% |5 _7 D+ Q: V
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
9 R. t7 u* C$ y4 P+ x+ K, P" l9 v
4 E2 W. Z1 i$ E% l
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
6 A+ b% g5 _% b* d+ w6 `! h
^/ w4 H/ `8 [ z3 l: w
代码示例如下:
" L4 U- e v/ v
$ m2 Z8 P- I% O/ K) a
----------------------------------------------------------------------------
: u/ ~# t) U. I; A# V
* ^$ n" \6 v, q, Y+ @& L! S
( m8 i! @1 V, Q! f7 h3 F
04inc.php
v! n- ]- \3 c/ E2 T0 z
<php
/ H" [8 x/ y) d
: o/ X$ l$ X' X3 o! B
namespoc_e Core;
" Q' g# m0 x @! _
include '05ou.php';
4 ~) R* F& C$ P2 ]5 ^2 }
new \AdminController();
. j: j" T/ Q. N& [* m
showInfo();
x q7 t; b) J! I; ]
3 l( p$ Z. ?# e0 \
echo P;
& O' G$ b' \4 J7 `
//根空间中的成员,只要类的访问必须加‘/’
! l8 @: H' V. j2 e, C
----------------------------------------------------------------------------
k; p! ~7 A1 c/ m1 ^1 l
7 G0 }& c. p6 [ a
05ou.php
0 a2 @* u, Y& {$ F3 `4 k$ L# I: K+ e
<php
6 }( N! \7 d$ H* {. {5 C6 e0 `9 b: U
const P=5;
$ |! I: ~" L ^
( d V( x9 T, R8 f; O# j
functio_n showinfo(){
" Q. V& _# K0 y5 s6 O2 ~" x% p3 K
echo __METHOD__,'<br/>';
* {) a2 m0 O: M3 w6 r* L9 d
}
7 e; X0 J9 H3 U3 D& j( W1 U& K
" r& D1 Y8 b5 G7 _+ n7 O& P5 V* V
clas_s AdminController{
. |( t9 t" Z* q, Z) f! {& U# ^, e+ ?
public functio_n __construct(){
5 s2 S+ k$ f; L! [: a5 }5 j
echo __METHOD__,'<br/>';
% o0 }% @8 S# Q; I) o. ~" r
}
- b: f" |. B/ \$ g- U* Q) ~. g6 d! t8 A
}
L6 t5 b6 F. S8 X3 n
3 L3 `; `* Y" ^0 w. _. H; n N
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
+ p0 O" d w+ x- A
----------------------------------------------------------------------------
( | V) W o7 _: V
04inc.php
5 }5 Y0 E/ G" B, C$ |* M" m0 x9 P9 \
<php
! e) a2 {8 g( r. f
& b4 r3 b2 r: W. n- E
namespoc_e Core;
, C8 p% K2 f" p
include '05ou.php';
' L, e) R- d6 a
functio_n showinfo(){
4 }3 }1 _( O7 Q% Q3 Y6 O' j4 ]
echo __METHOD__,'<br/>';
/ y+ M; L2 s! ?7 i9 P- W
}
/ r4 T0 ^: R& H2 [' w- S
* x# G' ]' C5 ~
new \Controller\AdminController;
% s) e. u2 o; W
----------------------------------------------------------------------------
) v% J, F9 o" G
05ou.php
/ i. F9 L% @) n Z) A+ R& |
<php
: R+ j; K9 r3 P* P# C: l
namespoc_e Controller;
5 f9 q O. |! b$ G* T1 a
. I6 Q* v5 m2 R
clas_s AdminController{
4 ?, G+ X) \ |
public functio_n __construct(){
+ R. @! O% J! a. ~/ K g
echo __METHOD__,'<br/>';
" I" A* {+ R* @1 L
}
$ w/ l% x; i# ?/ k' _
}
( l" m# E% _* T( s- _
----------------------------------------------------------------------------
# x* d1 n3 O, d6 g
! o: {) P( {' A' E0 T
4.引入空间成员:
4 U7 U5 E2 z% r: O' t. ]
5 c3 J% ~3 j8 g( d. {7 Z9 m
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
5 E, \& I* K% U
6 L/ m. s6 L0 b
----------------------------------------------------------------------------
4 F# d, f0 C" U
- c3 w2 o' m0 l, K3 |
04inc.php
$ m L8 n* L! M9 @, ]( L. ~
<php
4 c" I- Z' i$ A8 v1 s
namespoc_e Core;
% y! i- g7 Y* x; i5 U! J8 m
use Admin\Controller as con;
, g9 x; g1 i& y# r2 D; N0 r
4 k; F$ }, K3 M$ ]! M3 @+ u
include '05ou.php';
1 N0 J" h7 b* ^; g" m/ B- _
4 M, M6 E& M8 V$ p3 L1 W* z/ m& F
new con\AdminController();
8 d- l% M5 A6 E; A6 u) e2 M
----------------------------------------------------------------------------
5 a8 E. `1 @! n
05ou.php
K$ J6 J+ _' z! h# G G
<php
' O5 _0 [* Q& M8 g
namespoc_e Admin\Controller;
& l0 L" B4 i5 g
# b8 ], k& [7 ]6 K
clas_s AdminController{
& g; Z$ x; m/ F
public functio_n __construct(){
k* k; i Y. j, A' y, r
echo __METHOD__,'<br/>';
) l7 ~! D: z/ T0 p& _+ U; Y1 m
}
: L& P: @$ l) s0 W' x( t; V
}
W/ K. S+ m2 A" c
----------------------------------------------------------------------------
! Z6 V' i# Y D- p% N- f* t
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
$ t: \. x- ~, @% }1 v3 X
% J& ~ u5 X* s1 m* A1 {
----------------------------------------------------------------------------
- e; J5 y( q, m8 H& T w- \
8 m) u3 E0 r" |4 O
04inc.php
( k+ P* y' @; o B
<php
7 b$ V( T7 g) s N$ W2 U0 d
//引入空间成员类
/ C* |! A$ d5 r
- H( S3 S4 {5 S8 B# X- @
namespoc_e Core;
6 _0 l+ _* |+ w/ v$ |7 q
use Admin\Controller\AdminController;
5 A9 B+ F! x+ _- u t9 z- M2 w" L
include '05ou.php';
* Q9 G# A9 R* C; j: v
6 X! \0 Q$ c! |! a
new AdminController();
% D; @ }$ b/ t& n9 U
----------------------------------------------------------------------------
) ^5 h, {4 E- S; G0 W
05ou.php
( b* [! q& o9 r
<php
0 a9 f8 n! d) B! n
namespoc_e Admin\Controller;
5 K$ m {( t9 w9 f8 h0 { v) x* R6 P
" u& L' y* j% W2 {: f* U! b
clas_s AdminController{
. ?8 _6 g. X4 v: P
public functio_n __construct(){
; }0 R5 T$ {+ F, H. z& X1 o
echo __METHOD__,'<br/>';
) a* f# @$ d! j5 d3 B& w6 j9 T
}
2 N* {$ C9 w& [, o. H
}
# H: m) @2 z7 U$ H9 @
----------------------------------------------------------------------------
: Y: g7 q( d, K- G
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
! B2 M' d; l" J% X( n: R
& x; U6 v& J/ X' m
" ~5 y7 r( t7 D* f8 b' v: G
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
- S0 t1 g9 K: m# c/ M
: c* L) T1 X& f) F) M; U
' a5 \, m* E! V- v0 P
! ?, F6 C! Z( P6 l' m! @
) j" a2 \; b% m: ~! I
" P% {. s0 x# n0 ~ z! ?/ W
4 n& v S$ s/ F. h
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2