cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
; }4 S8 V$ Q+ K( o% v2 m( H
$ L; p1 Y0 `: w# q: X
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
9 A* W" V" Z" I4 }2 K
# S) r) K0 u- L5 I# A" X# L
20181201105307520[3].png
(32.57 KB, 下载次数: 8760)
下载附件
保存到相册
2020-7-1 23:22 上传
8 h x* M+ f4 r# `9 @
) ^1 f `+ g7 m7 T
我们来详细的讲解一下PHP中的命名空间:
7 j- S4 p% b3 |& l' ^4 w- Q! [' Z
; @$ h! O5 F5 i0 w2 E
语法:namespac_e 空间名\空间名;
/ M8 e5 A) l4 k0 C
2 v6 y3 E b1 n/ P- N( d
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 o5 K. I e1 N2 A
0 ]7 r3 f S/ m" s4 Q
----------------------------------------------------------------------------
: E& ?% n' H9 m4 P& u; c
: a# u) I" l, K! O
<php
3 ?: {8 y1 c9 y3 }8 \7 a* A
5 X. m% w% N. o1 i. B! q6 @0 W0 l# V
namespoc_e AA;
- L- e& y% [8 S, J% A8 j0 h
functio_n showInfo(){
$ V; H0 g ?3 G- {
echo __METHOD__,'<br/>';
. L8 l5 P- O' D Y) S7 a
}
. `8 B0 _/ j+ R7 d
showinfo();
8 s8 F, c q7 Z3 q; `- i* `1 }
3 ~% C- E! Q( x' ]) r: Q0 |
namespoc_e AA\BB;
$ v5 m+ M# X: y" R- v
! y! G" H; z$ A7 K1 O! k6 M2 R$ R a
functio_n showInfo(){
( F8 d C+ w! T
echo __METHOD__,'<br/>';
* v4 J8 ?( ]& R2 ]
}
: n. C( b7 i, _# ]8 Y' @8 N* H' D1 Q
//showInfo();
! _3 p4 u! L8 H. Z' k
----------------------------------------------------------------------------
3 t. T6 {& ?5 l, o5 }
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
b# M5 `* N7 g; T
9 X4 V& q$ I: N
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
" @; _' T- q# q, w5 Y
* v6 Y8 N# ], C- V" j7 E9 g" ^
----------------------------------------------------------------------------
( H, q0 C+ t5 _1 H- t
& }! _( i/ D* P( L: i
<php
$ U4 A' h& b4 z L
namespoc_e AA\BB;
: G$ W2 Q# ]2 |
functio_n showInfo(){
7 G) N8 A0 ^9 ~+ D$ X- p/ u( S
echo __METHOD__,'<br/>';
- ], x. k5 S3 ?, r
}
) D6 X/ w& B* o( e
namespoc_e CC;
: G7 i% u! ?1 r
functio_n showInfo(){
7 B: J( Z' j8 J' y0 R
echo __METHOD__,'<br/>';
( g( E1 E) O" k2 l j, U, ~
}
; ^! |/ O" G9 r+ T; _
namespoc_e AA;
& m% i6 [+ Z% m0 W3 q
functio_n showInfo(){
; h+ T. |) N$ u# Y" S
echo __METHOD__,'<br/>';
: l3 E; Z3 O' @. D
}
! R9 T0 @! T$ r# \9 t0 ]. I* P
//非限定访问:用于访问当前空间中的成员
' u6 \; M$ u, n6 J& i
showInfo();
6 ~ ~) C6 x* O
//限定访问:只能访问当前所在的空间的子空间中的成员
1 F4 Q; E( L7 ?3 b7 M7 w7 B
BB\showInfo();
, K3 w3 S; D2 j, C! v( B S
//完全限定:可以访问其它所有的空间的成员
7 w2 r+ h% G7 m: `0 d
\CC\showInfo();
/ Z+ `# z/ r C6 v' U
↑根空间标识符
% p1 |" j1 b, m( Q& _, F/ O* P) ]
----------------------------------------------------------------------------
1 v; w* t8 u; Y" c7 I
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
8 f0 j- T. t3 {! Z( w
: ?6 C* p, U* E4 N; S0 }- z7 l0 Z
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
9 s1 o* G9 X5 @5 L) L$ \3 L+ P X
( e6 H) m% c3 w
代码示例如下:
! A. L5 w/ a% f1 W+ ~* _
* Y/ O C" t; G. R8 ]6 {
----------------------------------------------------------------------------
$ h; X; h ?# d2 |
% p! c! y% b' p5 Q8 a E: Z: t
3 I; Q$ P3 E; K3 b. w
04inc.php
/ U( d# H! ~/ P0 d8 m
<php
% b* b1 m* C6 n0 F; a
1 U0 e0 `) g( o- D8 c
namespoc_e Core;
( z0 a$ f0 j9 c$ _/ Z
include '05ou.php';
/ b8 L( Z6 v: [; H4 f" {& Q8 V
new \AdminController();
! L5 X! G1 \( E; u9 B
showInfo();
2 \: P( G: N' F' T" s
Q- [# |9 e+ P P
echo P;
% Y& _% @$ Q4 G/ q1 T
//根空间中的成员,只要类的访问必须加‘/’
8 y2 h3 A2 y6 t) Q! x- L7 i- H
----------------------------------------------------------------------------
. {* d! T( {( E) v
! G: L+ W/ P7 a
05ou.php
8 k+ {9 i# |7 w8 v5 p" Q
<php
! N2 f) h! v+ M3 {1 a2 i- ?# W0 x
const P=5;
# @5 x; u( j; }3 c0 B
6 t* [7 h- _0 \2 m% }3 R0 K/ g, f* f
functio_n showinfo(){
8 b) N0 `+ b U
echo __METHOD__,'<br/>';
8 x" D& E- v N3 `9 _, Z
}
) Y( G8 c5 n" X' j& F4 E$ |: `
, R; |/ c( ~. r- S; Y
clas_s AdminController{
* P$ p1 i8 E" m2 \! b6 z, V' m0 T
public functio_n __construct(){
1 E R/ r, b% q+ V
echo __METHOD__,'<br/>';
+ u& `: \# K& d. k B: {
}
, u% _9 v6 x( `
}
7 p+ x- T/ i1 W$ n& p
|- B+ }- g6 u* u
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
* e U; X4 @, z- V
----------------------------------------------------------------------------
, n! |! s; O/ _& S5 q+ _
04inc.php
' f4 L7 U4 e( Z. h9 L4 E2 H
<php
; S: D( n3 I9 ~6 h0 X
1 B: `- q7 M6 Y# p$ N
namespoc_e Core;
9 i* _8 a- z( H* Z) }1 \. X0 F7 m
include '05ou.php';
3 g9 q* ^8 H: c# ]$ U
functio_n showinfo(){
5 a- a8 C5 Z* F* ?% T
echo __METHOD__,'<br/>';
7 n- o3 b) ~; x% V1 F% ]
}
. S) f/ z2 W5 L& z3 _4 m
( G" O* u4 |% d. ]% v, e+ x: w8 @
new \Controller\AdminController;
7 O8 g5 ]- S! X$ R
----------------------------------------------------------------------------
6 k( x* H2 p' \% k' d) w0 J/ W: {+ ]
05ou.php
$ r5 h: w8 Z0 ]* Y! y* T, z
<php
+ V' X1 ~( Q0 a; H
namespoc_e Controller;
# Q& v& s. d( X6 q7 ^( V& P" {
% I+ @$ o; D8 k7 i: A
clas_s AdminController{
+ F1 k' @1 N$ N u0 G
public functio_n __construct(){
1 B4 Q# I2 z' E5 ` A4 v& }- S6 d: q
echo __METHOD__,'<br/>';
# W3 f9 s. u' j5 ? j
}
) d, L( h! G7 W; g& b
}
$ q+ u% d0 j# D! q# @. B$ e
----------------------------------------------------------------------------
1 I3 M9 m% U3 o" N! l3 \/ s
3 }' ^7 u( o# W9 y0 V! }: t
4.引入空间成员:
$ w8 f* ?% k& R9 t4 c# ]5 H! W' e
' q" j4 ^3 E9 r9 a: I( y# f I
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
8 y+ {& z/ y2 C" o' m
- W9 }8 r0 y# L& \
----------------------------------------------------------------------------
" \" B ?9 L: F' T
5 \ T, R/ J1 `. A, |
04inc.php
% O/ f/ ~! N7 b& q: A4 f
<php
I {4 y! g$ u, L2 C8 A
namespoc_e Core;
4 \, J; C9 s/ C7 U8 ^: F
use Admin\Controller as con;
- N5 g9 ]% ~1 E% B9 U% x" t
+ J* c/ J) m2 q0 D. i/ |% k# `3 w/ x
include '05ou.php';
4 z6 b: P+ P. X2 H# y' {* E
- `' I( ?$ M4 k2 N3 V
new con\AdminController();
" z* ?2 c9 }: b
----------------------------------------------------------------------------
$ I- k( O. p A0 @3 h" W4 M$ p* L/ x
05ou.php
: N7 J1 X; ?% A2 u
<php
0 I7 G3 N4 E3 f+ B+ _* p0 P8 d
namespoc_e Admin\Controller;
9 S, z3 p% I; ?, a; E0 {- T
6 l, s- O) O( B- M9 p3 F
clas_s AdminController{
& ?/ ]8 Y6 L5 [& P9 n
public functio_n __construct(){
% m. `2 i0 R7 f8 v
echo __METHOD__,'<br/>';
9 }9 a& @0 D$ X5 ?) i
}
! b) H8 y& Z% [$ E! g: [
}
4 ?, n/ ]" J7 _: B$ i' }& j* H
----------------------------------------------------------------------------
3 E/ j9 `% N) J* E( ^- _; `
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
) X& j# M( _5 ~, f6 c
3 B; W! l R+ U' ?
----------------------------------------------------------------------------
7 U# J, w3 F/ X; E: O/ l7 Z
7 X" F3 Q, J4 Y7 w
04inc.php
* c( _/ a- J5 s5 p1 b
<php
' `! ]7 y) @' o" Q9 U& B+ M
//引入空间成员类
& u; z% @& |' z; N. W' j8 S
0 K/ U5 s+ Y2 w! ~6 y+ V' X
namespoc_e Core;
9 T- w. ]+ n+ C
use Admin\Controller\AdminController;
( g$ O8 p3 }+ S1 p1 B6 q% q
include '05ou.php';
- |/ J) U; w1 G; W' d, s. N# ?
% D0 l1 Y1 C L, N5 I4 |
new AdminController();
" B! }) X C; |; @2 y- V0 {2 o
----------------------------------------------------------------------------
- n! [$ S3 b( U" Z: n1 a
05ou.php
M& `( i1 ~* u& _ g
<php
: E" m: d1 ]4 N7 {; u
namespoc_e Admin\Controller;
) \5 ?4 g% S5 Q1 f G3 @
% |/ e0 k- F5 h3 U7 ~- d+ c1 v
clas_s AdminController{
& u3 ? U: E L F! X6 O; k
public functio_n __construct(){
$ F. y$ ^9 V) u/ o# {5 ~
echo __METHOD__,'<br/>';
! B4 [/ I" x. S/ b; e
}
! t8 ~* A" j6 k- C( i
}
* l! O/ J& @+ `, |0 l- i+ a* q
----------------------------------------------------------------------------
: K5 w4 k/ V* s1 E) X9 D
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
, Z& L/ V: G2 O0 e( w5 l: h& a, F
, S( K1 P# R3 \- w R7 O
0 [% J& D! J5 H- g6 j
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
4 Q7 K A9 O/ t: @) u: J: [. ] A
0 P2 M m5 b) ?6 D
9 i! A- T+ Q/ o2 g" P3 K" j, T. X9 R
+ a! p8 T- O# {- r9 @
( c& a7 _! G! `# d9 V. \
+ L$ t9 ~1 r! n1 ]! S
( {& s) s4 R3 E$ F- p4 Q s i
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2