cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
2 ?, ?7 o0 `2 @' _( K. _3 X% o
( Q1 j! d( J+ L/ i: H% w7 X1 D4 q6 K
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
7 w/ }& l5 Y: o8 t6 e6 C
% i" ?/ r# V b; n
20181201105307520[3].png
(32.57 KB, 下载次数: 8527)
下载附件
保存到相册
2020-7-1 23:22 上传
6 b. ^$ d9 x# u, B! T
- y# F( I @' D6 g( b! g
我们来详细的讲解一下PHP中的命名空间:
" T* S4 ~6 y) b9 ~( v
0 Z4 m R- E. h, }
语法:namespac_e 空间名\空间名;
' m' E4 @' O4 @* \/ c+ t
5 [5 ^9 l: R" S; q
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
& ^; M1 E8 y5 d0 W
# g0 E- X" Z# u! M9 C1 h
----------------------------------------------------------------------------
" h8 r0 m2 ]0 ~. m8 d+ |8 I
5 x; \6 g6 q- a) |2 n! t
<php
I1 M Z2 R9 k
$ y5 D& c+ u9 k
namespoc_e AA;
$ K$ i6 z$ }; b" j7 F$ M, O
functio_n showInfo(){
: G, w. t% b+ g5 k6 [# a. |! h
echo __METHOD__,'<br/>';
% l5 y! X5 J, @; i
}
& x! o6 R# t/ v( u W' H
showinfo();
$ g/ R2 F+ P, M ~* W' b
. M$ I% p- D- C
namespoc_e AA\BB;
2 p- \4 R& w1 X0 Y7 H X1 s. |
' Q/ H; i: N2 z' f a- H
functio_n showInfo(){
( d1 d- Z0 u6 d& M6 E
echo __METHOD__,'<br/>';
5 J7 G& O2 B) I4 g& R, v. Q. m3 t
}
& W- S) A: s/ T0 b
//showInfo();
/ T2 e& [0 i: m/ e) y! W* u% i
----------------------------------------------------------------------------
. g$ [) g8 v, x3 S% i6 u
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
3 u7 r7 l9 y) S
9 ?7 b9 M+ I( o0 u
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
1 E9 W8 V( h/ C8 c$ s
' Y) N( X% d+ m( f6 D# u& S, p
----------------------------------------------------------------------------
$ p2 c) N* w9 C: y: Z
5 b4 F" I( o' W/ a! Z
<php
( S9 Q% e) A a9 T
namespoc_e AA\BB;
& ^9 g% M/ ~" ^% R5 V$ f
functio_n showInfo(){
( [9 q# v5 l) t& `9 }
echo __METHOD__,'<br/>';
3 |/ A! B: }8 H$ h" U; H- E9 \
}
: n& O; u4 c; D; w% Q: ^- i
namespoc_e CC;
; V7 n+ `7 z. [3 O4 k8 M M
functio_n showInfo(){
, }; q+ m$ f8 m
echo __METHOD__,'<br/>';
$ g' Y9 Z( x4 d# {+ q/ f0 o
}
$ y% p3 S$ ]: X# e# W7 a
namespoc_e AA;
. R3 |! a+ m) {2 {2 B
functio_n showInfo(){
6 D; H& x! H `# ^, G7 B5 Q
echo __METHOD__,'<br/>';
+ A5 d( A$ j3 M
}
* n) S+ R( Q1 B" \+ M6 l
//非限定访问:用于访问当前空间中的成员
" w3 {7 U% i C$ q# `* P
showInfo();
6 [9 T+ e+ r3 X6 Q& r
//限定访问:只能访问当前所在的空间的子空间中的成员
8 n {( I" G: m0 j' ]/ K; u
BB\showInfo();
( W/ z- E3 C, E& [( d% V
//完全限定:可以访问其它所有的空间的成员
$ P9 b6 q2 g& y
\CC\showInfo();
1 _% X. y7 @( b9 X* i" o
↑根空间标识符
* k0 N& t5 a; ]! K, j
----------------------------------------------------------------------------
% ]$ N0 u# W6 R) E' |, s
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
* Z( ^/ \9 k! d# O% C
4 Z; `; L0 S) h9 q
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
t# N( d# J, |; K5 v& U1 {
2 _ w$ ?# _. p% o
代码示例如下:
2 _! f$ D( w0 H5 @! \) N7 ?' G. n' v
; q9 z; ~5 ?7 a+ U+ O
----------------------------------------------------------------------------
8 e& z) a' K8 N( e/ r5 B& t0 Y& j% m
3 r0 a* b7 S0 P- @
y$ X( z8 L, E! V& m/ ?# i
04inc.php
0 N+ u0 _2 L, r
<php
# b9 {: T6 ~9 \/ r4 ^! f
3 ^6 q: q, p4 [% d
namespoc_e Core;
; B6 n8 X" S' X; |5 R
include '05ou.php';
0 s Y- H$ ?0 s. K' R" f/ Z6 ?. [
new \AdminController();
Z1 Q* q8 B# S( Z$ b. |; `
showInfo();
0 Y+ |6 k2 |8 \9 M: D/ V
7 c) j' f( p( x' c$ z% b
echo P;
9 f+ Y) Q8 S& n1 O" v v
//根空间中的成员,只要类的访问必须加‘/’
. A# |7 T* c) ~5 d% y/ W5 l
----------------------------------------------------------------------------
( C) f) p" M# Z' z( n* C& G0 ~
. p' D( D' S6 M8 T" Y- _
05ou.php
+ H* ?* A: d1 t9 q K
<php
# p) b5 T) z" C2 d3 S: T7 o
const P=5;
, |, m4 D. ~. W
. l* W# E1 o# C, k. a5 C
functio_n showinfo(){
9 K+ V. Q6 n( ~- O
echo __METHOD__,'<br/>';
* `1 t4 I* J4 F1 Y1 B$ _ p& L6 m9 k2 J
}
$ ?& W; ? e3 h
7 t; `3 g x* n% N) j
clas_s AdminController{
4 f4 w, u7 T: C# ^9 [2 H1 R, ]3 q
public functio_n __construct(){
- r7 o/ ]4 A; [9 F! l1 U- A3 M
echo __METHOD__,'<br/>';
3 z' u- `# {( ^. Q1 {
}
/ U$ Y% Q3 I, Z0 t* K
}
2 [" C0 ^$ p+ i9 f2 j6 _+ B
8 p. z1 M) Q* s& l
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
# S0 o+ V: e. k
----------------------------------------------------------------------------
Y, w0 B- V* E1 L( l
04inc.php
# G( X7 `9 x( X4 p* U
<php
: ], k3 [; F) U9 T) O8 m8 r# U
& v5 y3 S& g. \+ _5 g
namespoc_e Core;
- Y) d# @! l+ ^) g- K
include '05ou.php';
: O3 j6 t* @& o9 R/ Q
functio_n showinfo(){
+ M7 [1 Z7 c% A, o. C4 n
echo __METHOD__,'<br/>';
! x" t, h1 O" r9 p
}
$ X, @: s: J5 E7 r
% p+ \# } d# Z
new \Controller\AdminController;
' Z% [8 y+ Q4 y+ s8 ]5 i+ s2 O# q( e
----------------------------------------------------------------------------
7 D% d r, M+ o% U+ L
05ou.php
8 p2 g* {1 d9 K* q4 H& e
<php
8 ]: Z6 `( D* u' |, Q
namespoc_e Controller;
0 J0 i' m; Z! A# g
! R; \& N" D5 N% X
clas_s AdminController{
1 S* H" X; ?) W4 I0 F, J
public functio_n __construct(){
& t6 Y8 w0 E$ t% U: \- J
echo __METHOD__,'<br/>';
1 T6 J* ~; W/ T. F! b
}
) V/ _7 h, ]; p" m' [* F
}
{* Q0 K. v: W# ?
----------------------------------------------------------------------------
$ U% N) U+ H- K& s9 q9 M; j
7 \" z. O9 X9 n
4.引入空间成员:
$ p8 L( h' h1 u8 H2 N, O
- h P7 E2 d+ A" m
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
: T; ^$ ^0 f7 M7 S0 p# r4 [7 {
" I$ B3 v7 u: q
----------------------------------------------------------------------------
& x. t5 n8 u7 [4 }
! q2 p1 I* q3 a2 U3 C. [
04inc.php
0 A; [9 z: b Y
<php
d( W/ J7 v" F# @9 N
namespoc_e Core;
0 w! m# q- ]6 m! s! ^' y
use Admin\Controller as con;
) Y) E3 b- }: K7 C$ o, M
m4 h7 H; L% F& E0 h; `$ E
include '05ou.php';
: T5 N$ L# I. _
) o) f# X2 L! R0 G
new con\AdminController();
9 k6 Q6 U! W5 ?7 p, ]9 y U
----------------------------------------------------------------------------
; J! V9 L ]0 d
05ou.php
$ u* J) X/ [: {& V$ h
<php
; n. x& Y2 H; a$ Z8 E0 b- n7 l
namespoc_e Admin\Controller;
/ b& H' q4 F; E
9 E4 ~3 z2 u6 S$ K, k* |- a
clas_s AdminController{
* z0 q+ g# A: |, e
public functio_n __construct(){
: ~( M! \9 p: Z: y5 j1 K
echo __METHOD__,'<br/>';
% ?2 M7 C: e. Y* R1 R, @6 B
}
( M% H; Y" e) |5 @+ v
}
' g0 t$ x$ i4 C. |/ W1 c
----------------------------------------------------------------------------
" v' c9 `" Q+ }' H% j
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
6 P( O8 z0 Z* ?7 k3 R
5 u5 u. N2 `; O9 W: E- T
----------------------------------------------------------------------------
1 M* W: s) j1 J( C& d* U4 h
; G% d% P* u I- D: _7 f
04inc.php
+ _6 @/ ?+ p$ U& N) r7 K
<php
3 s/ b9 D) h( }5 u
//引入空间成员类
1 v3 B4 y' L _1 }
+ I: _/ P( X/ d. [' z6 _
namespoc_e Core;
. B7 f! I' a# [7 R" x
use Admin\Controller\AdminController;
0 P2 ]0 O/ U+ w
include '05ou.php';
( h+ {- M# w) b, w: N9 K# H
5 j% Y% @. t4 R; c$ V$ {
new AdminController();
9 F6 j: Q6 M: e
----------------------------------------------------------------------------
( G$ ]' [% i9 J3 A
05ou.php
. D/ H$ W8 S- y+ F0 z& U" O- C
<php
! F5 e" k, x; e9 B2 s
namespoc_e Admin\Controller;
* S! S# Q0 x. k" s, \' O
/ V: l+ X t# V7 i6 w. i
clas_s AdminController{
& {6 K9 o. t1 L8 u
public functio_n __construct(){
: V/ |0 D/ u% w. j4 f
echo __METHOD__,'<br/>';
1 h* k+ [9 M( A# O2 Z: Q/ ?, M& z
}
2 T5 {: H" y1 t4 u& Y
}
7 Q9 m; X# W5 r& z" Z
----------------------------------------------------------------------------
! R1 ~, v8 C P$ u" |& W$ \( M! i: m0 G
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
1 U' Q/ ^3 u5 X( g% H
9 M9 R+ \) x) F& W# k" i
+ f* M1 ?+ V+ @$ s! N
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% q: u2 f" y1 D" K
7 X9 t: Z0 d$ Z
* I3 k' M- L* ]% H% L
+ P5 b! M2 d. T4 X% h
# P! X. K v: }3 v$ ?) [8 N' X2 P
8 E! ?" G Q% ~- u: }8 Y
3 }$ e0 j! J' ]- O+ f
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2