cncml手绘网
标题:
php中命名空间(namespace)的作用和使用
[打印本页]
作者:
admin
时间:
2020-7-1 23:13
标题:
php中命名空间(namespace)的作用和使用
1.命名空间的作用:
0 c% i, S& a$ E2 g, E- {
# F3 m' s& g: p0 Y% a4 K9 M6 Z
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
1 h, a) w5 h7 Q
4 n- T# A; q: }# c4 y- {
20181201105307520[3].png
(32.57 KB, 下载次数: 6671)
下载附件
保存到相册
2020-7-1 23:22 上传
, Q$ D6 ^6 k2 I$ r
# f* z( ]* {1 m) R, J
我们来详细的讲解一下PHP中的命名空间:
7 K: A7 h2 a3 g6 j) `4 B( [8 |
; x+ b& @- _# b4 n5 x- P. q; M
语法:namespac_e 空间名\空间名;
4 s- i# _9 {8 o( H1 Z' T
0 h. i$ |% i- z9 O; w
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
0 b0 d5 D- A/ {; b
, ]( Y1 m. z; J$ [
----------------------------------------------------------------------------
- d% S: O' ?0 ]
A6 G- W( S( n2 f/ b8 ]% c1 x& `
<php
/ p$ y2 n4 M% K( T: o1 \& V8 L
' z3 U( c1 S9 l1 g3 E
namespoc_e AA;
) i% E9 F1 i+ b. h
functio_n showInfo(){
" a" k# H6 i% x
echo __METHOD__,'<br/>';
0 e% ]% V& e/ |0 T4 M7 w
}
1 I8 O, n7 }* b: C" W3 K. X
showinfo();
6 v) ?) X) k1 D
* X$ P3 p- W6 F$ V
namespoc_e AA\BB;
) L# s5 G/ R: b7 T
8 i2 |8 a$ `) w! ?
functio_n showInfo(){
. }: B) |( M2 y$ ?7 G
echo __METHOD__,'<br/>';
, ?0 i5 d4 d( T2 z
}
, M! z2 M7 C( r: c2 X( n& j4 k
//showInfo();
1 X/ Z* q* E) N$ k' T E
----------------------------------------------------------------------------
7 D5 W: ^+ k" E/ `0 g. I- f4 s
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
I+ N. I( e* p) @
- H) }9 C; G$ b2 X: J
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
2 d' G! h; G. ?
) U( G: x# `9 n' `
----------------------------------------------------------------------------
# S1 @( x9 ]# K! g/ E
: G J* n+ n5 z# Y9 o9 y7 p# A
<php
& Y' J0 y9 C$ o
namespoc_e AA\BB;
! U8 b( C: w$ W9 D& r
functio_n showInfo(){
9 |6 [4 O* _2 _ `8 f
echo __METHOD__,'<br/>';
1 I- P3 ?, X- V# \
}
E2 y( Z& n' s! J9 w
namespoc_e CC;
8 y( l8 V; x* A8 Z7 {
functio_n showInfo(){
! m3 M6 [' @; C% C
echo __METHOD__,'<br/>';
4 w ?- F0 U7 `6 Q1 j$ ^1 z
}
$ G% K" M6 M; h n. \
namespoc_e AA;
; P" Y+ R, j% O. r
functio_n showInfo(){
* |% U2 L: J. j) {4 f: V, w) x! K! U
echo __METHOD__,'<br/>';
" ~! \3 ]6 B/ C. q; W' ^
}
4 F1 ^3 m( N9 D6 Q6 U& W
//非限定访问:用于访问当前空间中的成员
; _' L& A/ G. g; j% n
showInfo();
! e) R6 g% l4 `2 S
//限定访问:只能访问当前所在的空间的子空间中的成员
& ]3 x- r' a9 s# C
BB\showInfo();
& x9 C5 a8 E/ N, B) l* M9 U( X
//完全限定:可以访问其它所有的空间的成员
: H0 P, k" ~. a4 l
\CC\showInfo();
" o. x/ r: l5 _9 h; ~
↑根空间标识符
( E' Q3 m" u% E. E3 Q2 H$ F/ x
----------------------------------------------------------------------------
# G7 m/ J. c, d* D
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
& o; d7 D5 m) r' u" D! x
( y. a( i: R9 _9 J( n
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
# ?# G9 g$ S! D' f: H
4 y6 t5 u4 G* S0 S) n
代码示例如下:
4 Z; t! I( _2 e4 | D9 t
+ ]9 t/ E9 {" `5 _
----------------------------------------------------------------------------
1 M, b- c* Q8 l- ^5 f# G3 r
2 L0 |" m( r9 i9 Q, e( u
' n$ H% S4 [5 a' Y" @6 t
04inc.php
9 x. z# R+ H4 U5 \3 S
<php
, |/ H# d8 V( @
V4 N; }# N2 F- M
namespoc_e Core;
' c( O# R! B- b) p! _. q
include '05ou.php';
9 k$ j. a' t- Y0 {' i4 Z; {, ?
new \AdminController();
' e3 l: g: R+ s3 r0 G9 t0 o, Z
showInfo();
# |- h2 ?5 X o; l& C4 z
' j, _7 b, o) @& l9 q) E5 p
echo P;
N$ S$ {6 |- w( c- W& A; {& ?
//根空间中的成员,只要类的访问必须加‘/’
% k' [- r4 ~. m/ ]
----------------------------------------------------------------------------
8 n$ c1 c" ~/ T" x) r- x0 U
@8 f( C/ \6 M+ ~6 F: K7 j$ c
05ou.php
6 r( q C6 _1 r
<php
! _0 P7 L4 {; o* n. B1 S' O8 M I
const P=5;
, Y8 J) ^) Q. j* H
1 d1 B9 F1 Z( R6 j' W
functio_n showinfo(){
4 q# K, `4 ~) l; M
echo __METHOD__,'<br/>';
! n9 A N7 h0 I8 p X
}
! R( G3 c1 o! k9 v
* n' E! I* D% Z* J
clas_s AdminController{
3 W( x) m8 T- h9 O7 F% M
public functio_n __construct(){
) `0 l: v/ J! G/ ^ d2 p+ k3 z1 H
echo __METHOD__,'<br/>';
b* G* j. y: J9 ~! [
}
7 l+ h! j4 E7 P/ H8 t$ B4 ]
}
6 j0 l8 O, L* h f6 }* k7 a
5 A" d& \% T d- K1 s
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
( p6 ~0 g0 I: k8 R7 g J
----------------------------------------------------------------------------
, u% t2 ^/ s5 @9 Z# v
04inc.php
s7 A" f5 A; [2 B* Q% b
<php
% h& ?/ I3 F, m' g7 ^9 d% `
) o+ d( v2 B( q+ t* Q
namespoc_e Core;
' C/ G; @* f; m- G0 h- d
include '05ou.php';
8 k7 M+ G m. d+ F0 S
functio_n showinfo(){
& d1 D6 ?, r# Z% \0 g- ?! T y9 v
echo __METHOD__,'<br/>';
4 Q) U, C0 w. L3 B2 v
}
, e- Y" ^. D2 M# u6 p$ G+ Y
6 X5 t7 r# X( m
new \Controller\AdminController;
! c8 O3 U8 w5 q1 T3 K. ^
----------------------------------------------------------------------------
( [6 X/ i( \% V
05ou.php
7 V( `0 L* X8 y" d! C# o2 h
<php
$ y* B3 O) W3 w- F9 U4 Y i% G- y
namespoc_e Controller;
3 X1 K. [/ b& A' K
! { x( z% q( }1 Q6 x, \; ~3 k" ~( q
clas_s AdminController{
! }. f, h3 Q, L L' a4 j1 I
public functio_n __construct(){
* ~/ q* K$ A; s5 J7 S7 n, `4 i
echo __METHOD__,'<br/>';
6 }+ ^& W' U7 m Y! \
}
/ c0 r9 h5 D9 i+ ?3 G
}
- L+ }8 |2 z( b* g4 G# F7 d
----------------------------------------------------------------------------
4 e8 R4 u( N4 Y
E, k' S7 N/ p
4.引入空间成员:
8 z: ] n v- [) W
% m" L2 ?- Y {: H* d& a
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
4 B' o( _% }1 {$ U( k1 |) }
9 v! R5 ?! a, h* d3 q8 d( F
----------------------------------------------------------------------------
) M4 L! e$ ]- { E+ ~. T
5 K8 D. i( ?2 G$ z$ d
04inc.php
: v# [% u/ Z5 P, E( f* h% i
<php
+ T& D- X( u1 ~. \
namespoc_e Core;
6 J3 p" A5 G8 b# ~0 {$ ~+ a q/ A1 [
use Admin\Controller as con;
6 J# t& ?9 B+ V. N2 [7 }6 H
; t7 @3 Z& E4 F; v
include '05ou.php';
8 Z3 K2 s8 x% E: {2 j; r
4 C: ?0 q5 |4 a+ [( J
new con\AdminController();
+ G" d# S' {+ I) u( X& B
----------------------------------------------------------------------------
2 e3 h5 d! \( C# d
05ou.php
' V9 n: n: [, k9 ]
<php
; k. c; l* I. P5 c; d1 Z, K
namespoc_e Admin\Controller;
! j' E& ]0 ]7 V: W( F; x
- K- {; e. p; @& p
clas_s AdminController{
% I1 V' l' P. Y' N- c- x4 T
public functio_n __construct(){
, _$ O6 Z$ j {4 z
echo __METHOD__,'<br/>';
0 k6 Q/ M& l+ S4 f$ a, ], q- V
}
- C, C5 C* T0 w8 }, W8 m
}
* t0 [7 }# @8 u
----------------------------------------------------------------------------
. P& |3 u9 v9 `7 o8 W, \
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
: e' F: [4 O& ~4 w, l d
& x+ z* {# h v! V
----------------------------------------------------------------------------
9 A! V+ I- a) U
( p6 z+ Z8 b- l) p% `
04inc.php
* c6 T- |3 j- ~
<php
! W2 T3 U2 L* }3 c/ s* f
//引入空间成员类
8 b& l9 b+ a5 x* t+ F1 O
6 H2 D8 z5 b$ ?4 O! D
namespoc_e Core;
* ?1 S. [4 [- K0 {6 B+ i
use Admin\Controller\AdminController;
4 X' r: Q' H( }4 W7 K- P# t
include '05ou.php';
# P4 Q u6 A- M
0 h, v; P. C6 t
new AdminController();
$ Z7 y0 O0 Z5 t% T0 u' r- X9 x( c7 Z
----------------------------------------------------------------------------
% h! l$ X- H; {8 @9 i" k6 M
05ou.php
* T0 Q4 b, d: e
<php
' _* k! N L8 T) B/ b2 S
namespoc_e Admin\Controller;
$ T# a- t2 G# |& P- C5 Y
3 u$ [- i S Z0 f# {2 o
clas_s AdminController{
. T' I" D( ^5 d
public functio_n __construct(){
% w' c) t+ b( E% u9 h
echo __METHOD__,'<br/>';
6 i6 Q2 N5 l- }
}
! D9 T7 O& r) z& u" i: \
}
) d3 b7 ~/ O3 b
----------------------------------------------------------------------------
+ A8 Y% c* k1 R9 j7 k8 e. [ g1 N
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
` ^ r7 f1 X9 B* f! e
( U4 y! K& S" U1 e2 Q% ^# |$ D& ]
8 w& L8 ?4 @. v& B6 ?
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
: q6 a/ Z, A6 z9 t& r4 [4 S1 P5 R& b
3 w9 k0 x7 k! @& k k
$ T" t% C" e# z$ }* i* {
, E! g. x' s k+ c
0 K8 i! y" b4 O2 D6 J( v
; f$ [4 t; g( Q' V" ^3 q
1 }- V# T& C9 K3 B8 B4 O' y5 M
欢迎光临 cncml手绘网 (http://cncml.com/)
Powered by Discuz! X3.2