您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

php中命名空间(namespace)的作用和使用

发布者: admin | 发布时间: 2020-7-1 23:13| 查看数: 8330| 评论数: 0|帖子模式

1.命名空间的作用:, X- m" x* x! k. B: Y4 L

4 D7 H- g5 T! m1 j) W9 r1 W在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
: C# g( W) X- h6 U& S0 ?; r* A) E+ Q1 L7 A. Y) j- e
20181201105307520[3].png . |8 x$ S; G3 ]; Q& \9 ^8 _2 n

8 [, l, J5 Q  t4 F* P我们来详细的讲解一下PHP中的命名空间:
$ Z5 b" d5 c& Q% d* d& O4 V( J2 b3 }  B: e, @0 l* f/ a$ S5 C' \
语法:namespac_e 空间名\空间名;
# s$ z9 j7 A2 |) [
6 K+ w- O6 A8 R; T  x说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:2 p  W6 S7 q. r6 g% Z6 U( R$ t
% X  m6 G; {2 q3 d
----------------------------------------------------------------------------
+ M5 t& d: l$ z4 p4 D3 c7 R9 t2 g5 @1 n4 |! m- p8 r5 F+ T
<php
$ M$ _4 @- e6 q4 u7 F: T2 ]$ q1 V# n8 I# r5 w& u% f5 ]
namespoc_e AA;
0 M! v" t% V; R6 N- Zfunctio_n showInfo(){
2 M6 ], w2 J, x4 \    echo __METHOD__,'<br/>';. Z) h) ?* P! M! x
}
9 J! K4 {4 ?5 J9 Q; Zshowinfo();
! ]( J6 H# S- j4 k$ [% |1 W  |- f$ r; `- q; q1 c4 s8 s1 g
namespoc_e AA\BB;
$ M2 U9 a) z4 n# T7 C/ H: F% ]2 k' k, P9 z; s
functio_n showInfo(){- I: m2 l) l. F0 B. a+ _
    echo __METHOD__,'<br/>';1 N: m$ e$ X7 }" a: f) r
}
1 V- w$ K5 Y* L/ R- q: J//showInfo();' E" |$ E+ k. O$ i7 n8 ^( F
----------------------------------------------------------------------------
8 S0 }2 N3 O/ [$ U* o9 {% d2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( P! N6 i. ?$ b+ W' C1 i
+ ], m. V, [, v+ c  L) Q3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
! C4 C/ K! `# y0 g  f2 |  w
  q# C; G3 L6 i/ h) ?----------------------------------------------------------------------------
+ a& f# K$ l8 s: e: J% w: w- Y! x& v* ]/ E$ O" k- g
<php
1 q2 b9 ]. ^! _. d  Ynamespoc_e AA\BB;
% J" |" ^8 e6 L  J2 Ufunctio_n showInfo(){
" u" F* W7 R2 |# w" d* z& O    echo __METHOD__,'<br/>';
% m5 E- O$ T* \( }}
3 T/ F: h5 F6 q; ^5 ]5 mnamespoc_e CC;
, Z8 g& ^& x& ?2 x# f! Ffunctio_n showInfo(){$ x3 i  g$ q. ?- l8 Q% `
    echo __METHOD__,'<br/>';5 @# Q- m3 p. g" A
}
8 r% D1 q4 I/ `  S( rnamespoc_e AA;/ I; L$ k+ {, _8 w
functio_n showInfo(){
) M. P5 Y/ P4 a* Z3 a% W) ?    echo __METHOD__,'<br/>';
, W. |. V; r$ c) R  C2 u! I}4 l4 {: F9 l9 y% D' e
//非限定访问:用于访问当前空间中的成员
# a2 F) W6 ^5 QshowInfo();/ ~4 H! ^3 q! q
//限定访问:只能访问当前所在的空间的子空间中的成员6 F: ]  {' _! u  j
BB\showInfo();
; _" T, T$ j+ _//完全限定:可以访问其它所有的空间的成员
7 k0 c1 r7 o& @5 ^  f: Z' w4 b\CC\showInfo();
- j* \# S$ n0 Q↑根空间标识符: x# D9 r1 t% y  G( Y
----------------------------------------------------------------------------
+ ~; n7 \1 a% t5 ?6 U& C7 ]但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:' h3 P- Z8 @- l2 z9 M8 f

4 z3 d# Q6 Q5 f- U当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)/ @4 p2 n5 j, J2 \5 n
. g# q& Q! `9 I  i  P5 [; }4 D
代码示例如下:, R! S6 u. s) Z! @; R

