cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
8 ^4 F/ G" {% N& L& Q" v: ]
5 M1 N: z% ~8 m ]
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
$ |6 g- n$ i4 [# d) x8 v
! P4 p& b- {( C1 @; T" @
20181201105307520[3].png
(32.57 KB, 下载次数: 8150)
下载附件
保存到相册
2020-7-1 23:22 上传
/ J3 _; k( d2 X2 V9 g
+ ^4 w/ y' \7 x S$ ] S( f1 E; `
我们来详细的讲解一下PHP中的命名空间:
; j" e/ q' U1 L
% b- I6 M" f& x" R( D- m; s
语法:namespac_e 空间名\空间名;
" ^( U6 A- ?; l- U5 D, |
/ Z& Q- }' W9 \: `4 k6 S
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
8 c4 W0 X! z* `: h) S( v; j2 s
/ Q( X/ H/ W8 v% J
----------------------------------------------------------------------------
" |* o0 o9 }4 I# A& O
+ ~2 G( v6 X2 \& K
<php
4 Q! z1 _* p* c% o! G
0 U1 O/ M, m$ ^+ i, _4 n
namespoc_e AA;
( ^" {# K' X H* `, L# l5 @" s, \
functio_n showInfo(){
) i, A. [7 {9 l5 |
echo __METHOD__,'<br/>';
; M9 w' B) z# [; ~! b
}
$ N2 A, e* a1 A2 h6 D
showinfo();
% K4 G! n# V$ G
: @* a" P9 @: \
namespoc_e AA\BB;
5 \: H7 t% x7 p' J0 A( P
* ]& w: y' x3 y. d* p j. P N$ D
functio_n showInfo(){
: _: w" I: a/ e9 b) x. y# _
echo __METHOD__,'<br/>';
8 a- d$ Y% I) `
}
5 F! x; `, ~# S4 l2 {2 S! Z
//showInfo();
6 x) o+ u. S' l
----------------------------------------------------------------------------
3 x) }9 w2 y- v4 J; D! |
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
# h6 @3 T1 K& {2 y; N2 \
B2 _+ }# d) V1 |
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
- t) t( R* E9 R/ b
6 \4 K+ Z! F4 h- X" y* `' y
----------------------------------------------------------------------------
* [/ q2 u9 E. R% s! w
& ]# T5 M( b3 p- F& K
<php
/ b4 t* n$ f* t' ?' `5 k% f
namespoc_e AA\BB;
# U7 c- r" G$ ?, S# ]: v* Y$ y6 W
functio_n showInfo(){
8 N0 n6 E; y6 M& i6 K% k0 K8 J5 B
echo __METHOD__,'<br/>';
! ^2 L9 m% \4 e, y u4 I2 B4 X+ K
}
6 R s4 J% g! J( l
namespoc_e CC;
) W& n7 g/ F3 D9 K* E5 ?" \3 A: C2 P
functio_n showInfo(){
! M& ^) m# J. {2 J
echo __METHOD__,'<br/>';
8 D6 A& ?; `2 s* \; f4 K# a
}
+ |9 E. C2 Y9 S L" u
namespoc_e AA;
. _ \" t% c* H1 F2 p0 v5 z# I
functio_n showInfo(){
5 W, Y$ a @# v
echo __METHOD__,'<br/>';
% y% z+ k( M& e& X: \% R3 D
}
/ O! E% C7 F# L3 z1 m! I
//非限定访问:用于访问当前空间中的成员
% S% w+ u, d; {$ n+ I! Q( Q' d
showInfo();
4 W+ ?: n7 i7 u" g
//限定访问:只能访问当前所在的空间的子空间中的成员
, s# W( K9 x& k6 z, N$ B/ U+ i
BB\showInfo();
) G, E1 j( [4 j* v# c# \
//完全限定:可以访问其它所有的空间的成员
* O5 j* c) L6 w# p% w
\CC\showInfo();
4 a% L$ H7 N7 G7 M- k# T
↑根空间标识符
9 R7 J; A! j) D7 l# ]
----------------------------------------------------------------------------
, I& J! n6 H/ w5 w$ s0 w3 {
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
* P' m% u( ]4 n2 Y! B. ]+ d
; i" [8 i; e4 x& j
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
% `" U# r4 E1 g& v' h; D% X; W
1 P* V$ l' }: ~ w- ~3 s
代码示例如下:
$ a6 [" Y8 `- J8 k- f9 z# o
% D2 p: I6 Q( m% G' h2 s# I
----------------------------------------------------------------------------
1 I3 [: i% @% H8 a I" K3 a. z9 H
* e3 P# h4 X1 h- r( x
Z8 F6 A% l) b4 R6 o
04inc.php
# N6 D9 r2 s# x) S. |$ l
<php
# F6 h* R/ v* S, Q% v. j: @( @! Z
( A$ M: L& h9 L& h, N+ p
namespoc_e Core;
4 v) d ~/ E+ F" D
include '05ou.php';
5 ?, _$ {0 I% |6 A
new \AdminController();
: y" `* h6 z: |2 j( P, e8 }
showInfo();
5 `; z( o* ?1 S
6 c+ {6 a3 N0 [* l: S8 _3 N* e
echo P;
+ Q, w4 c7 ]' W. h' |% R* n
//根空间中的成员,只要类的访问必须加‘/’
: G% A% [% k4 F! y
----------------------------------------------------------------------------
4 o- H; \3 \$ |- l. p; Z
; u* V/ {: \3 E" y3 X& j/ }
05ou.php
2 {% B }. V4 L+ g9 |
<php
# h9 C+ _5 H0 Q
const P=5;
7 ]# u1 n H# K- V
% H( K8 V' T: l; K6 K7 S
functio_n showinfo(){
1 s9 L) i6 W% D1 v7 U7 O
echo __METHOD__,'<br/>';
% U$ a; g' z4 G! H
}
% P2 ~. U+ Y! A/ H( l
% O( [7 l, c T0 K
clas_s AdminController{
7 r5 i$ O3 D# c/ \* g
public functio_n __construct(){
7 i4 \2 b5 U! y$ o. U# @/ L
echo __METHOD__,'<br/>';
- h+ @& ~+ D A' `6 a r
}
/ ^. H9 T. A3 V7 m- Q& M& k+ { G$ A
}
/ S7 R/ b- A% h3 ^/ a
) U* j; [7 V& k' G
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
, a; L. j, N2 ~5 R4 ~* E
----------------------------------------------------------------------------
2 s5 y2 n8 R/ `2 s& N" F6 C3 {
04inc.php
5 G# W4 T# T/ ^9 P8 {0 i0 X2 q9 T
<php
/ `0 ?7 o# N- ~" c
2 r3 l, P0 Y7 N5 y; f: Y
namespoc_e Core;
& D" R+ k* J1 e* K7 @
include '05ou.php';
! t3 Y& |- |$ B. P# ^/ |& b
functio_n showinfo(){
, U2 t* G9 c( F
echo __METHOD__,'<br/>';
) h9 `& W% Y* @% ~
}
: g7 [- x( @& L( g# @8 x
' q1 E3 Y, Y, l# w/ h2 {9 G
new \Controller\AdminController;
- T2 C2 [3 ]& ]) w
----------------------------------------------------------------------------
% T0 u; B* w9 @ a9 D
05ou.php
4 u7 ?3 Y" Y* K$ ?8 E, f% K$ c* g
<php
' ]+ D# ?( U6 `2 C0 k5 \9 j
namespoc_e Controller;
! [- b& p) t/ d" D d
8 \; B. c4 }; s6 l0 P
clas_s AdminController{
$ h% C7 s7 x p( s
public functio_n __construct(){
) ?! Z9 P9 B4 T& M% G# {
echo __METHOD__,'<br/>';
& J; |* N( R w8 A0 M" d
}
4 d6 C- h0 n6 U: `* t9 V/ I) A5 I6 U! M/ \
}
- }" n5 t( Z' R/ V
----------------------------------------------------------------------------
* s1 [4 b% ^$ F. j' S5 R
3 H$ g: x4 z$ _4 b0 _
4.引入空间成员:
9 m1 e4 W' D$ B: G
5 Y5 n# O7 c" k# V. C0 O" k/ v
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
- L" N& X: V' p) p
) a# y; ~2 V3 @4 P/ ^' }# E
----------------------------------------------------------------------------
: t% p, g# X8 t; g
5 K3 i' h d- O+ h, U( `) @! m
04inc.php
; V5 A" n9 t, x6 A( k; ]
<php
}8 z [7 h) F' w
namespoc_e Core;
! y) [1 b G+ ]6 G' _
use Admin\Controller as con;
3 |5 K$ k8 H- @& d/ ^
, D( s( P' o. D* g
include '05ou.php';
/ U4 j& j7 m9 t( E; H
6 ]3 o" `# s% X' ]5 J: K( r7 a
new con\AdminController();
! n3 \8 a# @( `! W; w
----------------------------------------------------------------------------
1 |9 R: O/ J2 L
05ou.php
B( b$ P2 q2 H. V
<php
6 z" ^% k) ~ W' b! `) u, O( M. I
namespoc_e Admin\Controller;
1 Z& I' S/ Z7 M
. t4 j4 Q- ]& {$ L
clas_s AdminController{
# V5 V3 Q8 c+ s" Z v+ x0 u
public functio_n __construct(){
# W5 L% D- Q+ @* C
echo __METHOD__,'<br/>';
. [, e1 K7 Y4 B, x
}
3 p$ |7 T4 |% B) v% r- @% w
}
* B. S1 y9 T6 `# V- h- o$ [
----------------------------------------------------------------------------
. ]# n. |, Y: y: e, D( A1 M& j
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
! i$ ]: n( Z2 Z6 A# G) R' m$ v# y
, S7 Q$ I8 i) h5 i4 i( O
----------------------------------------------------------------------------
8 q, b; N1 P. n/ d5 A- h
1 E" X: b2 ?# ]( }2 G2 i0 H( f# ?; k
04inc.php
n% E' ^ ]6 D9 d* s3 v
<php
9 ~, W6 V. ^' `: Y' F
//引入空间成员类
& V& v) h' k2 b3 ^# @
1 |' W! {2 \* z5 l; }% m. M
namespoc_e Core;
# ~2 w- h' K6 e! b% {" \0 C& N( _
use Admin\Controller\AdminController;
4 D- |1 ]; _2 Z, d" J
include '05ou.php';
. J S# v6 R0 l3 ^9 e! d B, P
. Z& s' M" E9 C
new AdminController();
: _* O% o0 o t2 f6 {
----------------------------------------------------------------------------
& }- Z* d& X( z+ R
05ou.php
& q( u! U& c4 }) n! h6 U0 i) j
<php
: A0 N. m* F$ z5 m0 S1 ^+ \/ S
namespoc_e Admin\Controller;
6 }7 E7 t% _- G
9 G4 t2 P( j0 d+ ^1 l
clas_s AdminController{
3 Y- s$ z5 U |8 q
public functio_n __construct(){
: T2 c: i$ R( ^
echo __METHOD__,'<br/>';
6 W: W& i( X( T4 c
}
; R% E/ q' W; m! e
}
" h! m' i( ?$ @3 K$ C
----------------------------------------------------------------------------
2 O; `- y2 Y' R, s
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
0 Z1 Z+ H% R8 R& N* V
5 j! @* A& l, Q, b* f# F( [6 l
$ Z+ D& a2 \, ^* ]
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
! U0 F+ s1 m D5 n+ I' B
9 w: \+ t6 L# K ^: |2 v
& ^: E% }' F- ]5 ]$ @8 u6 b/ K
0 X* K! r! Z& [4 R$ @3 S
7 ?- a/ d; a# v9 \* x
6 X A" `5 A* J2 t& ^
' T# U4 i2 E. j; b
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2