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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:, j8 ~) E, F% Q, A( y

' i" U1 o, Y; }3 n! M在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
1 _, G, c% E6 R# C& u; k8 V/ ?# b, X2 R/ B7 B5 C; j+ |4 A6 p

. m+ C- R1 D3 Y& \5 ~5 b
- z" I9 J, Y/ J3 i我们来详细的讲解一下PHP中的命名空间:$ I, r+ N  H. {
" E7 `8 V$ N" Y. w' T; N
语法:namespac_e 空间名\空间名;
% W# n# I# U3 B4 l& _. r' O
& i& T  F6 T. e0 O! E说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
0 u+ I% L, e8 D. K+ ]: g9 K* L" t1 f$ G$ l: X" k" P* l4 Y3 t
----------------------------------------------------------------------------+ G$ z3 N* q6 r: j2 {
0 l1 x. f. x1 f  w
<php+ L; k* n9 Q4 i! y$ q# G# ~, b

+ {5 l+ Y! \% |+ B/ fnamespoc_e AA;( x  z; D& s% Z$ g$ n, y9 e$ a
functio_n showInfo(){8 t5 H% J) Y7 q% r
    echo __METHOD__,'<br/>';
* e5 h5 ~0 D8 n8 k2 z  E) q$ q5 l}
% m8 T" Y8 U" m( `1 W$ b' H9 W4 Bshowinfo();
, n5 k! ^+ _/ X0 ^' u5 r; S
' A0 Z! V) _% E2 B' Q$ Pnamespoc_e AA\BB;. O4 A7 i. i7 d, J) u# Y% L

+ Q8 W+ c! v5 T) Ofunctio_n showInfo(){
$ x1 ?4 P* ]# A" \" @# g! x3 A    echo __METHOD__,'<br/>';. I$ m: U. t5 Z
}$ c& v; D5 X5 X: v6 j
//showInfo();
; l! f/ J* A' u) }7 I$ l, m. Z" j) _- @0 p----------------------------------------------------------------------------
: K; X5 t$ c$ S2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
& W1 k, J/ [' v" X" c' Q; I' c; ]  S7 \* |9 J7 v; ?
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
" S0 j  R1 C' @: D0 x4 X; g' W0 j" d4 ~; s! k3 m9 S; q
----------------------------------------------------------------------------
. v8 Y& H+ V  b: Z3 z2 H
% v; i# O0 ?( X* p" n$ t8 _6 a<php
9 n3 ?- h, b9 {% Q' b5 e  h2 f& o. Qnamespoc_e AA\BB;2 @# Y8 J; C: h% i
functio_n showInfo(){
! E4 W) y6 v% a4 f4 h( _. p2 Z    echo __METHOD__,'<br/>';
' W$ g, w6 h/ @. Y* T7 O}# `* T7 M. `5 u2 J
namespoc_e CC;
* H" T. |9 R- E9 |( x) \+ [. lfunctio_n showInfo(){
# a8 n) A9 M5 G( e2 M* H8 T    echo __METHOD__,'<br/>';
3 w; M8 l3 _$ C8 W9 E) S8 W}
2 H& |6 G  r3 R: Enamespoc_e AA;
) |7 \; A" Z/ E- Gfunctio_n showInfo(){
: |0 B( Z1 M$ c# L3 y1 X( Z    echo __METHOD__,'<br/>';
! t  E! V- \: E% ]7 |" d}
; K* y. @. L$ D: `+ L//非限定访问:用于访问当前空间中的成员
; B) {, u) \& z, g) AshowInfo();
+ R$ C8 w1 A1 `4 D2 e/ ^; R( }  K8 Z//限定访问:只能访问当前所在的空间的子空间中的成员1 P, e5 l2 x, _6 @+ s4 z
BB\showInfo();& E0 G0 J! W. x3 V' B9 S
//完全限定:可以访问其它所有的空间的成员
5 y' O- \5 h+ J% W# q\CC\showInfo();
+ d3 l+ n2 D7 o/ Z↑根空间标识符& B# }: K) v# H8 }5 ^0 H! ?; r6 b
----------------------------------------------------------------------------! T5 Y' ^6 w' W) A
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:4 B' d" b/ b5 {4 @7 ]( e5 x
8 K/ O2 u; n$ o0 Z1 O
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间): ]) j3 m& P! I

4 L1 s" s6 ]# y" x: F代码示例如下:
9 W- l& z" m7 P* j% L; ]
0 z; k8 [+ _& n6 n, V----------------------------------------------------------------------------3 h7 A( f, j! X6 w) g

+ z+ x6 o& h4 _' d% m, D: T  g: k4 h2 m/ x: B0 ?% S+ q5 `& V
04inc.php* C1 L3 J' S( A! J3 e, o3 m# F9 W
<php
/ H! f6 Z' V; D9 e( Y" v7 p6 y- K' o4 |; B4 T& B3 m( p: z8 |, Q
namespoc_e Core;/ u8 x- d, M! K4 W- I0 `7 J& r
include '05ou.php';: M7 Q1 U# O7 O/ o( E
new \AdminController();; X& f' V# n, I( N; P8 |6 a
showInfo();
4 `2 Y3 b; M$ E& w5 t  y+ R  J5 p/ Y- ^, {8 J" W
echo P;
" n) _( T8 j2 F6 r//根空间中的成员,只要类的访问必须加‘/’& g- V+ c* T4 n
----------------------------------------------------------------------------7 }1 `; N, H& d: Z1 S: X0 z

1 D$ ?9 C  _6 N. J+ \4 Y8 d' @7 Y; ^05ou.php/ w# v" A5 Q9 f  s, j
<php
# C5 r$ U3 Q, G% [- q; f( }7 Cconst P=5;
( R9 Y" b1 F& \- @5 B/ o
+ _- A# N5 J* }" x3 n" Efunctio_n showinfo(){
+ I; E7 v  a8 c- W: E$ `    echo __METHOD__,'<br/>';0 ]; ?; [/ M1 _- b. ~
}
) w+ m$ C8 [& @' p7 p1 e( |6 g9 u* u; L8 K0 `2 K& ]; a" }
clas_s AdminController{- g5 B2 q, G' ]
    public functio_n __construct(){' a* u1 N, [3 r" w
        echo __METHOD__,'<br/>';2 J# w" K$ B: ^7 u9 G
    }
  x5 z' \' q/ D. ^- b) h+ g2 n: s}
4 ^1 u2 I- y5 C# M- W
+ R" h: ^' j. y) g) L, x第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
% r" v; U* _; G; t; i3 c% W----------------------------------------------------------------------------
9 ?1 U/ Y! [+ z6 k0 q04inc.php
& b/ |1 b, |6 w& a5 A7 K<php: ^# i4 J8 N9 W6 p& t5 V& ~2 U& R

; v4 J) L  C  _" o( K8 t5 @7 g: bnamespoc_e Core;
) @0 d6 A. ]  Minclude '05ou.php';$ z: x  |7 j' [1 t+ _" P3 e
functio_n showinfo(){! Q2 q  j. d& x$ W6 @" d
    echo __METHOD__,'<br/>';
5 x/ k1 q0 e- R; m( t8 O) @- }}% ~) [* K' D& L6 R! e6 \6 K
3 J6 n! ?; ^. M8 y6 g3 q
new \Controller\AdminController;6 n6 `+ z2 A# W2 j
----------------------------------------------------------------------------$ c5 W8 Q+ ^. L% R; d
05ou.php
- e  w' C- L  e4 g* [  k9 \" `<php
( D: T  [1 i" O( |' z4 C* s$ Dnamespoc_e Controller;' {9 q( Y* V; r7 A
+ q) E7 e7 L* B" X
clas_s AdminController{
9 U8 J0 s  \0 l0 F/ C1 A5 ?/ z        public functio_n __construct(){& {8 C! B. g3 e
                echo __METHOD__,'<br/>';) C. c7 U. R) U4 u
    }
% w+ d, G+ z5 ~7 g4 z% o}# y* T4 d8 X9 l$ Y+ V7 T. E
----------------------------------------------------------------------------
' n9 e, n* K# `# m1 s$ e7 `
3 @% D) u9 @# S/ u0 v  y8 e# ^# ~4.引入空间成员:( t8 d8 D; n- h! q; e
( f1 p" Z! a$ T- S
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。) p/ r; J; x+ z% D2 G/ G