& b$ s& w. F& A3 Z, }/ }2 H----------------------------------------------------------------------------3 E5 h# s9 p. |5 U( |0 H* j
+ b5 @' i2 Z' c" d* n

0 n  b5 `+ w# V2 @8 f5 I04inc.php
5 q. D$ g8 m+ b' y. s5 F<php
) a1 B6 a0 Z* J( C
. b3 }! c% l5 K5 B8 Onamespoc_e Core;2 u1 \; Z& |; `* g2 @
include '05ou.php';
/ h2 E3 c5 a3 D  J- K1 Bnew \AdminController();: O0 I5 D$ L( O
showInfo();
% ^8 \# ^3 Z6 r. j1 m! [
% J/ [& Y8 q- G! u. ^echo P;
  S$ y4 a7 F& P2 I, Y% z//根空间中的成员,只要类的访问必须加‘/’
% F* Z/ p- w3 q; p9 i( c----------------------------------------------------------------------------
' P5 S' F* Z3 O% g% k% T" e2 [& _: }9 p
05ou.php' I4 Y4 G9 I. {. h  J( S8 {: v6 R) X
<php% N: V3 ~9 Q/ t+ M
const P=5;
0 S" }& F1 ?+ S2 Q8 s/ p/ m8 t& g- I  O
" Q7 {# h0 u+ Rfunctio_n showinfo(){# i! j, ?. P: y2 h# V
    echo __METHOD__,'<br/>';5 j3 F/ D8 d' n6 ~+ f
}
2 K2 {6 H5 Q* i) M' e8 l
9 x& R" o6 Y: P7 `  _- M, Hclas_s AdminController{' D; ?* s6 K& c; @) Q8 P0 }' W2 k
    public functio_n __construct(){1 [) V- F: L5 X8 h/ p
        echo __METHOD__,'<br/>';. V% c- y9 T* n% I1 D3 Q* n0 e) a/ t
    }
. u* Q/ _1 K' [) S9 [7 Z}+ F( e" k- a: h! Z3 g" D
& J9 K& q( p' N% z; J
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
" _$ Y9 y( D  |----------------------------------------------------------------------------8 s. g" J0 h% s$ U
04inc.php$ i, s7 E* ~4 g0 X1 V" R
<php) W4 A) \7 P$ G6 ?; L+ c
0 |/ L$ \7 ^' M3 J
namespoc_e Core;
9 z- A  K! r9 z9 einclude '05ou.php';
" O' x0 L5 p' H$ J8 u7 g5 kfunctio_n showinfo(){8 y& X5 S6 O* _5 x, ?! ?
    echo __METHOD__,'<br/>';
2 O) f4 F/ H. ]) r6 x}/ ?3 k7 S9 B& y- f! a1 b4 `# w

" C7 O3 t# D- B& X( Onew \Controller\AdminController;, N. C$ O9 i8 x; n  ]& D$ c2 b% c0 e
----------------------------------------------------------------------------7 M6 ]$ B2 C0 h: |3 c1 r
05ou.php
6 r. s' m$ c5 K: |2 r- x<php8 K9 k* E9 {0 ~# ]6 W4 T' t
namespoc_e Controller;
' k9 o9 k& `3 w& w0 v2 N5 _7 _7 M) `1 `# z
clas_s AdminController{
5 Z$ }' P8 w8 _1 |. Z        public functio_n __construct(){; {& l: F: c1 U1 u; `5 X, G1 \" \( Z, H
                echo __METHOD__,'<br/>';* V1 Y3 K- L' {; I; a4 w. ^! \
    }" H4 V7 s& {2 k" H
}5 ~8 U4 s( g- `  Q" S# F$ q$ u
----------------------------------------------------------------------------
- m2 ^" L$ G6 E! ^1 I
8 x+ o( \# ]: {0 B, b0 O0 t4.引入空间成员:
: [3 v  I+ c6 W4 H+ Y9 ~5 `- l2 C0 O7 T5 }: N" n& n% L
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。5 n) V9 H; x1 t

