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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16312|回复: 0
打印 上一主题 下一主题

[php学习资料] php中命名空间(namespace)的作用和使用

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:2 R+ ^; k" H1 E" o' L

5 l# b2 X3 e9 |) R$ Q6 j" a在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
3 o5 f# _  w% r3 M
" d- S% c) f* i/ U
9 w' K& L: _/ v+ i+ e  ?8 Z7 w5 V0 R8 \( V% n1 S1 ~1 D' v- z1 ?
我们来详细的讲解一下PHP中的命名空间:
9 i" d/ o. m1 U! p
/ A3 y3 k' i- o' [语法:namespac_e 空间名\空间名;
2 i" P4 F8 u* s6 M2 |+ l! e* O7 L! e7 A- Y2 i
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
- u5 R" o; H2 U1 V' C$ W8 b. K: E% e' ?* l
----------------------------------------------------------------------------/ F- m; X9 X6 q: W  w) e9 h

5 I' M+ C, U, Q: L7 [; n5 _+ M  r<php3 ^- u. E% e5 c
! R5 X- ~. A6 G: I7 V; g
namespoc_e AA;
; D6 s3 K3 k+ W- r  I+ \; U4 bfunctio_n showInfo(){+ s% s% A, }4 o$ G; v% G. J
    echo __METHOD__,'<br/>';
& V* c: P) x  q" F  z  y}- I3 H( x) e- t2 c  n( m
showinfo();& b% `% c) G: {  j
) Y. P0 F5 R6 F2 I, `+ [
namespoc_e AA\BB;8 L( N) ?3 t+ d) k5 I+ c: W8 L
4 F4 c0 e* T, m0 ?" `
functio_n showInfo(){8 A  i. R* Q5 A$ |) m1 T
    echo __METHOD__,'<br/>';
