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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1.命名空间的作用:  b0 Y" D. p9 \/ j! t! h7 G

* L! y0 w& t/ G; r在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:! b8 w% K9 W) Q
) n4 N5 I" \3 S0 N6 q) G. f
, E. b! f/ F% b' [$ Z5 o+ I3 a, ~
& n% @, u/ E5 t
我们来详细的讲解一下PHP中的命名空间:$ q1 F4 u. H3 r6 f7 d1 o

. o! m& o' e* j  n5 p0 Q语法:namespac_e 空间名\空间名;/ I% i7 C9 L& L7 z
4 z+ ?6 t! H9 _9 a. n& |
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:) l* k9 V. `0 N/ J2 C

( `, f; V& l+ L$ p8 ^----------------------------------------------------------------------------; _1 N! I- t1 y

' v2 _4 c, W& }  E$ o' A9 Z" }<php
# _0 V5 K* Z8 C/ k1 w' i9 _
. U' t9 Y0 A* g0 E- xnamespoc_e AA;- u* z# D, h: F
functio_n showInfo(){; T3 {$ J& j" r: o
    echo __METHOD__,'<br/>';
5 g/ d' }* `4 }' g5 X}. `4 ~4 P5 w( c
showinfo();
" r+ u$ Y1 F/ [- B4 Y( l! P: h$ k8 r2 K4 p1 Q; a
namespoc_e AA\BB;, Q3 v7 W/ B+ L) Q
% k" T7 [8 G- S; A" X6 \* M* h
functio_n showInfo(){: T6 R% y# O6 k
    echo __METHOD__,'<br/>';8 }! O* x4 i+ W- |
}& }$ y+ c. `% V0 i$ r: s/ ]
//showInfo();& L% X3 _0 N2 u& |3 c8 G2 ?% ]3 u
----------------------------------------------------------------------------5 ^5 \# o! Q1 a& X/ Q/ ?; U
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)& x; {1 ?5 H, h' Z( n" h
& r) A0 b* B" P$ a( g8 V, Z, U
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。- Q1 Q* h+ x& F$ Q7 v# g; y
( l/ F7 a$ _2 c: P6 K9 A/ Z5 \
----------------------------------------------------------------------------+ y) J8 }9 g9 {3 {" c
. ^9 S% @) K$ f( C2 i
<php6 {9 m& m3 H+ f( o$ A5 s
namespoc_e AA\BB;
- _) S4 Z* E  _functio_n showInfo(){
2 n& k+ P! _: p5 j1 x$ H, s  c    echo __METHOD__,'<br/>';  h8 K" z( |* A) b: k7 _
}! }! h4 M! t( c& }
namespoc_e CC;
! ~8 [0 V2 Y% Ifunctio_n showInfo(){: f) ~# Y4 w5 D6 l1 `
    echo __METHOD__,'<br/>';
2 z4 L5 Y+ `+ b) h; u- V1 D- Q9 f}2 c- N# Y" K, b1 Q; R
namespoc_e AA;
0 \( h' @) [. G( v* l. N. p- Kfunctio_n showInfo(){1 b( \6 N1 ?" A" f& ?- x8 ]
    echo __METHOD__,'<br/>';
+ P. _8 {/ u: y}
: l! T/ \. d' F" K2 O& y//非限定访问:用于访问当前空间中的成员
! l& V( F, l( W5 ]( s* }showInfo();
/ ~, ?% ]; y# [0 G//限定访问:只能访问当前所在的空间的子空间中的成员
- Z  x3 J% P$ l+ FBB\showInfo();
: i" @8 c) [% d/ a) W//完全限定:可以访问其它所有的空间的成员
* ~0 |$ D- T, }8 E* t8 Y\CC\showInfo();) N2 |# H2 T0 Q2 s
↑根空间标识符5 |2 B4 n/ H7 F
----------------------------------------------------------------------------( f, G5 v, a/ E
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
( k5 p+ S% c, K  p" S8 j" R0 _" I7 L( _6 M4 w! T* b+ q4 L' l
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)5 j+ X& ]* T" \+ v

/ ?% \9 Q7 j) N4 X代码示例如下:/ J- Y+ M+ z: a3 C& t4 S' W% w6 L
1 M* S  V# @- L8 O5 O
----------------------------------------------------------------------------
7 a9 }4 B, h( C9 ~/ {/ J- k1 V% Q# Z6 L" x2 a) p

6 e$ a( c2 I8 g0 D+ j04inc.php
  W7 Q: n3 B. d+ ]( }<php4 G2 F0 ~5 f" K- r
9 U; n$ N, z) }' e* f, M
namespoc_e Core;
- a0 T, R& }1 e8 @# E/ @7 B3 iinclude '05ou.php';
3 i) [6 u5 d  ~" C/ L, D+ rnew \AdminController();$ ~  f% U$ b+ ?
showInfo();
8 z6 {8 ]# l- u2 m( \8 Y5 S
! [1 A  q; W9 ]/ g* `echo P;  X6 [; ?2 s: i8 B! Y. a; _
//根空间中的成员,只要类的访问必须加‘/’: R; @) N5 I8 S6 h
----------------------------------------------------------------------------! Q, ]4 K- S# E1 _& A- E

) ~2 z, m/ P" Y& V7 l05ou.php# r% _5 }/ \. \0 h. |% G$ Y
<php
! H, q% V5 T* w' `8 A2 h% Pconst P=5;5 d; O6 o0 C6 Y/ m) H1 R* C

: l$ `) u* i* ]( U) efunctio_n showinfo(){
# u% d) p9 n) P  F. x    echo __METHOD__,'<br/>';
7 l# B$ \; W1 t/ m' j) ~& O. K}& d& F# `' x2 x2 D; w: j. ]7 {

; ]! v) ]! D. Y, Oclas_s AdminController{' G" Y- j7 V( o8 o. _5 T3 E4 f
    public functio_n __construct(){. R4 C. C- P$ C0 O4 }6 D
        echo __METHOD__,'<br/>';' o/ ]) b  n4 Z1 C. T* S8 B2 F
    }% c4 [; h# i, R/ f
}( x$ ^9 J% ?) B, w, Q

