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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
* H- k' d9 g3 w% ~5 F) Z6 _, W* z# c
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
: d9 |4 B# F) `  m' M  m; J5 Z
5 N4 _6 e3 r+ g" g+ b
* A# V+ b/ j/ g1 G( y* j7 l. q9 q9 S! A5 n$ d) [9 U- y8 L0 D
我们来详细的讲解一下PHP中的命名空间:2 X% O* y7 Y! R6 N' C6 q

7 z+ }& L$ ~3 @$ y( O* v9 `语法:namespac_e 空间名\空间名;/ o) F! X7 `6 T4 {6 F

8 k% g+ E! x% o说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
: O! @& P0 s; N9 K) x: f: Z5 O: \, e& e7 I2 T  W: z
----------------------------------------------------------------------------
( }) S1 \8 \2 [9 B
1 P0 h/ I' ~0 F; J1 Q5 u<php+ s. b2 R% `. E/ |0 t

7 D9 Y& d1 g" _! d( ^namespoc_e AA;: t- S8 ~( p# t4 |' A& l( O! {
functio_n showInfo(){0 |/ ?( M* h1 z
    echo __METHOD__,'<br/>';$ P  l) P) ^; m& S. t5 @3 S
}0 s% ]: {* v$ a
showinfo();' m! J7 U1 H& x, _

! c7 X, ]3 [! P- A  L! _0 L: znamespoc_e AA\BB;
* S. Q$ B; d  w6 e9 _7 J* w7 ^2 |6 T$ h
functio_n showInfo(){
5 |( S' K+ t2 w/ B! l$ F    echo __METHOD__,'<br/>';" Z2 \, ~8 F- [& c9 V. w- s
}* s* L1 @3 v0 S+ A: N8 J1 g' h
//showInfo();
, Z! i# a8 I1 M" H  t3 L6 A----------------------------------------------------------------------------
/ o6 d3 I* @  R0 h8 `2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
- w# Z; F# x( U9 G6 r/ [/ l7 w
+ m2 t; \4 E' ~5 W1 D8 |/ b3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。- @7 ^, l$ N# H% t, U4 ~
) B9 g2 D7 ?% Y' j! V9 [
----------------------------------------------------------------------------
6 U7 z2 m- K# @" k% }, o  T( T' O% m& n: `  b- J" ?) J
<php
1 P* J. T1 y* s1 o' Vnamespoc_e AA\BB;
3 `* Y0 q1 i4 ~/ I- Rfunctio_n showInfo(){, }* ?2 ]8 @% E* w. ~; z
    echo __METHOD__,'<br/>';, p# i0 a  j0 Q2 m* U3 w
}
0 ?+ l/ X0 C; s# k/ H- `2 Unamespoc_e CC;
; j: G! y' n6 ]% Pfunctio_n showInfo(){
5 n' \+ t* ^/ T/ m  r    echo __METHOD__,'<br/>';
6 c; s3 D6 \, p. z- j. g}' v. U; s, v1 [
namespoc_e AA;, X& }7 s" V1 @7 @
functio_n showInfo(){
( i7 n# j1 {" P  @5 ], ~1 z0 t0 b    echo __METHOD__,'<br/>';
2 u) ?  c" u" w8 C# l}
. @& D/ R; I) J: J//非限定访问:用于访问当前空间中的成员
$ G* Z* A; U6 Q" [showInfo();
$ m! `5 S: r  R) M8 g; t2 B//限定访问:只能访问当前所在的空间的子空间中的成员
0 v# X, p$ M/ z  S4 ~BB\showInfo();
. c- Q& W4 P4 |4 ]) ]//完全限定:可以访问其它所有的空间的成员
3 }# U0 [; a) t3 R/ Y\CC\showInfo();
+ t4 `% l( f; ?2 i* q↑根空间标识符
$ M' e4 g; k3 `8 d" f3 ?, R  B----------------------------------------------------------------------------
3 u6 A# F& P, S9 ?3 k但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:7 C' d6 \( y& k0 J) K

1 V! Q) U5 U0 \; n3 C当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)/ G) G5 R9 `9 h+ h- p3 R' N6 n$ E$ f
2 G2 f* {3 U/ L2 t: U" w3 S
代码示例如下:9 D1 X9 i" O) L; s% p
$ ?1 \2 ]0 {' ]1 H% Z& F
----------------------------------------------------------------------------
' J1 j( V, c6 E- d/ K% l5 o$ n- P9 v# T. n6 r3 Y  R. g, V& T
0 h' b, [" A+ C$ J4 m, T
04inc.php3 O. V4 \: j" E# c
<php
  I! Y# r$ b1 T+ g- l2 D# d
, {5 ]# U9 D, H6 Rnamespoc_e Core;
7 j+ ?7 r. `  r% g2 E$ z* J5 h5 X6 B  [include '05ou.php';1 u. o3 d! h6 J0 n! p  r
new \AdminController();# _  v3 q9 y$ B7 X. Z, \7 I
showInfo();
% m; t$ z2 \; |0 T7 Y% o
* w" h* \6 z; X; x; cecho P;& X& k+ Q5 _) L" P% S1 ?
//根空间中的成员,只要类的访问必须加‘/’
- d/ u  q' b, E----------------------------------------------------------------------------" V9 ^1 F5 O' {/ Y4 T7 s

5 }, u8 T9 T; K4 O; H8 Q% m$ f+ D05ou.php/ d6 U6 Y7 B+ [: _1 o4 T3 F3 B
<php
) T* ?/ ]4 V3 fconst P=5;: b0 ^  C/ k# s4 n
; g7 K& J5 V2 ?4 P
functio_n showinfo(){
4 e6 j7 B' `: ~    echo __METHOD__,'<br/>';
: G: {9 E5 l5 C! m}
/ ^1 \$ K% @5 _$ [3 w! l
8 D# \( F2 r2 P4 ^0 Pclas_s AdminController{$ P0 b& D' H; O. M% z
    public functio_n __construct(){
2 s; P' u! |1 F2 c7 D( j5 ^' H        echo __METHOD__,'<br/>';
2 \2 D! O& W, _* |    }
0 v* d6 M. C/ L; K# ]& u2 c}* Y7 c- M/ x6 g( ^

3 k) r8 ~: B" i) q+ R$ _! i  Q第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
- G/ g) |/ j1 Z  d, r  y----------------------------------------------------------------------------
5 |( b3 D; O% A8 O" U! i% x; K04inc.php7 B* }/ F7 @" {7 l+ ]( c1 `. I
<php! y; W2 y9 l. t/ F! L2 b
0 P8 Y; Z( H& |! A. d; l0 w+ l
namespoc_e Core;
. ?/ ?( h) k$ E7 \& Q; U: Qinclude '05ou.php';
" I+ D/ G% v7 i/ rfunctio_n showinfo(){
0 t, D" ]2 V5 N$ X$ C5 _; V% F    echo __METHOD__,'<br/>';& ]! P' P: r: `. Y; p7 |* f, T
}0 u7 n: z- m) h9 _$ h) @4 a

