cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
) B+ W- x1 y; @- Z4 \
: r# @( G& _ [' B8 W! q4 J
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
. e' P- I9 h1 Y' E# c% p1 f
* Q: \& m+ N; ?
20181201105307520[3].png
(32.57 KB, 下载次数: 5368)
下载附件
保存到相册
2020-7-1 23:22 上传
# X+ I8 q* y" B# ]7 C( b8 F H
. }4 y( |/ ^# y' O
我们来详细的讲解一下PHP中的命名空间:
# K# k/ D3 Z' h' M) W
% g# z1 Q4 F# s0 w
语法:namespac_e 空间名\空间名;
8 \$ q- O! \1 s0 m
+ p& u( Q. L7 w1 C
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
/ r s2 K( L7 U6 B% n {+ S
2 @9 }8 l* i0 t ]* |$ z
----------------------------------------------------------------------------
5 |+ W& Z9 @; j8 Z- `
4 N3 N& e* e% u% O
<php
1 x" Y+ H. R; M! ?5 d* q8 z
, a! P6 E* R' k7 n0 v* D& ^
namespoc_e AA;
+ [2 C" l$ i/ E" _
functio_n showInfo(){
3 y. h2 m/ ]/ y
echo __METHOD__,'<br/>';
0 z+ m' f, f: m" }7 n
}
/ M6 t7 F2 C/ x6 m& e" |% ~
showinfo();
5 Y2 |! a' f5 j; ^- |
1 s! j7 i2 w" U; Z
namespoc_e AA\BB;
9 E" y! w3 }/ @+ c% I9 j
U1 `6 `* F5 }( |: @
functio_n showInfo(){
* x% i1 M% r" d0 g" B p
echo __METHOD__,'<br/>';
) }+ B$ z9 b6 K
}
+ j0 {5 x; y8 V7 V) v
//showInfo();
% S3 y" s) S3 Q3 a; U- a
----------------------------------------------------------------------------
. C5 p; x/ o0 x; `
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
+ @" B3 {! N' B# p1 V
2 {3 _: }% d( t3 p; N- Q1 n+ u
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
+ r) X" }0 p3 C3 A
5 M! I3 ~0 A( _
----------------------------------------------------------------------------
6 f3 P$ U, L! U2 |% }
' m r2 U- x! Q( }+ M4 B) B- @
<php
7 E9 ?1 {/ D/ s/ P, @
namespoc_e AA\BB;
/ z+ I! d9 @! d: E; v% S
functio_n showInfo(){
+ @" I B" f/ p/ Y& k
echo __METHOD__,'<br/>';
& `# N+ X; X5 `4 n H- Y! q" Q
}
5 X: Y. ]" b8 C1 a$ A$ o
namespoc_e CC;
+ l: Z- d n, T9 l! ^
functio_n showInfo(){
3 Y$ o& a$ n1 N9 H6 s
echo __METHOD__,'<br/>';
! F3 l% d: D1 V$ ~2 w) ]
}
" H, D4 i/ e2 R& {2 r* @3 u
namespoc_e AA;
4 |) R$ `/ f; }& q# |
functio_n showInfo(){
1 g8 N! J: S* y% ?' H
echo __METHOD__,'<br/>';
5 P/ a& B6 h- I9 x; t
}
8 b/ v8 r, M C w, V7 ?
//非限定访问:用于访问当前空间中的成员
( C/ s* p: O9 D" u1 b% ^8 T; d; o
showInfo();
& f) }5 T' S7 l
//限定访问:只能访问当前所在的空间的子空间中的成员
0 I5 D7 g" E! a
BB\showInfo();
: x1 Y8 m. v4 {
//完全限定:可以访问其它所有的空间的成员
* z9 G! U4 k5 k
\CC\showInfo();
. K5 F* O5 s) {/ M- T" R
↑根空间标识符
" u5 j$ `9 [& F4 k; b
----------------------------------------------------------------------------
% D8 c- E1 F+ |" S
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
* _5 a# @# X% h' {5 C& B
& F+ v+ I$ \1 E0 g4 s- |3 S
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
+ S, \& `7 D3 C) w" f
( f+ L* n1 g. W) K
代码示例如下:
4 r( N: @" V! O- \9 u. F \* e
" z$ ?) i5 q3 I* K v1 f9 l
----------------------------------------------------------------------------
+ K, N: K5 o9 ?1 U1 Y4 l
6 F5 A0 V$ K$ ^1 E4 y! Z0 U9 g; U
1 k: Q3 ~* ?5 s0 N
04inc.php
7 E8 [& f5 e3 s: K
<php
$ V6 c' ?7 s3 Q" W; {8 M5 ^$ s
5 {3 n+ B6 X: W3 h
namespoc_e Core;
4 ~1 |$ O1 D* N
include '05ou.php';
* }4 Z V' m+ i( j) L$ i
new \AdminController();
& W# S- q% Y" k! U9 W6 U
showInfo();
0 Q+ d; q: u; `- t. G. U0 P
# w1 V2 B6 Z, m, s* ~
echo P;
8 F: o- \4 S' V4 X4 d3 L! c6 V
//根空间中的成员,只要类的访问必须加‘/’
/ o/ z" u1 G) i: C( t! v& f# Z
----------------------------------------------------------------------------
7 n. B/ p$ n$ x7 [$ E
. S; a1 f- Y$ D; W' Z. b
05ou.php
N1 ]; ^; A8 P2 z5 [; P
<php
# F! F' C! E+ X$ H; ~( a* A: L" b
const P=5;
/ @7 L$ U R: }; Z& m: G
3 P2 R7 |7 a9 r# j2 j8 o% s
functio_n showinfo(){
4 u5 _5 {& C) g; t6 b( V( j
echo __METHOD__,'<br/>';
! h- P) \% m9 V8 G
}
3 s$ T9 c: l8 h9 I
/ { j7 w$ i F; E' D7 v+ ?: v/ W$ c
clas_s AdminController{
9 _* n% L% k' O! ?- L$ D6 q
public functio_n __construct(){
5 _8 r a! r2 ^! I w% N0 R5 q
echo __METHOD__,'<br/>';
8 r0 [% j: I) Q7 ^6 f
}
2 T7 H/ {! F8 [$ T# C: ^
}
d* s1 L$ h( e5 \6 E7 H" Z; u
4 { E+ X h( K' U1 o8 v6 m$ A0 J
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
) r. U% t4 j2 a P
----------------------------------------------------------------------------
7 s W: [) A+ ?1 A6 {8 O7 E
04inc.php
1 m3 @$ g# w: X* ~; Q, Y: T
<php
" w' P" Z7 a- ^9 G, t6 y0 c
* _$ G3 m. W) Q6 ~. e
namespoc_e Core;
5 d$ A4 a# g+ d
include '05ou.php';
8 a% ^' @0 a0 {3 c% t/ N
functio_n showinfo(){
" d7 w8 T4 ~6 K8 q* n
echo __METHOD__,'<br/>';
: j1 I; b+ o) F" b$ K
}
. w5 A1 g5 H1 q0 C
1 z( |/ }. {/ r2 ]/ n
new \Controller\AdminController;
& a5 ^# J: i/ j8 `# Y( h/ W" k) \
----------------------------------------------------------------------------
( |: a4 I, F& p2 q' e/ @$ i
05ou.php
" T5 R7 A k1 x' U2 P
<php
( `) h, o0 n# L( g/ i8 H
namespoc_e Controller;
& H# u/ F: B) k3 ^$ \
/ @ z2 z a& }$ H" K" x
clas_s AdminController{
; M3 u- p8 F; X8 \" P
public functio_n __construct(){
7 Y+ o5 n7 \! ^& [8 L3 o- W
echo __METHOD__,'<br/>';
. d' z; b: ?$ F5 r8 m3 J/ w
}
2 z" x6 H1 o5 {2 L$ c% O7 N
}
" `4 d4 t, {8 T7 Q: e$ G# y
----------------------------------------------------------------------------
0 n% J; C8 {5 o5 ?5 ^- {; C; p
1 Z- {- ~: p8 `6 L+ S- `; q
4.引入空间成员:
, p N9 H! B0 u# O4 |. g
" a5 s- @3 d4 @5 l6 t
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
# @- m, L# ] G2 Z' ^
* ?3 U$ [/ j& {5 O, G( f
----------------------------------------------------------------------------
3 i! W4 T) @9 M
' U; {* [ X% y9 O
04inc.php
) l# ]: ?! L- ?
<php
# c* N w/ A- F& A3 b( p/ z6 v
namespoc_e Core;
$ n) j! i; j0 z* a1 H: E
use Admin\Controller as con;
- k. Z& _% ^2 X; j
8 {1 W$ W. I1 F6 l( |! a
include '05ou.php';
6 f, Y0 C" V, x7 y! }9 W$ d
/ M+ ^0 [0 P0 u: e/ x! o
new con\AdminController();
5 B+ d" K( `$ h3 u
----------------------------------------------------------------------------
" N$ [6 T% u1 K) X2 a. L5 ]
05ou.php
2 Y! U$ g* q4 e& v. q: T
<php
( u0 N0 B/ G1 D8 }/ \
namespoc_e Admin\Controller;
* V7 _& Z# X l- ]
- A: t4 X- y: s+ |* x; W9 z
clas_s AdminController{
- v& G. Z: C( B$ Y9 T9 ?
public functio_n __construct(){
" ^7 @0 p6 M) z
echo __METHOD__,'<br/>';
3 S3 ~9 \4 \& `, H7 ? \& e( E) j7 L
}
& W. `% s8 ?( l
}
3 _" D9 Y3 l' t' B+ y6 I# b9 ?1 f( r
----------------------------------------------------------------------------
( t# T% K$ f' w/ ?' @( {; g
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
+ n9 W' g2 o7 g
! X2 Z; ~- [+ ]- X
----------------------------------------------------------------------------
* J. c' b1 v2 H s7 z4 {
& t! K5 n9 Z+ U! q, W5 Z
04inc.php
/ [; E: v, M$ K) }
<php
2 g7 K8 u+ v( N g8 U
//引入空间成员类
H1 M: j# u- {+ S2 m
! t# y8 r; Y, z* X4 L
namespoc_e Core;
$ F1 T3 I3 Q: O- y/ D* T
use Admin\Controller\AdminController;
1 Y2 V, k4 H5 p! @- |! K; ]
include '05ou.php';
) K ?! Z" }8 z1 K! N
( o% G1 u$ Z6 ^. {
new AdminController();
; M. Q7 w/ p) r/ k/ j/ S
----------------------------------------------------------------------------
/ B4 Z1 d' |6 \, F$ b* C0 O2 z1 \
05ou.php
# r8 Z& m. N$ R4 [6 s3 \
<php
8 e' K: @ y/ V& b. K2 M& D$ m# h
namespoc_e Admin\Controller;
: y, x0 g4 ?4 B G
3 z4 H+ Q5 A0 w2 ?. w
clas_s AdminController{
\/ Q& s& f! w/ c- j' J
public functio_n __construct(){
" a. h6 \# [" L4 B+ R, d: s# x) m
echo __METHOD__,'<br/>';
, Y* b- c0 o% ?% U- H2 e
}
) q4 A# c" k$ P$ r: ?3 w4 z( C2 y
}
- w8 @, M6 F: z9 e! `& u5 |
----------------------------------------------------------------------------
: T# U) e' _% x9 S8 ]
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
7 `% W/ n4 I) C
" d+ R( y1 b- s# O% r" q
/ s% U0 c' e! H+ `
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
, A- ~, R8 `) i' O8 L
: Y5 b6 X$ z, J" U9 J( Z4 Q1 ]
+ A0 R% h' Q, P! S$ O: T
9 t% b3 l, o9 ^9 d
' y% T7 K7 z6 Z4 \3 {3 \# |! J
9 E' b) X2 X% e0 o! b: }
" S4 Y$ v+ K9 z! K
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2