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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:. `5 z, V9 O5 P# f

7 k  b; d1 T7 ^在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
" q& l- r' B4 U3 `
9 H- P0 a" ?9 g: t2 `9 q! F ) p& [" r) F6 N: \) D6 V& Z4 T# r
7 P+ D6 t+ g0 c
我们来详细的讲解一下PHP中的命名空间:4 v- b9 x( U. C3 S0 E# r7 E/ H
: u4 A/ i$ O) J( X
语法:namespac_e 空间名\空间名;9 H- b/ Z1 R7 K" ?  h  ?
: U" U6 l! k. _. G
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
2 o/ i- i! }' w
% r. o4 I: V+ p% t  S# B----------------------------------------------------------------------------
) A' z, L  w5 T- m% y% m) m( O9 ^
, e' T: Z) R3 i! \& k. o<php0 c  T- ~* F; W, E
1 F) O: N: [/ _5 W! D
namespoc_e AA;3 Y7 {+ A! m. g$ _
functio_n showInfo(){
2 {" \1 ]6 h# q! B  F1 ]    echo __METHOD__,'<br/>';; F- s# _3 B, H1 f1 P
}  A: V. \. l  n- u  |3 U& O+ w& k
showinfo();
3 C2 g/ Q- y  K4 q; k0 [! m$ k) x' Q) \5 B+ o1 [) q
namespoc_e AA\BB;6 Y( c: m5 s( l2 B: q5 L: q+ R6 q

- j% G, ?  c) `/ C" Pfunctio_n showInfo(){8 {8 i8 d0 b* l' Z9 y* N$ ?
    echo __METHOD__,'<br/>';( b6 e6 r1 v2 B$ F: [
}, t9 k# K6 i9 z  A
//showInfo();
: P1 Q5 l' h; b& q& N1 ?8 G  o----------------------------------------------------------------------------
, Y& B  H# J( J& W0 M- Z. x2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)+ T" w  K- X* r3 ]6 K; s. e) \' g
8 w6 n( v4 D; U2 B6 K4 y
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
, v4 u. o4 q2 I+ e" Q9 w! K+ j4 ?2 ]3 r
----------------------------------------------------------------------------! {. s3 q! N# V2 C3 S
- g' h7 l! \, |& o6 P& H, v
<php
$ i8 E- u" l6 ?namespoc_e AA\BB;
- @. D/ i* V& f5 Jfunctio_n showInfo(){: {% `1 c: L0 \. S6 k
    echo __METHOD__,'<br/>';
( A. F0 s( n! E( z* l4 ]}
: a8 \+ b1 M" s: }% Fnamespoc_e CC;- g3 g& y* s8 s/ V9 n/ J
functio_n showInfo(){7 f$ w0 d5 z7 N0 b, n# f* j
    echo __METHOD__,'<br/>';& M+ `6 j% W9 o) N$ S
}; H5 a2 z. n3 q9 e  Y
namespoc_e AA;' z, Q/ Z! C9 L# M3 J% ^* B* r
functio_n showInfo(){
2 M: {! |+ P8 p$ I  V$ ^9 ~    echo __METHOD__,'<br/>';
, I8 ]9 O5 z9 ^2 l}$ e6 s+ E( u0 N$ F4 ~6 Q
//非限定访问:用于访问当前空间中的成员5 F5 B, O9 y% ?' S3 _
showInfo();
( ?" ]$ P# ]9 R, O4 f//限定访问:只能访问当前所在的空间的子空间中的成员
. n6 n% y/ g- k$ g. U( `0 D, rBB\showInfo();
5 Z( r2 N0 M; {0 r# ]' R7 Z//完全限定:可以访问其它所有的空间的成员5 H6 l+ O& W2 d
\CC\showInfo();
* o* A, i2 w' i↑根空间标识符& _2 n7 l, B9 d' Z/ j
----------------------------------------------------------------------------4 W$ J+ c" h5 Z2 Z/ p' F
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
8 p* i" a( a0 M' L# b
, s$ o7 ]) R) X( T+ O7 ]* G当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
! q- J" b7 h+ N4 _5 E' B# Q! a% g$ M/ P& I- Z' s
代码示例如下:
4 v( E% Q' g& k) ?9 L, a: j( u% S  u: u# P# N  _! X
----------------------------------------------------------------------------
+ M) c! v. H! t2 n2 g. p
- {( ?% |' v5 O. U5 g1 j% t  [5 N* e, h' i( P+ [' `
04inc.php+ A! P3 q+ N7 _8 {, w
<php+ ?$ o% M6 X( s+ Y
4 \/ i! C0 O( c! b# f  [
namespoc_e Core;2 j+ ~/ s0 g/ N1 ?  L! Z# n5 j
include '05ou.php';
1 H: a) f% O4 D- O: Onew \AdminController();
" ^- B4 C4 y; v+ L* U, i2 K: LshowInfo();
  S/ K. |' C; b/ \- M9 Q( }6 L* o/ @6 |; L8 M6 M7 g
echo P;
' r) K- |: S* i1 f7 J//根空间中的成员,只要类的访问必须加‘/’
, |( n& V3 |  e" p0 p----------------------------------------------------------------------------
  Z3 W& L4 X1 ^6 V" c& ~0 j6 P% B5 `* S+ V9 n
05ou.php% |  ?$ u, R# E( U- U! I5 _
<php
5 F( U' `+ F1 Q1 C0 m& oconst P=5;
! a" |2 b- X( _3 c8 `* p( [( E" `$ V# [% U3 z
functio_n showinfo(){
' K2 L; \2 U! V0 b3 p% S    echo __METHOD__,'<br/>';
# O% K. P- U$ R4 N}- f  {* X3 S2 R2 Y2 |

; B. |" h; j' z- H  N1 Z( uclas_s AdminController{
  M' @0 X4 c+ Z" @    public functio_n __construct(){
- F& }& J. ?! a5 e        echo __METHOD__,'<br/>';
8 j' r4 |  K  w, F! Y5 H, S    }
9 l# \" A( r6 s) q}: R  {2 I$ D& G& ~% A2 h9 `$ D$ l
  Z( `  E6 j5 t. \$ Y9 H
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
( O3 c4 g9 ~* F) E2 e7 ?----------------------------------------------------------------------------
1 \; r* F6 R3 p; e1 u, F04inc.php+ w+ ?0 a" b% O0 Q2 n
<php
9 Z( S3 H1 Z. d5 J/ I
2 P$ u; I" @4 L; k! wnamespoc_e Core;/ y- b; n' ^! G9 J0 y3 ~+ `3 B+ `
include '05ou.php';- ?. C" {# H/ Y- n+ |7 A* R
functio_n showinfo(){
$ b: T# h* ?" T* @; J8 ]2 k    echo __METHOD__,'<br/>';
% X' T$ t  U5 O; d& w}
' X- u' v0 y* c1 `
6 ]/ O$ I) x" P2 j, J; Unew \Controller\AdminController;
% ]& w& d8 h- a# }: v: _+ f----------------------------------------------------------------------------
) N  L; y6 W; x- j05ou.php: U6 ?  n. ?  s) Q
<php
( Y5 F- [0 z* snamespoc_e Controller;: J, }) R/ b. E8 y- W  x% F
: f+ s- G" k+ {# ?3 A
clas_s AdminController{8 N* R' [& p: h. c
        public functio_n __construct(){
  a+ R& p, ?1 A/ a3 f" D8 ]                echo __METHOD__,'<br/>';
: ]' P; ^+ Z7 h0 U/ I& r6 `    }" E' V- \+ u1 y
}7 F: E+ I) U# n+ P% t5 G
----------------------------------------------------------------------------
* J# b: I0 r4 g8 ?) J- L1 {6 y' ^5 w4 Z) B: d' _6 i! `0 a) r" ~
4.引入空间成员:+ [& ?3 v4 \! W; o% @& Q$ j. W$ ^

/ N2 `# M: ^0 S$ Q+ d1 V4 n, f: n% \1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。& g$ a; Z; w. B$ q( G3 q
$ E7 A4 ^, \. \9 o& i* Y& S+ Q
----------------------------------------------------------------------------, C( j1 I+ [, y8 t2 d" M. D

6 a% A* V- e+ E, u04inc.php
2 y7 G, F) r" ]# ?4 e<php
+ V1 |$ _4 R$ k+ R- b# `0 znamespoc_e Core;- l, q9 A7 s1 @1 C$ o( X/ w
use Admin\Controller as con;
0 b8 O. l0 C0 K+ k0 @! D
9 P( O+ A8 l% F" ~9 Z" @$ h, Linclude '05ou.php';5 d2 I/ ?' o) h* u: K5 H: {2 `
0 X, W, {, r3 h5 A' D+ S
new con\AdminController();
8 O; s. ^- a$ V6 Z& i----------------------------------------------------------------------------
) y" x1 B7 v% @8 f9 @# J05ou.php" H  I. A/ k! T6 N
<php: G6 M5 g( q! e& g4 T# w! K
namespoc_e Admin\Controller;2 @: [) m- @( S; Z2 D) e
/ F& t! l' m8 c" a
clas_s AdminController{
5 G/ [, F6 R9 }& _/ X8 e7 V4 a# U    public functio_n __construct(){
, S1 Y: V) P) T        echo __METHOD__,'<br/>';
. u" Y6 \( U7 n% A- y8 u    }- M# q4 D: S) l  j- C) H, v0 X
}
) c; t+ |; U6 r& e8 N) ^8 Y3 k----------------------------------------------------------------------------+ z, c. e( q' b; C% a9 I
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。: F& G  ?; ?8 _6 [* v
! U2 T& |3 h" R1 y
----------------------------------------------------------------------------9 k6 x0 x* \  ?3 x
4 x. N% X; q+ c7 r
04inc.php6 B. ], m" H$ E$ p9 M' J- r
<php
' B& Y, J4 K. j0 G! O//引入空间成员类
* V/ {/ c/ x  K( w+ n' v. L: w' g  k
namespoc_e Core;$ s1 R/ \& z: L% g7 d7 r" y
use Admin\Controller\AdminController;
2 y$ E& C7 e$ S$ W; C: i2 oinclude '05ou.php';
' {/ [+ l- j& y8 w, \) @) ^1 y1 v/ K
new AdminController();. X( C8 n' K4 L) \
----------------------------------------------------------------------------
- v* z/ s( J' Y05ou.php/ Y* z5 G# f) `' S/ Z
<php$ [! E  P" Y, w/ x) y
namespoc_e Admin\Controller;
& W4 d, N3 \* S0 e$ n  b
* ~# s+ C" M4 G" Z9 D. _clas_s AdminController{
; m/ }  l5 A( R; q- e8 ^# v    public functio_n __construct(){
( _" ]: K- l+ o+ ?6 \1 u        echo __METHOD__,'<br/>';
; @5 c! o! n9 a% D( m- d* f8 x    }, Z' s4 O4 T- @: Y/ e6 G
}8 n7 q% c, a% F" L6 D, Z) z
----------------------------------------------------------------------------& l# w  |7 B( H) ~- I( T/ c  X
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
3 g7 C9 k/ ?$ c. Q$ ?% X% m& e3 d4 Q+ W
& H- l, |- C& I9 Q% ?7 o9 p* N
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
+ F' s4 a7 n0 j9 o; Q: z" F; |9 Q6 J) B

4 `2 b; r/ z* ~- v" N- o7 Y0 a8 A) Q% y& Q) k

7 A7 q  s/ |) }- |
% e8 q; d: ?0 [+ g# j  q
3 u" x" r8 F+ H, y9 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-28 17:21 , Processed in 0.136302 second(s), 24 queries .

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