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 Q4 n- T# A; q: }# c4 y- {
, 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' T0 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 Enamespoc_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. Xshowinfo();6 v) ?) X) k1 D

* X$ P3 p- W6 F$ Vnamespoc_e AA\BB;
) L# s5 G/ R: b7 T8 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: J3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
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$ onamespoc_e AA\BB;
! U8 b( C: w$ W9 D& rfunctio_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. rfunctio_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.php9 x. z# R+ H4 U5 \3 S
<php
, |/ H# d8 V( @
  V4 N; }# N2 F- Mnamespoc_e Core;
' c( O# R! B- b) p! _. qinclude '05ou.php';
9 k$ j. a' t- Y0 {' i4 Z; {, ?new \AdminController();
' e3 l: g: R+ s3 r0 G9 t0 o, ZshowInfo();# |- h2 ?5 X  o; l& C4 z

' j, _7 b, o) @& l9 q) E5 pecho 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.php6 r( q  C6 _1 r
<php
! _0 P7 L4 {; o* n. B1 S' O8 M  Iconst P=5;
, Y8 J) ^) Q. j* H1 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* Jclas_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 a5 A" d& \% T  d- K1 s
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。( p6 ~0 g0 I: k8 R7 g  J
----------------------------------------------------------------------------
, u% t2 ^/ s5 @9 Z# v04inc.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.php7 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/ p4.引入空间成员: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$ d04inc.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+ [( Jnew con\AdminController();+ G" d# S' {+ I) u( X& B
----------------------------------------------------------------------------
2 e3 h5 d! \( C# d05ou.php
' V9 n: n: [, k9 ]<php
; k. c; l* I. P5 c; d1 Z, Knamespoc_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! Dnamespoc_e Core;
* ?1 S. [4 [- K0 {6 B+ iuse 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 tnew 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 Snamespoc_e Admin\Controller;$ T# a- t2 G# |& P- C5 Y

3 u$ [- i  S  Z0 f# {2 oclas_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 q1 }- V# T& C9 K3 B8 B4 O' y5 M





欢迎光临 cncml手绘网 (http://cncml.com/) Powered by Discuz! X3.2