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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
' h& d* I0 M0 E9 D, P. R3 V7 {9 z* O, ~) Q2 c" k, S4 ]- X" {
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
' F: b' [' ^4 A, C
+ y# X2 U% k) ^% G% b5 y( |
' [. y0 h2 W5 S% ]+ `) |4 F0 k# l4 U" P
我们来详细的讲解一下PHP中的命名空间:
% G; Q+ z; M& Z6 G( }2 ?  Y* R& B
  n9 D. w8 l! A9 U- Q: U语法:namespac_e 空间名\空间名;
% v4 s  |, u( _3 Q: r8 U4 S; {# f: y# A. n
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:. y  ]) k2 A( ]* K& c
3 x+ C' J+ Q6 F& m; ~$ e7 }
----------------------------------------------------------------------------
5 g8 K4 K' g  I3 C' {0 E' G  v4 T3 k9 ]: B
<php  |% @/ x5 q4 W+ ?8 v% j0 O

. Y2 c8 _9 Z/ r+ @/ {& nnamespoc_e AA;
) n- i+ U/ v' }& @9 B! ?$ v; nfunctio_n showInfo(){. a$ e2 h* k8 d! s) D0 P6 ?
    echo __METHOD__,'<br/>';
% K8 ~) w4 [; Z. W5 ~; A}
! g) |$ \4 G+ C" f6 eshowinfo();
5 n$ K' |) a3 u" |% Z8 X$ E8 N5 L9 T; [$ g; b  o" O% O" ^: H; @
namespoc_e AA\BB;9 V2 u8 q2 c+ _. Y1 v6 A; L* d3 e
' Y( k( [: f4 g; k
functio_n showInfo(){
0 n2 o/ q) g8 A% ^8 |! u    echo __METHOD__,'<br/>';
& ?& y6 |/ ?9 P" k$ H}" U  V  e/ K; X/ u4 f# i/ ^
//showInfo();6 X# N5 p* U& o% j( P/ ]3 Q
----------------------------------------------------------------------------
0 W+ s2 n1 [* ]2 C( A2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)5 e9 Y2 V7 z6 y" U; }, g* X  S% l* [! o

' f7 c/ i7 x% h& r; x3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
% f" R8 [4 a* T5 a3 l) c6 o& j4 Q
----------------------------------------------------------------------------
. m6 i* w* i6 V
* m, ]$ L0 b. O) N6 _2 ~<php
, S. F  ~6 ^* H0 }; u* Ynamespoc_e AA\BB;
% Y8 t( z0 R% M# m# \- ^functio_n showInfo(){
) |' d, p1 r6 E  U; Q% P    echo __METHOD__,'<br/>';
2 }; _! B" {9 ]0 {}; D6 \2 U( p* t& e  u$ ~
namespoc_e CC;3 m5 S6 v$ v4 X+ d: R5 Y
functio_n showInfo(){1 w! _/ m! G$ x5 ~
    echo __METHOD__,'<br/>';% T/ S% L3 D7 y" d( k2 \0 A
}
6 _3 Z! b2 _, E6 |6 Unamespoc_e AA;
% \# Q2 n0 S: n$ J8 g/ ^functio_n showInfo(){! h: V1 h- d# W2 [; N; B6 D5 w
    echo __METHOD__,'<br/>';