: s  d& C; z: `8 _4 e----------------------------------------------------------------------------7 f5 [& ], r0 J* P) K8 t

8 g6 ]! M. F! {04inc.php$ y" {. ?3 q/ y
<php
+ |1 M" b  a4 ~1 J! Y  Mnamespoc_e Core;0 n& a6 r+ n1 o9 ?
use Admin\Controller as con;
% ], n3 t3 i7 W* y% v. F& N& e3 L" k/ v  g, _$ X3 R
include '05ou.php';
( [' I% }* o* y" W  ^* E8 a6 H
# _" B7 g! h* [6 ]: @: Anew con\AdminController();0 \  f% X4 o2 S: y( Z
----------------------------------------------------------------------------$ A, b" |. E  E5 ?  t
05ou.php. w' Z, F# D9 c* d
<php
2 L3 z  e6 C4 O3 U1 Jnamespoc_e Admin\Controller;
9 [* u0 @6 I/ ]- d. B$ \
+ B( X9 o# D3 R# {" [% Dclas_s AdminController{
' k( K% [9 i: \7 z" G! \, E    public functio_n __construct(){  g+ \1 e& C, Z/ n) m
        echo __METHOD__,'<br/>';
# s- K5 u& m, d6 i    }
+ }/ ^) H; j( \) L5 ~$ [: n# G}
2 M1 N: }( ]" ~----------------------------------------------------------------------------& \& p& Z- G+ |9 z+ H1 v
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
7 u" Z) |" ~2 P0 d4 K. }, k8 D
7 J' A: W& M! X% W6 y----------------------------------------------------------------------------( u; T4 m* r- q

& f9 q$ e; K% l0 q8 l) s04inc.php1 u/ Z/ I; z5 u9 X' {, G2 n; @
<php: ~9 n) O( s* O6 }. f
//引入空间成员类) S# N/ R. |! Y3 P6 b# c! m( w
2 K. S6 }4 w: z# X# w& M" W* Q
namespoc_e Core;
7 [; Z  p; }, yuse Admin\Controller\AdminController;
: C& L! _( d$ X) W0 b+ kinclude '05ou.php';
: Z- m5 Q& }7 x% V0 I0 M) J# E/ U7 w5 ^& z, }% @
new AdminController();
7 n# Q* X5 l+ v, \----------------------------------------------------------------------------6 {: [: D; t7 j% [% z6 N" m' x
05ou.php
. b) X; p6 B2 ^1 r& V<php! P2 ?# x1 u8 ?; f2 F; s
namespoc_e Admin\Controller;
* |. E( H$ L7 M9 w' M  ^7 y
; c  @9 y) k# H+ v+ f7 Vclas_s AdminController{
! q+ N, i6 q% f+ n, Z1 `  V    public functio_n __construct(){2 n! C) A, d4 `7 ?% P
        echo __METHOD__,'<br/>';- r4 `6 z' P7 x6 |1 [' ]' E) P
    }; L" B' x" ?$ _, H( V
}, \" F) }& A& v  S9 Z8 h
----------------------------------------------------------------------------2 x; o* h- a  |7 G' @. n
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。5 Z& g* K4 H9 M; W$ d; g+ D# ~* Z

7 ]. w, Z$ g2 i+ K& T' Z( Q: n8 j
) S6 x. f1 O% b% v7 O3 a这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
* O$ M1 C6 E- T' X# [4 k& U* D+ V# G: f* K+ N
+ z: ^8 i. q% A# T

7 h& @# _' u# u. e0 W+ ?5 E& m! u9 G- F' p- n( \1 W5 v
" }: P$ j; o  [" j
. V3 K7 s. ^; X$ l' A; @) @7 P7 p( g

最新评论

GMT+8, 2023-9-23 01:23 , Processed in 0.159808 second(s), 25 queries .

Copyright © 2001-2023 Powered by cncml! X3.2. Theme By cncml!