4 K4 d9 b' z% h, b. L}$ h/ F- _* Y; T+ R
//showInfo();! D- Q, _) B( e4 {" z  a# q5 R7 S
----------------------------------------------------------------------------
3 O7 r0 v5 x  u6 v% Y+ i2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)/ K+ q) O7 s, x5 Z8 H
/ N' b( l1 _; H; O
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。' d. D* r0 K2 i# M1 r0 I/ o3 z
! t5 l: X" t* K8 A, ]
----------------------------------------------------------------------------
) c0 K1 C' S* W. M0 U! p
: _' h) @# h  I2 @6 m9 G<php
- [6 K8 o: P( B3 E1 |9 X  Nnamespoc_e AA\BB;
4 q3 \- }/ e$ a# ^$ f/ f0 Wfunctio_n showInfo(){( @6 Q6 }8 T5 O  h" Z/ F. c
    echo __METHOD__,'<br/>';  p7 v9 H, g% F' i8 m
}% r* v6 |7 M4 [& G1 }  c+ |
namespoc_e CC;
+ U2 [3 ^4 |0 _3 G* D1 cfunctio_n showInfo(){
, S; C. ^8 N0 ?& Q) C4 a$ w1 T    echo __METHOD__,'<br/>';: r1 d2 K: S3 _3 b1 l1 @
}6 x6 I# z/ X& U  Y
namespoc_e AA;1 Q' V/ {4 s! o8 \% Y' Q
functio_n showInfo(){
) r; T  R- j+ N% A8 u* T8 e* A    echo __METHOD__,'<br/>';& N: p; Y% q/ Y% C0 x, a9 k
}4 M1 I% K+ U$ b; F* ?
//非限定访问:用于访问当前空间中的成员9 V# O" x( G) A7 p& _5 Y+ n
showInfo();6 m4 o2 a) B& J0 X3 l) V0 b2 s
//限定访问:只能访问当前所在的空间的子空间中的成员
4 T- E1 t: F7 a2 F- x: CBB\showInfo();" B- M" {2 h7 y% J1 V* Q# G6 P
//完全限定:可以访问其它所有的空间的成员" U+ K% r7 E4 r) G# {
\CC\showInfo();
7 Y. ^8 _2 V: U' c7 X) A7 j, f↑根空间标识符
2 Q! X/ I7 c9 X( E1 m* x7 j" [----------------------------------------------------------------------------
$ y* C* @' X" K8 }, A- N% K) \但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
% d9 e( h: Q5 S" l( `& o: T# v8 S! }. r8 F5 x" t% z  Q2 p
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)1 K: U: ^' V& B9 Y

3 v" ?5 h7 \1 B) y代码示例如下:
% \) s) J8 \( |0 @6 n) h( @5 v% _$ a7 g& a" p$ y; W
----------------------------------------------------------------------------; f9 E9 S$ L+ r+ Z, [$ ~2 h1 H4 k2 e
+ Q5 w0 d, g6 f5 L4 z/ ^" t' x

7 M$ \8 I9 J1 J! E0 V$ c04inc.php
. Q; W; w- o/ D7 O<php" d* A; j9 ~0 H$ Z5 d$ ~
& b5 [) B9 m! ^
namespoc_e Core;- R# ]3 \% V  m: K; d# W. u3 J/ y
include '05ou.php';5 t( @2 h+ C' E; X; I7 H9 P; d
new \AdminController();
6 F+ O& @% F4 [0 s3 e  b5 J" K: EshowInfo();1 ~) f4 @2 b& S/ c9 r
8 p0 \; B+ N1 L# `: T
echo P;3 ^/ ^9 `+ |; h6 ^% l
//根空间中的成员,只要类的访问必须加‘/’
- {9 y" P$ w6 A----------------------------------------------------------------------------
4 [3 S6 d) l' H5 b! W9 U' k& V! u' R8 V
05ou.php
# J7 p! a" D0 ]6 [; m<php
/ C& A' w! V  N+ p4 X. U8 v& _% |const P=5;6 B1 y& R: q  k; ]7 @
& Q' K3 N2 G$ d0 |
functio_n showinfo(){( |" R6 O) c6 ?6 N0 f9 b
    echo __METHOD__,'<br/>';! [; s( V& E. U
}% v9 t- U& C; H4 ]! n
- o  Q6 W0 E5 d- A; G8 P0 ^  }5 u
clas_s AdminController{9 A1 L! P0 T, Y
    public functio_n __construct(){1 J( \& C6 K7 s" _# p6 e
        echo __METHOD__,'<br/>';7 ^( j) Y( y+ g* R) w1 B1 E
    }
. K; [, S) R8 f$ h" n7 a5 L}
0 q2 t7 F* C3 _: q- ~/ S: R* R5 y2 @, W; o% s
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: U+ c9 D" _: j, o5 T: w2 u; U
----------------------------------------------------------------------------" V3 T# H& l$ m; k! c( F
04inc.php
1 w( n/ ~/ K6 N3 J3 ^9 Z) {<php* B7 l$ z; \& h0 }5 q6 }) l
: K& @4 d9 E$ l. Z
namespoc_e Core;
+ y# I0 Q( ?( H* yinclude '05ou.php';  @8 K/ B# j/ x. B: N3 i' l4 r4 H& y' @
functio_n showinfo(){. x+ D+ w2 s. x2 o4 G
    echo __METHOD__,'<br/>';
; i; l% ?4 b3 R0 u( M8 [6 I! p& k}2 `2 b/ W) X* S. o# h' o

% ?$ o1 n+ k+ [  j: vnew \Controller\AdminController;
4 n& o, Y! ], d, k4 @& o0 i----------------------------------------------------------------------------& \1 ]4 L' q9 L; O; a
05ou.php
2 E" i! f$ S/ ?<php7 M3 |+ c+ r" o: x) t* ^8 T& H2 }
namespoc_e Controller;" y3 b6 O+ G4 J; X; K

