cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
! B' @6 D% k$ h( K7 }
9 q5 e5 L2 X' h# r; j
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
& E* b2 C& G* ~( q" d
& d* f" l, Z: f
20181201105307520[3].png
(32.57 KB, 下载次数: 8755)
下载附件
保存到相册
2020-7-1 23:22 上传
. i' d& u8 u* @( l/ a
3 h2 I: j7 Z M7 s8 g' I$ e
我们来详细的讲解一下PHP中的命名空间:
$ ~7 r8 R, G7 c( X5 F" I
1 ?1 b& P3 J& a. a F3 g
语法:namespac_e 空间名\空间名;
5 c- o7 f5 h' N5 B5 b ]( [/ f* ~
- Z# I% i- |; E) r5 N5 `- X
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
& c/ r- r# a8 O1 Z9 e/ b
+ h I+ e7 H' ~% [5 X9 ]3 Y
----------------------------------------------------------------------------
, Y" a* x: \# w. h
- _# z6 @: q8 m" b( N0 ?. h7 V
<php
5 y$ H' ]8 y7 x# a) j
$ y D: g2 W( } a, t9 K5 p
namespoc_e AA;
9 N" N7 d0 `- y2 r9 X& [) R7 I
functio_n showInfo(){
& q% K1 l( b& D7 Q! _" Q( S
echo __METHOD__,'<br/>';
3 S2 {8 M- O. J e k
}
5 T+ ?6 j* r+ @1 {6 V
showinfo();
9 ]4 ]' a$ E: t. b [. X9 I8 K
+ g: @- x0 e& c
namespoc_e AA\BB;
6 _1 W& u+ K! d
4 j3 W3 K0 K- U% n
functio_n showInfo(){
0 E6 v8 A- ]! W4 ]5 d C: O
echo __METHOD__,'<br/>';
4 b/ _0 l4 i4 k: ^2 R/ u; K6 p
}
8 {' l* ^. {! X, g; d
//showInfo();
" C# d5 K/ G3 E k
----------------------------------------------------------------------------
2 |0 r! k$ W$ t) N
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( E! ?0 r, s g9 p6 A8 x
$ f- n8 r& W& G' t9 w* b
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
7 o9 F8 F/ j+ p
2 ?0 a0 |1 t' [1 P z9 V+ \- G
----------------------------------------------------------------------------
! o: q7 Z( ]: ?5 W& S
* \0 M1 w8 A% I( x
<php
( ^4 D, @2 \0 Z: {
namespoc_e AA\BB;
$ }- ^: @( B' k. \, Z" w" r
functio_n showInfo(){
% g+ k) a+ c( r. ?
echo __METHOD__,'<br/>';
" d* S4 c3 R* k4 T0 s1 T. t
}
+ k" ~) U2 z/ O& S ` s
namespoc_e CC;
& V+ N' {( h7 r W
functio_n showInfo(){
/ @) {, L$ O0 k) b; ]
echo __METHOD__,'<br/>';
3 R/ {3 I# m `6 W) y7 l
}
4 V) B+ O5 b0 D$ ~0 r
namespoc_e AA;
5 F" L; ^% d' n) y1 F; A# D
functio_n showInfo(){
) g# i$ k" o2 a) z/ U$ a$ t2 E- m3 [
echo __METHOD__,'<br/>';
/ M; w; v4 l1 @1 s2 S
}
0 L4 d' G& M( Q6 Y+ s3 [
//非限定访问:用于访问当前空间中的成员
/ P0 H0 C" [2 v' [# W
showInfo();
f+ U! [6 P! }) A. ]. ]
//限定访问:只能访问当前所在的空间的子空间中的成员
+ k) Q. \2 s; S4 \" `! C, ^
BB\showInfo();
! c& ?; [+ D( D4 u/ q" d/ w* K
//完全限定:可以访问其它所有的空间的成员
: A6 j- W- M" _/ B
\CC\showInfo();
8 f2 L' B: @! U, @5 R0 J
↑根空间标识符
( t$ j T/ ]/ a
----------------------------------------------------------------------------
" D2 Y5 V% U6 v( E2 q2 g3 z
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
) J- \) J0 u+ ~! Z) t$ i
, V' Q1 d7 c8 Y* j8 p# t
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 A0 v9 _( T0 K9 C7 E# M6 P( G
% e, `1 S3 T3 h( Z9 h
代码示例如下:
8 O* l2 a# }; ^5 }2 p% p
8 y* R3 P; v. m! C* o8 J% M
----------------------------------------------------------------------------
1 M2 k0 Z) f1 A: H& X" `$ e/ z
- s4 _+ h+ U: A5 a: e! n* W/ y: N
6 A* b7 l% b$ G/ g
04inc.php
& V/ `5 w0 @! t% I6 k! p& U
<php
6 G) n6 g. `) y0 l" C6 q6 [
) R! I! h2 g, q: Z/ G( F
namespoc_e Core;
9 q9 J4 @, |6 p5 ~7 B7 v: \# Z. U
include '05ou.php';
9 [4 H; D$ C. v2 E
new \AdminController();
5 h6 n! u7 I# R
showInfo();
. U2 R8 V3 H( |. G
, K9 i1 n& I9 q6 h
echo P;
) ~! }0 B5 D5 i: N9 P" z- c
//根空间中的成员,只要类的访问必须加‘/’
6 G' h4 e+ ]9 N0 o
----------------------------------------------------------------------------
% ]0 X! E, o# A; H9 k
* z7 }, q. ]4 M' n. q0 s
05ou.php
( J. S( h* j( N7 x
<php
$ ~; L; O6 Y. U3 I1 N2 L
const P=5;
) r9 [! y T& q7 r# q& [% O9 a) Q
?" K& V! A5 a7 K
functio_n showinfo(){
4 n' q2 D7 o( i3 q
echo __METHOD__,'<br/>';
7 k& }, P3 B" a$ ^
}
, N- L) \( [9 b' G6 ~
; j$ A3 Q# n, D1 @. e) F5 P* Y. ~
clas_s AdminController{
9 J+ R0 Q- q3 b: |$ _* G5 f
public functio_n __construct(){
0 G. i( u3 ~( Y, d
echo __METHOD__,'<br/>';
! B9 e/ L, n4 F) x9 I
}
+ @+ L8 W: H) o0 |2 a' r
}
% d9 P$ A! F6 A; n0 K e' j
8 ] p% a/ H0 \. o0 u5 d5 a9 f
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
. R, h9 Q% h) \, k: {
----------------------------------------------------------------------------
+ R1 g& S" k/ E9 l' l! i8 `7 o" A
04inc.php
5 `8 e. x+ x# W* B4 Z
<php
' t/ h( x2 l1 b( `
0 ]- |# w5 ^$ w6 n$ m5 T$ Q4 |% g
namespoc_e Core;
! S z6 i4 `. z" @9 t( ?$ I
include '05ou.php';
" f1 ~* i! W- a* C$ Z- K+ M
functio_n showinfo(){
* h4 L8 ~8 K: Y; Q/ |/ J
echo __METHOD__,'<br/>';
: h; m& d8 I' e5 u: r$ P+ ?
}
9 e0 e) S) X% h' b! h
) Z5 M, f+ h6 w
new \Controller\AdminController;
$ z/ P8 p0 t( {6 P( T3 R9 J$ G; B
----------------------------------------------------------------------------
0 o% f! ~) j1 h, Y* U# s" t2 x
05ou.php
2 _% l' ?: q8 h
<php
a$ ]. ?. U- Z: ?! B
namespoc_e Controller;
# w5 u2 I/ Q! B$ z
; V" ]; ?* \# x; ]% ]
clas_s AdminController{
" s4 E# ]: ?- T
public functio_n __construct(){
0 d4 P! q$ Z( }- p
echo __METHOD__,'<br/>';
) m. \- V& b6 T+ c6 m
}
% c" p8 |9 @4 E: C, W5 p
}
& `! {' c8 b' L4 _
----------------------------------------------------------------------------
2 W2 ?' W; F; }
- ?2 A: z- L7 j& c, Z7 m
4.引入空间成员:
# y, q$ |. s7 t9 p
/ @ c- W0 E) O6 }5 }! F6 [% _
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
' o2 Q7 M4 A- i* t8 C3 `4 r
6 ]) s5 ~( L: Z; u \
----------------------------------------------------------------------------
. O2 x7 _& J8 r L* x$ ^
3 r: E* O% {8 P9 L
04inc.php
- @) A2 M6 o2 f; }9 L. n
<php
- N% i1 L* u# H' H
namespoc_e Core;
! H6 p, ]& G" l1 F3 R
use Admin\Controller as con;
& g8 x! Y( {0 ^
( D* b5 ?1 v9 o, M" ^5 E, |
include '05ou.php';
) C5 S0 A$ g I2 W/ K& y& F `
, ]9 n ^+ k: F4 u% U; e
new con\AdminController();
5 |9 w3 U6 q; f/ g% r- c
----------------------------------------------------------------------------
! E7 ^* | ]7 p$ e$ B
05ou.php
4 [! B; A$ u$ z4 n _1 u
<php
, ~$ m1 O$ L+ H$ \! S5 @8 o
namespoc_e Admin\Controller;
. \7 N! Y2 [4 C
5 x, Y' G4 q3 F1 Y7 u9 Z
clas_s AdminController{
; Y3 ~, t# S& D6 M, V) I2 w: M
public functio_n __construct(){
! n9 {8 t* y, |
echo __METHOD__,'<br/>';
( s8 E7 c' ]# o7 d/ b8 s" A
}
( v. h. H. H7 `+ _2 g* p
}
# j3 e% h0 n) e8 N+ d. C2 B. p" E
----------------------------------------------------------------------------
! H7 Y; n* f( |# \. a0 o% K+ t; v
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
1 i, c+ J4 Z% e& p8 A
O! d6 {3 y# |% [' K1 v
----------------------------------------------------------------------------
: Q' t/ ]7 K9 H
! p4 Q8 W+ D# G' A0 A# f8 M5 M( k; ~
04inc.php
3 A! D2 j4 r! x/ p
<php
6 n/ C8 r5 n1 @
//引入空间成员类
2 P0 ]) L/ e3 Y) E: P, m
- ~* n: Q/ @: }% Q% d9 }
namespoc_e Core;
~5 e* m% f5 I( f
use Admin\Controller\AdminController;
/ T. ]( v& s3 i, \) m
include '05ou.php';
" y( \7 M$ G3 u* `& r
9 Z# g& Y, `! r) V* s' C
new AdminController();
) ?; O/ b& i" {$ q$ d
----------------------------------------------------------------------------
' e! {3 x: L, M" Y6 x$ t
05ou.php
; B0 B: T1 ^8 ]& z0 `3 w; h g
<php
5 M0 k" T- Q. v5 ]7 U! I2 ?, w& e
namespoc_e Admin\Controller;
1 T6 c; v+ H% c1 `
# b4 D5 [" R" i2 k$ u5 G
clas_s AdminController{
+ u3 R+ {0 ?4 o' W* j# a
public functio_n __construct(){
& C+ q4 f% A8 P7 K3 {) D; ? F
echo __METHOD__,'<br/>';
& A+ B% E% K1 f% K- e, v
}
8 B. t: e- ^ m( X
}
" P- ?# N7 `) K: c
----------------------------------------------------------------------------
& G# x( j" w2 Z i
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
& V7 W3 `& h& T9 O
/ V1 |$ b- J- x$ C
( {8 K3 j: \2 A# v4 B
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% E. t1 R( o3 M! z
5 j% \+ B8 _" G! h0 D
- L v- F8 {* `9 t& [
4 G0 P' G) ]5 e2 o- D
7 a' U2 E' T+ j) T1 Q
$ ]8 v i5 ~3 n! ?- Z
% r5 |& }) o- q+ B
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2