; q# j) E; i! |----------------------------------------------------------------------------
, Y3 _7 A6 @. a5 \
4 \  g7 V, @* f( F/ k" g+ ^04inc.php
. m6 U2 @' v' \9 g" X<php: q6 T8 r+ H# b6 Y- m( n- H
namespoc_e Core;+ h% K1 c& z2 v2 K
use Admin\Controller as con;  `  y1 ~) p" e/ g
2 O. q" a6 k8 {2 x) n
include '05ou.php';# w* U. |; L8 X

5 b5 `! g: |6 L" A4 Y8 n, fnew con\AdminController();
$ j, ?' h9 l8 X2 E. ]3 J' w----------------------------------------------------------------------------! Y" I0 q7 J8 u& Y+ f- t+ K& ?
05ou.php
9 i1 k2 @- @6 Y* l1 O<php% X' P5 n- q5 ^! f, B2 N! C
namespoc_e Admin\Controller;
; b: g0 b7 T. r" O" O: j5 n% p" i/ `8 t# U/ ]
clas_s AdminController{
! [& a* ]$ Z5 j) i5 I! z' g) v    public functio_n __construct(){  z4 }# R- i) s! ?, U
        echo __METHOD__,'<br/>';% @, d7 x. W. K* T; C$ T$ n/ q
    }
) g& S% \; @; L2 R& W, l}
6 J, H0 P1 c( A4 s2 n+ `# b. ~" \----------------------------------------------------------------------------$ J  N( K  i! h; q; o
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。- ^# e& L# Q* c4 g
7 l3 P; K) b/ w. S( X  t; D) |% t
----------------------------------------------------------------------------
8 D3 A* d( F! k0 Y; \) r" }4 P* M+ d2 U! V* M! Z7 @
04inc.php
  J. R, A  @+ K<php' \9 {- E# {$ z8 N4 m& J
//引入空间成员类
' i2 r. C$ Y/ k
; j# u! |; N4 x* Enamespoc_e Core;7 ^) H8 }$ }: f# r( p: V
use Admin\Controller\AdminController;
8 F0 m$ a6 t& ginclude '05ou.php';4 Q+ K/ M& Q9 Y7 ^! `1 e3 l

/ K0 I* w; A( Z" O- O# Q: Inew AdminController();
2 l4 `# V2 l) J4 s3 a----------------------------------------------------------------------------
& r# [2 m# T( N2 v' E0 Q4 I05ou.php) @3 }7 Y4 [  X+ t, q" [" H! S" I
<php$ i7 l% y3 i& S& g2 _9 Q' h+ \
namespoc_e Admin\Controller;5 N! n: o/ Y* G) d5 y( C
% T+ F' @, j7 n: i4 g
clas_s AdminController{+ O3 `9 I! |& s5 o! o9 _
    public functio_n __construct(){
. P) {6 B- x) ~5 D, P0 Y* F        echo __METHOD__,'<br/>';
' v3 d- i3 ^! V6 @    }9 R2 F$ c4 L% c6 t
}4 |% I- d/ ]9 v# ?% j# E6 F" R5 o
----------------------------------------------------------------------------
% z: @8 c" m3 D9 Q& ]$ Q5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。) `! f8 L5 A( W6 |$ |6 B! f
' e9 E. s/ W, K' `: {8 A

' _5 F4 Y3 T, Q( S! ?这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。3 b" A$ z( l* u) z- R

) g, N$ s8 c0 i$ A+ k# k& s
8 V! ?8 P! v3 s/ @! q: Q( d
# a% B6 ^4 R0 H" D) q4 p9 o
& K$ M- [( O! Q' ^8 z  P
% a& `3 w  U; Q6 |3 F! p4 O3 w) s/ m6 u* a# i# s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 11:33 , Processed in 0.060548 second(s), 25 queries .

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