4 N% q5 T: d5 S3 u+ o* `/ x8 `第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
9 h# Z9 ~7 M4 Z7 S1 {----------------------------------------------------------------------------
) \. _! A9 v. O/ O& g5 |. I+ W8 A. s4 w04inc.php; ?# l$ `2 ~0 F( P# n% x
<php! p2 D, }! {1 U7 A8 \- t$ f
9 \) |) N6 r3 T4 W% w" t: L
namespoc_e Core;0 B! h) i% i: g  G& e& \* L( P
include '05ou.php';
5 e4 O$ c, g* V; M, `8 T' xfunctio_n showinfo(){
: k+ L, m4 C( L$ Z! C    echo __METHOD__,'<br/>';
; J5 M7 |+ ^* ]. p$ m9 m* B}
! H8 R( e( r* z3 @3 q7 P! x1 o2 z+ Q4 W& z
new \Controller\AdminController;! p( s9 n4 x7 [' z4 I
----------------------------------------------------------------------------
7 n; F2 }' |( ?& x+ b0 `0 K& B: y05ou.php+ W& U8 P/ P! t
<php
. P+ u* n7 \5 M! o  Y7 _namespoc_e Controller;
2 i4 o7 c, ^% H0 W- z, F9 R
, x7 y+ u$ [. e+ C4 w& ?clas_s AdminController{4 a, `- a9 w% _9 {; E
        public functio_n __construct(){' ^  r4 G! C. T2 m
                echo __METHOD__,'<br/>';3 x# O- ^& D* l5 j
    }
) K+ X/ c* u. O. f( a5 ^}+ C0 w8 y  o. M! r4 v" d8 A
----------------------------------------------------------------------------
+ d: [* _) z. p0 B8 H$ R( y
4 I+ ^: R& Y  G8 O/ C6 S$ B- f4.引入空间成员:
1 R! r8 S5 U; H2 M% D% @1 B( M& w( g
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
8 p( F, \" {' D8 a4 [8 n0 [/ C6 L" T9 ^: R# R
----------------------------------------------------------------------------6 ?4 O, K6 J" N  [. e6 Q( T

' _7 r6 n+ Q) n3 S/ ]7 z- m04inc.php0 H2 u& h4 i) L  N3 [
<php
0 w; \- X8 P7 l8 qnamespoc_e Core;2 F  X- h1 Q" [3 F7 Z. V
use Admin\Controller as con;4 B2 Z" C3 H' }% l7 W
& s' p2 E7 Z/ }: N( `2 {6 T% t( m1 O
include '05ou.php';8 }. v! E7 m5 @+ Y( d  F7 T( ]
+ F( C; h3 V* s" Y4 f& s
new con\AdminController();. N' ]) K, N, _1 F/ j5 B' p
----------------------------------------------------------------------------
" s5 U9 E$ n! a% _- s& _05ou.php
1 y) P# t4 c& v% J& ^3 ?. f<php9 P# N  i" b. a9 f3 P3 `
namespoc_e Admin\Controller;2 a0 k3 W3 F" H
/ F; q6 n' E" [/ J. u( I; [5 q0 ~
clas_s AdminController{
5 T. H: z( p2 X* _8 A$ O5 N* c    public functio_n __construct(){
/ l+ _3 n: J% p# q" r; O, A        echo __METHOD__,'<br/>';- q2 P8 {% t0 O$ z
    }
0 z" v) z( m. A0 u2 J}
- |& W" u: {. t4 ~3 ^----------------------------------------------------------------------------, V0 z6 q/ f# T8 H. e) S
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
+ l+ w, y+ \# n+ d" m) z  {: l9 `0 x! e* k$ o9 K: o- L
----------------------------------------------------------------------------
4 j4 r9 ~+ Y- u" R0 B( P. ^- A, j3 N0 S+ D
04inc.php7 m4 t+ c3 o' j5 W
<php3 @' Y# {7 E& [* a2 u& O! g
//引入空间成员类0 l, M5 x5 b3 E: Q0 ~
, a% j2 w% i! [1 @& ~% ^
namespoc_e Core;
7 `9 i0 l9 \4 j, z: X7 \6 iuse Admin\Controller\AdminController;
8 u" S: o+ p% X1 x2 Z, kinclude '05ou.php';2 o7 [3 X8 {. a& i( H
/ D' n, A& ^' {$ A4 ?) O
new AdminController();5 @) R* E1 u% B' g- S
----------------------------------------------------------------------------
( F( `3 y% v1 y05ou.php
' Z2 E/ e5 r3 o: N7 V6 W, K* f<php
* w" ^$ A( N' b5 `2 z  jnamespoc_e Admin\Controller;% g: i4 m. G+ H! e- Z
( H" v8 V% q( {& Z5 Q
clas_s AdminController{& ~4 _  B& e4 M- }9 F- D
    public functio_n __construct(){
6 r* N4 q* O& [2 ~" K+ }        echo __METHOD__,'<br/>';( W1 @# q. e* w" x% S
    }
/ m- x1 R6 ]; ^8 k2 ^- U" V+ ?9 x0 Y. F}6 B. d( T; [+ w/ K$ y4 C
----------------------------------------------------------------------------  U* |$ X0 }# A0 i& W! j, w$ ?
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
; S  v7 G. L/ b0 o$ v) j6 t' |$ }" n' E. c, U# V) q
5 Z5 S3 k9 Y) W/ ?* y* Q
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。8 y8 k6 U  Q$ C+ [
6 a5 t) Z4 [: L) \

+ h1 t3 a0 J+ e+ h( B( x, K4 @: K+ L  x# P3 ^" q. B' J7 M! C

  r0 c6 S' k+ Q3 J. S
1 u; h2 U! ~) k: d
1 P  N, }6 @; C; Q' r. K' i5 y+ B

最新评论

浏览过的版块

GMT+8, 2026-9-20 23:54 , Processed in 0.067891 second(s), 23 queries .

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