, a; S) M* [" I" y/ q3 L5 R}. R0 ?0 q$ Z2 Y) ^  ~" O5 L
//非限定访问:用于访问当前空间中的成员; J5 W9 g) o0 v# x
showInfo();
) E4 q7 _: n2 q) D9 Z; b//限定访问:只能访问当前所在的空间的子空间中的成员* U9 X- E9 D& X' `) p9 Q4 r
BB\showInfo();
* E9 {( e5 ~# ~5 Q8 T//完全限定:可以访问其它所有的空间的成员8 v; J; I' z. S7 e& p! r! c( I
\CC\showInfo();+ _, X# ~. h7 K$ N1 S
↑根空间标识符
: I$ G9 ^  O, |* n! k* n$ w8 P----------------------------------------------------------------------------2 w# z9 X" x$ ~) V6 M! R1 n6 ?
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
' }% s# q4 F% p9 r* I7 G0 @$ f( q; _: Q8 r+ K- p0 K
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
+ O* v4 x. j: P( ?: R, g
4 m  p: m' W( k/ a2 e. |/ b3 ^代码示例如下:
6 i. v& N) {* E+ {( p
' |. v* s' j5 J7 k* y----------------------------------------------------------------------------+ r3 N  w* k- \* C' Y& @
- I6 I2 H6 u5 b
) m7 [( T  A3 J! S
04inc.php
  q' @& L9 z/ A$ U8 Q<php
/ l  |! k: y- I) z5 \8 Y/ x0 C
7 a  h2 A6 u( }: [9 `. \& cnamespoc_e Core;
6 W( ], H3 j% E: `# Einclude '05ou.php';! Q  _7 i! A3 K) Y+ ~
new \AdminController();5 T" e' V' ]" Z, u1 A/ A6 n9 \
showInfo();. B1 L: V, B4 [8 E- a; s9 n/ x

! F# D6 C: t" T: v; p. T9 h9 e% Qecho P;
0 R* r$ H* }2 g9 i& m# Y  \//根空间中的成员,只要类的访问必须加‘/’% E8 y" l' K. q# P& I& U3 S+ Y
----------------------------------------------------------------------------
, Z# b0 I5 `# t2 A
, Q0 F0 C* s$ v9 r0 ]. |7 Y0 f) E0 S1 H05ou.php, j# ?( ?, p! o5 Y, P* {/ L0 @
<php  i5 y" D# [; G! F' p4 S
const P=5;
* y6 L9 Y$ c* O: d
4 M( B5 Z+ B" L0 Afunctio_n showinfo(){3 \6 o* |1 D! d" V  f# e# I
    echo __METHOD__,'<br/>';/ ]6 B) O/ o" U
}; K' G; K, ?) s; X
! C2 T8 o, n( M4 S2 N
clas_s AdminController{
: E4 B- `7 V& L! y% s    public functio_n __construct(){
( j; v* n  P- G- Z$ L1 Q* f        echo __METHOD__,'<br/>';
0 b5 ~0 e2 n5 j: x8 P  f    }
* l% J8 H$ i. b  @% G# z}
: I0 \! d# P# F* U0 R/ P# E8 T" R5 N4 Z" k' _4 w
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。, w5 f8 |6 f) `# W- y9 j
----------------------------------------------------------------------------5 E  L) A2 d7 |; z2 \/ f
04inc.php
" @( L6 J7 ?: m: p2 d<php* z: O+ g3 ]4 c6 |! J! T# A. w
$ r  g. V- @' b! B, O
namespoc_e Core;
5 z- y, |$ [, ^, d/ x, P  Uinclude '05ou.php';9 L* Q) r: k: N% Q* ]. W
functio_n showinfo(){6 N6 v( n5 V. {$ c" l$ D: ?6 G
    echo __METHOD__,'<br/>';2 z( \" ^8 Z/ r) E* d- U9 X
}
! U, w& p6 Q/ X0 ^" w
: J# [* {1 k  v$ k0 Bnew \Controller\AdminController;& S) h4 {! }2 [# ?
----------------------------------------------------------------------------) A5 z, x0 i$ W8 h5 C$ I& z! M
05ou.php
1 N$ x+ W. S* V# D) k<php
+ L, O6 T1 I6 k  ?+ }+ Rnamespoc_e Controller;
4 m! J  _% C: u7 v' h) l
& e" w7 h9 b& hclas_s AdminController{/ K% x, }5 n/ k2 p  Y
        public functio_n __construct(){1 K; S% s4 B: }$ {- z
                echo __METHOD__,'<br/>';
# n3 B( [1 z* C/ ]' v* ~    }9 }6 |; q* [- W" a
}, M8 Q+ u4 ~- G5 L- C, j
----------------------------------------------------------------------------6 J+ q8 o" ?0 N: O3 E! n

- ?- i! `8 ^8 w* w3 o4.引入空间成员:
5 E. V# C4 t  Z$ {  a
' \0 W3 J% v) a1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。9 K6 @8 P) ]! C: @; P" \9 i, W" w

: ~* A  V6 m8 h, m/ P----------------------------------------------------------------------------' A; @! P. |# A/ Z3 O+ D
# t& a4 H7 o5 H& c" L& b" ]5 i3 m
04inc.php- e3 D5 S( H7 n, |* }$ r
<php
# V8 h- r4 u$ G  i$ c. `' Mnamespoc_e Core;
4 A. x+ O4 V9 `, s, F3 P9 [use Admin\Controller as con;
1 _+ E: K+ P, t5 W% B
3 W% A. r* [+ p1 W" t$ N- w; y/ ^include '05ou.php';
  D& \2 n6 {" N# q* g  _6 I" X
new con\AdminController();
. N* h" ?2 L; Z& K& f& u----------------------------------------------------------------------------! [' p5 r. f3 a
05ou.php( b" z% i' G8 W$ G: t8 |
<php
, r& z, E/ Y2 Y: }/ E$ `* B* A; T% Onamespoc_e Admin\Controller;
# ?3 `$ `/ D0 e/ u8 j7 N% ~4 Y3 o, E- d( n5 N" [9 T" D( G' @
clas_s AdminController{4 d& k- a& Q" @) ^
    public functio_n __construct(){7 R2 M) S! x& U( ^  S' [# [! R
        echo __METHOD__,'<br/>';
9 f* K1 Y8 ]& b2 J% O8 X5 t    }# V# z& V! [, V4 A% e% g
}
: i4 q7 i9 R. k% t5 A0 \4 Y1 _----------------------------------------------------------------------------6 s. o4 j; ^3 j% ?! r8 [
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
0 T7 C1 N6 Q+ w1 h/ D
5 a2 x0 @5 j4 x0 |0 g----------------------------------------------------------------------------
8 Z( n; E2 }! N! ?
4 x% a4 [7 `5 }; _1 ]  R8 t7 W04inc.php
/ a7 w! B; R' E<php" H1 `* E# p2 o8 p* O7 F$ u# J
//引入空间成员类9 _5 ^  Y+ k$ Q& p4 i% \/ i

( M& E# w2 _7 q% pnamespoc_e Core;# O0 n5 b0 G( d3 M$ O$ r6 |( U; T3 ]
use Admin\Controller\AdminController;. ?6 H# c8 ]% f
include '05ou.php';
' A. B+ \7 R: S2 A! I
: B1 L6 F6 p( D% B* L6 Unew AdminController();' M+ m5 k- I7 @2 D! L  v
----------------------------------------------------------------------------
1 o. x3 y6 N& H05ou.php
4 X' n( N$ @+ B: Z<php( A+ O9 Y7 N7 ^" I6 u
namespoc_e Admin\Controller;
4 Y4 F$ c" @9 G4 j) N/ d
8 y. G/ b9 y& E+ k9 V$ l) E# Tclas_s AdminController{
0 }, C- Y; }+ r$ \" }    public functio_n __construct(){, p* p2 c, e4 ?# A) f- @% e# P
        echo __METHOD__,'<br/>';
' \3 ^, n+ K/ A( S2 M    }2 L0 ]: |! H# u8 E) D, ~/ I" a4 B
}8 ^3 ?* o$ R1 S& L+ f
----------------------------------------------------------------------------
7 X* G1 Z  a& H  Y  [* g. D+ s  z& T- D5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
9 m& h% T" \! ?0 X3 F0 w+ k
0 n/ v6 i- W8 u8 a3 s( d5 H" `- g  a( N5 \
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。$ l- I1 Q: U7 Y, N  c

7 j( M- v4 Q+ O/ D( b
7 i. F* u7 ^0 k  |$ k: k
: f$ ^: E) y1 J: N5 V: T6 ~3 n( I+ g3 t. F/ t# S% b5 A: [8 d
) Y4 ^7 \4 e- U6 z
$ Y+ l1 Q: g  h' r0 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:26 , Processed in 0.058591 second(s), 22 queries .

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