0 o5 D0 R) ^* u7 M% y' p, rnew \Controller\AdminController;
6 d. _  j* Y; j* C- d$ L0 V----------------------------------------------------------------------------8 o+ R+ Y7 Q" X  K
05ou.php1 e" ~$ K& M( ^6 n$ W  B
<php: l% h8 L1 D, U& T) z5 A: B: M
namespoc_e Controller;
; C# j+ B$ b3 p0 u2 w! Q% R
6 ?: i: I. K; r# S9 i) K* K4 d2 u8 Bclas_s AdminController{
4 q" H7 h, K% g, i6 a2 r9 W8 j) G        public functio_n __construct(){
  G  l& Q; S) R5 S# K2 M+ @                echo __METHOD__,'<br/>';  k+ f( P4 A, z$ R
    }8 _9 f, ~" e1 m4 }& C' M. G, a
}5 j! w& H- X! g/ ]* q+ N
----------------------------------------------------------------------------7 B7 L% A& b6 k+ e
; [- y; W- d. F3 g9 u6 w, q& G/ w
4.引入空间成员:
  B8 b5 b& c. g' g" ~
, Z5 f* c- d+ F- @) h1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
, Q9 ?) C* C" Y1 r- k1 m+ l
/ f1 {$ Q. v, v9 |* W4 j9 @4 K1 ^9 k----------------------------------------------------------------------------' V: H1 O! q. T6 a
  w% O( }! ]( u: h
04inc.php) ]6 ?4 f4 V( q! \
<php
! @4 a" u( {* e9 {" U) @namespoc_e Core;
* N- N% o! O5 ?7 fuse Admin\Controller as con;
- l. I& k8 |' k5 A$ b6 x' a' @" J; h# ?0 x2 ~
include '05ou.php';
+ v. l, _: Z4 [2 w- ~
7 o4 s5 C4 V% cnew con\AdminController();
' l/ _6 I( ^; g----------------------------------------------------------------------------
2 }$ ]+ Q6 L  N$ m05ou.php
! J6 z+ S5 I  n' I<php
3 ?: \& }. L& mnamespoc_e Admin\Controller;1 Y$ ]: t. ^  m" j4 R
7 J/ I% I. z, q* B1 G" C
clas_s AdminController{8 d! I9 o# P. E
    public functio_n __construct(){! |0 A6 K* [' g$ L, v. F
        echo __METHOD__,'<br/>';
* j+ c, X6 x* o4 N# G8 N+ n. x    }: u' c8 Q/ k: o* `9 u# g4 a
}
8 T: W, M: q9 u- q- g----------------------------------------------------------------------------0 _) W; {  X1 ]# Y  I9 r3 m" x& q
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
6 V% @: N' e  n/ i$ x, H6 h6 A, g3 A6 x7 k$ {
----------------------------------------------------------------------------1 W! J& X, k" Y5 D% Y
; Q" y9 n- Q: g9 \  ?* K$ I
04inc.php
) Z% I, X# `8 Q% H' B<php
, X, [! X; [  F//引入空间成员类
0 J5 A$ f+ `6 J1 [7 g: P2 f% t/ u( w+ z7 g# o' y) T
namespoc_e Core;
4 n' N' U# q& p3 m3 E' X2 _4 Ause Admin\Controller\AdminController;
  p" l. B" T( `* F, winclude '05ou.php';
, D4 s6 q; g+ |/ w5 Y# E
- {( \1 b4 E+ v1 tnew AdminController();  B  V# L+ E9 u9 q7 K! j7 Q+ }9 h
----------------------------------------------------------------------------
) s$ U8 |7 _0 V* X- Y# S* b05ou.php3 q$ g& q  c1 B5 t8 B* y
<php- B; F7 H# `/ h8 i8 \: X0 w( h
namespoc_e Admin\Controller;
9 B* i* M7 d5 r" `, r1 K2 F. X/ }/ y. s5 V. m4 x- \# N& ^
clas_s AdminController{
9 o7 G7 v9 U+ c' k( g  [% u    public functio_n __construct(){3 n* A5 v6 O" ~# e( a* [* e
        echo __METHOD__,'<br/>';9 ~; b+ D+ {; Y, C" N' W) y* G* w
    }$ l8 Y7 T1 K( k, \/ E- b7 e
}$ C4 D7 _5 w) W* l* q" B
----------------------------------------------------------------------------
, H( m; E( l7 \- J" V5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。* I2 _1 ?5 f- v, R
) w. Q$ f0 q/ \0 b3 T5 e4 A

) z! R. K7 o( ]5 A3 }这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。' ^9 y' r3 U2 v& \% [

/ r2 B# n2 q# d& h/ `. ~5 z. _! o/ Z6 {
8 p: w' B0 d) ~% _. w& Q

2 w- k) f. j3 u2 ^5 r
1 c3 X: a; q# Y9 E/ H: N$ Z( s2 r4 E. z4 k1 z% q+ l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 13:04 , Processed in 0.059567 second(s), 23 queries .

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