1 f# p* }$ b$ n+ o% rclas_s AdminController{
  \8 s! u4 {2 Z& E        public functio_n __construct(){
4 H% g' h" T$ N2 _& X% @                echo __METHOD__,'<br/>';" Z* _& t- U5 d. z! V) B
    }
8 o* b  \& m6 v% o7 o5 ^}$ _- J5 x2 A. T" V- F, {
----------------------------------------------------------------------------/ i$ Z1 E2 S7 u0 ?
( L6 r' G3 K5 x% U7 l
4.引入空间成员:
% P+ N# s# k$ Q1 N. O
  l) w, [+ K4 j1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
9 J- n/ I' [3 ?: G+ C$ D' L
. k) x# z* b% u- f----------------------------------------------------------------------------
) S% z+ x/ _7 B! u. E6 Z/ ?
- |* Z/ H2 a4 u+ G. c' N# Y04inc.php9 ^+ k; }% p$ o7 Q/ B! e; o5 k
<php
6 v: b" q3 C7 |" Y. @  C7 w  H! _namespoc_e Core;+ N6 g- u) I' K
use Admin\Controller as con;8 j: `- C2 j% L- S
# m$ }4 \/ q% O: Y+ j& s: _
include '05ou.php';
; Z( h# w. n$ A) |$ c0 f
, j; G/ Z8 I! ?  u5 T) M( I/ xnew con\AdminController();$ o, K" J$ i8 j
----------------------------------------------------------------------------2 @! e) v2 q( E; Z
05ou.php" [$ b7 L' x$ ^1 C' j( j2 Z3 P; s# _! U
<php( B5 B- q; J" c7 ^  ?% C$ `7 w5 D; A
namespoc_e Admin\Controller;
) e9 v1 Z4 b& R! M
4 H) C( @: r0 e) K# P1 Fclas_s AdminController{
# m8 m7 f) o( `5 R! K# E* C. _! [    public functio_n __construct(){
6 _9 W; y4 r$ R7 C# Q) e8 n4 a        echo __METHOD__,'<br/>';7 W. s& p6 V+ D# V2 J
    }" U( f7 o2 m  h" ~
}
0 [: J3 b0 U0 C* Z----------------------------------------------------------------------------
, K' r2 F$ D8 K( v% B0 T# Y0 u2 |2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
5 @; g9 C. ]4 k7 U3 k2 h( @: O4 D, u! e" w  z
----------------------------------------------------------------------------
3 g  ^1 ~& K0 O- W
5 r( @8 U1 ^& P) u) u, H6 t* I! M04inc.php
6 {. ]  |8 W4 T8 d<php
0 R$ l7 P4 I2 q" W$ r5 d) E  h//引入空间成员类
- \2 R% J6 R6 p( ~& D5 ^" ~" ^: S9 R$ j* o1 R
namespoc_e Core;
2 v7 J5 A) E* }& A) Muse Admin\Controller\AdminController;2 j6 s, }$ S* W+ z& H$ u
include '05ou.php';
% L8 \# O' q# j/ i. S# r
; c4 A$ V$ @  ^new AdminController();
* ~% {5 U. U4 d( o! E& M----------------------------------------------------------------------------
3 t  ]7 ]0 w' }5 P5 {9 n05ou.php
8 K# }* o+ c+ i, X<php! `+ P* r1 @7 I$ V& p; j
namespoc_e Admin\Controller;
; M: i- w* L: |- y1 H0 G. O" A6 O' h
clas_s AdminController{9 v, J4 E; n7 r
    public functio_n __construct(){, s. Q) Z7 d! l) R, J, D. g5 c9 t" H
        echo __METHOD__,'<br/>';
% d1 b8 O6 T. `- b" K1 b- F    }
0 E  V. h! M+ P, e% ?  I# g}- `% r& b; g$ W6 l
----------------------------------------------------------------------------, X, o* e3 [8 W3 E0 S, q, ^
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。! K8 P" M4 z3 Y% m9 \
: X' ]: m6 s6 e- t  d
: K6 n' m3 n2 D# V
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。& M( A- X+ n4 a- K% q

' C2 J! i8 ^0 P8 k& N& u! z* k
7 B1 o# p* {" N* C+ B) ^$ K( n3 J5 g5 l2 e. n% l1 m  e0 @+ t/ I$ A
1 @' L, _$ p# t8 S6 {2 F
9 A5 k# {. m" f$ s# D( R

; }5 T# \9 k" Z) `; h" e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 13:03 , Processed in 0.052025 second(s), 22 queries .

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